1

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

4

2 回答 2

5

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

我不相信iOS 设备GL_BGRA支持glReadPixels()作为颜色格式。虽然 Apple 建议在处理视频图像帧时以 BGRA 格式向纹理提供像素数据,但我认为您可以将其以 RGBA 格式读回然后将其编码到磁盘,正如您在其他地方所描述的那样。

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

于 2011-02-25T19:31:31.227 回答
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);

在这里查看苹果分机。在这里很好地讨论了这个问题

于 2013-06-15T03:28:01.070 回答