iPhone上的BGRA glTexImage2D和glReadPixels

查看文档,我应该可以使用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的相机。     
已邀请:
glTexImage2D()
的第三个参数是纹理中的颜色分量数,而不是纹理的像素顺序。你想在这里使用
GL_RGBA
,否则就行不通。 我不相信iOS设备上的
glReadPixels()
支持
GL_BGRA
作为彩色格式。虽然Apple在处理视频图像帧时建议以BGRA格式向纹理提供像素数据,但我认为您可以用RGBA格式读取然后将其编码到磁盘,就像您在其他地方所描述的那样。 如果你想看一个在BGRA中拍摄相机视频帧的示例项目,将它们发送到纹理,使用着色器处理它们,然后再读取结果像素,你可以查看我在这里构建的像素。     
我自己寻找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 ext。 这里讨论这个问题很好     

要回复问题请先登录注册