2011-02-23 101 views
1

查看文档,我应该能够使用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的相机。

回答

5

glTexImage2D()的第三个参数是纹理中的颜色分量的数量,而不是纹理的像素排序。您想在此处使用GL_RGBA,否则它将无法工作。

我不相信GL_BGRA支持iOS设备上的glReadPixels()作为颜色格式。虽然苹果公司在处理视频图像帧时推荐使用BGRA格式的纹理像素数据,但我认为在阅读RGBA格式的文件并将其编码到磁盘时是正常的,正如您在其他地方所描述的那样。

如果你想看到一个在BGRA中使用相机视频帧的示例项目,将它们发送到纹理,使用着色器处理它们,然后读取返回的结果像素,可以检查我制作的here

+0

谢谢。这就是我一直在做的事情。问题在于,在屏幕上进行传输时,它被倒置了。我只是在最后的着色器中进行了渲染,并且工作正常。我只是想避免任何额外的通行证,因为我的帧速率已经在痛苦中:) – akaru 2011-02-25 23:49:38

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); 

看到这个here的苹果分机。 关于这个问题的很好的讨论here