iPhone上的BGRA glTexImage2D和glReadPixels
问题描述:
查看文档,我应该能够使用BGRA作为纹理的内部格式。我用BGRA数据提供纹理(对于glRenderbufferStorage使用GL_RGBA8_OES,因为它似乎不允许使用BGRA)。但是,以下不工作:iPhone上的BGRA glTexImage2D和glReadPixels
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的相机。
答
glTexImage2D()
的第三个参数是纹理中的颜色分量的数量,而不是纹理的像素排序。您想在此处使用GL_RGBA
,否则它将无法工作。
我不相信GL_BGRA
支持iOS设备上的glReadPixels()
作为颜色格式。虽然苹果公司在处理视频图像帧时推荐使用BGRA格式的纹理像素数据,但我认为在阅读RGBA格式的文件并将其编码到磁盘时是正常的,正如您在其他地方所描述的那样。
如果你想看到一个在BGRA中使用相机视频帧的示例项目,将它们发送到纹理,使用着色器处理它们,然后读取返回的结果像素,可以检查我制作的here。
谢谢。这就是我一直在做的事情。问题在于,在屏幕上进行传输时,它被倒置了。我只是在最后的着色器中进行了渲染,并且工作正常。我只是想避免任何额外的通行证,因为我的帧速率已经在痛苦中:) – akaru 2011-02-25 23:49:38