BGRA在iPhone上的glTexImage2D和glReadPixels

时间:2011-02-23 04:01:58

标签: iphone camera avfoundation opengl-es-2.0 color-space

查看文档,我应该能够将BGRA用于纹理的内部格式。我正在为纹理提供BGRA数据(使用GL_RGBA8_OES用于glRenderbufferStorage,因为它似乎不允许BGRA)。但是,以下内容不起作用:

glTexImage2D(GL_TEXTURE_2D, 0, **GL_BGRA**, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
...
glReadPixels(0, 0, w,h, GL_BGRA, GL_UNSIGNED_BYTE,buffer, 0);

虽然这给了我一个黑框:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
...
glReadPixels(0, 0, w,h, **GL_BGRA**, GL_UNSIGNED_BYTE,buffer, 0);

这确实有效,但蓝调/红色被反转(我向纹理提供BGRA数据):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
...
glReadPixels(0, 0, w,h, **GL_RGBA**, GL_UNSIGNED_BYTE,buffer, 0);

...为什么我不能一直使用BGRA?我注意到glRenderbufferStorage似乎不接受任何BGRA格式......我真的很困惑。 BGRA是我的数据中唯一合适的格式,因为它来自iphone的相机。

2 个答案:

答案 0 :(得分:5)

glTexImage2D()的第三个参数是纹理中的颜色分量数,而不是纹理的像素顺序。你想在这里使用GL_RGBA,否则就行不通。

我认为iOS设备上的GL_BGRA不支持glReadPixels()作为颜色格式。虽然Apple在处理视频图像帧时建议以BGRA格式向纹理提供像素数据,但我认为你可以用RGBA格式读取然后将其编码到磁盘,就像你在别处描述的那样。

如果你想看一个在BGRA中拍摄相机视频帧的示例项目,将它们发送到纹理,使用着色器处理它们,然后再读取结果像素,你可以查看我构建的那个{{3} }。

答案 1 :(得分:0)

我自己寻找OpenGL ES2表明这适用于iOS下的BGRA little endian原生格式。这里“像素”指向32位BGRA的缓冲区,它来自CGBitmapContextCreate()或从CGImageRef中获取图像数据。

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);

请参阅apple \ text here。 很好地讨论了这个问题here