2012-04-11 47 views
1

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

图像的返回部分是正确的。它显示了我的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组论坛上搜索,但我没有得到一个解决方案(和我没有找到具有相同的错误描述的情况下)。

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

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

问候, krikit

+2

作为一个建议,你可以尝试使用我的框架:https://github.com/BradLarson/GPUImage已经有基于OpenGL ES 2.0着色器工作Sobel边缘检测的实现。它的手动调整速度比你在这里找到的库存执行速度快20倍。 – 2012-04-16 20:17:29

+0

嗨布拉德,我会尝试你的框架,感谢您的链接位置。 – retinotop 2012-08-09 11:26:39

回答

1

我已经解决了这个问题。该错误发生在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_UNSIGNED_BYTE,pictureDest); 当我使用GLuint变量而不是铸造元素时,一切正常。

krikit

相关问题