Objective c iOS上的OpenGL ES-glReadPixels()返回侧面带有黑色条的图像

Objective c iOS上的OpenGL ES-glReadPixels()返回侧面带有黑色条的图像,objective-c,ios,opengl-es-2.0,glreadpixels,Objective C,Ios,Opengl Es 2.0,Glreadpixels,我喜欢使用片段着色器将简单纹理渲染为4个顶点,并使用glReadPixels读取图像分辨率。我将(readPixel)的大小设置为(源)图片的大小,但没有得到完整的图片。右边总是有一个黑条。图像似乎被压缩了 返回的图像部分是正确的。它显示了我的sobel着色器的分辨率。所以我认为ReadPixel部分或SetImage部分没有错误。但我不知道 下面是我设置图像源的方法: -(void)setImageSource : (unsigned char*) image { static const G

我喜欢使用片段着色器将简单纹理渲染为4个顶点,并使用glReadPixels读取图像分辨率。我将(readPixel)的大小设置为(源)图片的大小,但没有得到完整的图片。右边总是有一个黑条。图像似乎被压缩了

返回的图像部分是正确的。它显示了我的sobel着色器的分辨率。所以我认为ReadPixel部分或SetImage部分没有错误。但我不知道

下面是我设置图像源的方法:

-(void)setImageSource : (unsigned char*) image
{
static const GLfloat textureVertices[] = 
{
    0.0f, 1.0f,
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,
};

static const GLfloat squareVertices[] = 
{
    -1.0f, -1.0f,
    1.0f, -1.0f,
    -1.0f, 1.0f,
    1.0f, 1.0f
};

glGenTextures(1, &pictureTexture);
glActiveTexture(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, pictureTexture);

glUniform1i(uniforms[UNIFORM_VIDEOFRAME], 0);

glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_FLOAT, 0, 0, textureVertices);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageHeight, imageWidth, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
}
下面是要渲染纹理的部分:

-(void)render
{
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glViewport(0, 0, imageHeight, imageWidth);

    [self presentFramebuffer];
}
下面是回顾决议的部分:

-(void)readPixels : (unsigned char*) dest
{            
    glReadPixels(0, 0, imageHeight, imageWidth, GL_RGBA, GL_UNSIGNED_BYTE, dest);

    glDeleteTextures(1, &pictureTexture);
}
我不知道我在哪里出错。我在这个论坛和khronos group论坛上搜索过,但没有找到解决方案(也没有找到具有相同错误描述的案例)

可能是另一个重要或令人困惑的信息——我也尝试将代码放到C++类中。但是当我用EagleContext离开Objective C类时,我得到了正确的图片大小,但分辨率是错误的。分辨率图像只包含雪,但侧面没有黑条

有人知道这个错误的解决方案吗

问候,,
克里基特

我已经解决了这个问题。错误发生在OpenGL ES视图的初始化中。我为initWithFrame创建矩形的部分

CGRectMake(0.0f, 0.0f, applicationFrame.size.width, applicationFrame.size.height)
有错误的大小,当我自己设置的大小,我得到了一个完整的图片在目的地

渲染图片上有雪的另一部分来自错误的数据类型。当我将一个变量强制转换为GLuint时,它是不同的,然后初始化一个新的GLuint变量并用值设置它。。。但我不知道为什么

unsigned int j = 20
GLuint i = 20;
glReadPixels(0,0,j,(GLuint)j,GL_RGBA,GL_无符号字节,pictureDest); 当我使用GLuint变量而不是casted元素时,一切都很好


克里基特

我已经解决了这个问题。错误发生在OpenGL ES视图的初始化中。我为initWithFrame创建矩形的部分

CGRectMake(0.0f, 0.0f, applicationFrame.size.width, applicationFrame.size.height)
有错误的大小,当我自己设置的大小,我得到了一个完整的图片在目的地

渲染图片上有雪的另一部分来自错误的数据类型。当我将一个变量强制转换为GLuint时,它是不同的,然后初始化一个新的GLuint变量并用值设置它。。。但我不知道为什么

unsigned int j = 20
GLuint i = 20;
glReadPixels(0,0,j,(GLuint)j,GL_RGBA,GL_无符号字节,pictureDest); 当我使用GLuint变量而不是casted元素时,一切都很好


krikit

作为建议,您可以尝试使用我的框架:它已经有了一个基于OpenGL ES 2.0着色器的Sobel边缘检测实现。它经过手动调整,比您将在那里找到的常用实现快约20倍。嗨,Brad,我将尝试您的框架,感谢您的链接位置。作为建议,您可以尝试使用我的框架:该框架已经有一个基于OpenGL ES 2.0着色器的工作Sobel边缘检测实现。它经过手动调整,比您将在那里找到的股票实现快约20倍。嗨,Brad,我将尝试您的框架,感谢您的链接位置。