我喜欢用我的片段着色器渲染一个简单的纹理到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
作为一个建议,你可以尝试使用我的框架:https://github.com/BradLarson/GPUImage已经有基于OpenGL ES 2.0着色器工作Sobel边缘检测的实现。它的手动调整速度比你在这里找到的库存执行速度快20倍。 – 2012-04-16 20:17:29
嗨布拉德,我会尝试你的框架,感谢您的链接位置。 – retinotop 2012-08-09 11:26:39