我正在为 Mac OS >= 10.6 编写一个应用程序,它从磁盘加载的图像创建 OpenGL 纹理。
首先,我将图像加载到 NSImage 中。然后我从图像中获取 NSBitmapImageRep 并使用 glTexImage2D 将像素数据加载到纹理中。
对于 RGB 或 RGBA 图像,它可以完美运行。我可以传入 3 字节/像素的 RGB 或 4 字节的 RGBA,并创建一个 4 字节/像素的 RGBA 纹理。
然而,我刚刚让一个测试员给我发了一张似乎有 ARGB 字节顺序的 JPEG 图像(在佳能 EOS 50D 上拍摄,不确定它是如何导入的)。
我在这个线程上找到了一个帖子:(http://www.cocoabuilder.com/archive/cocoa/12782-coregraphics-over-opengl.html)这表明我将GL_BGRA的格式参数指定为glTexImage2D,并且类型为GL_UNSIGNED_INT_8_8_8_8_REV。
这似乎合乎逻辑,并且似乎应该有效,但事实并非如此。我得到不同但仍然错误的颜色值。
我编写了“swizzling”(手动字节交换)代码,将 ARGB 图像数据洗牌到一个新的 RGBA 缓冲区中,但是这种逐字节的混合对于大图像来说会很慢。
我也想了解如何使这项工作“以正确的方式”。
将 ARGB 数据加载到 RGBA OpenGL 纹理中的技巧是什么?
我当前对 xxx 的调用如下所示:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, format, GL_UNSIGNED_BYTE, pixelBuffer);
其中是 RGB 或 RGBA。
我尝试使用:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
当我的图像代表报告它是“alpha first”顺序时。
作为第二个问题,我还读到大多数显卡的“本机”格式是 GL_BGRA,因此以该格式创建纹理会导致更快的纹理绘制。纹理绘制的速度比加载纹理的速度更重要,因此预先将数据“混合”为 BGRA 格式是值得的。我尝试通过指定 GL_RGBA 的“内部格式”来要求 OpenGL 创建 BGRA 纹理,但这会导致图像完全变黑。我对文档的解释使我期望 glTexImage2D 会在读取数据时对数据进行字节交换,如果源格式和内部格式不同,但是当我尝试指定“内部格式”时,我得到一个 OpenGL 错误 0x500 (GL_INVALID_ENUM) GL_RGBA。我错过了什么?