【发布时间】:2011-02-10 14:58:34
【问题描述】:
我正在为 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 优先”顺序时。
作为第二个问题,我还了解到大多数显卡的“原生”格式是 GL_BGRA,因此以该格式创建纹理可以加快纹理绘制速度。纹理绘制的速度比加载纹理的速度更重要,因此预先将数据“混合”为 BGRA 格式是值得的。我尝试通过指定 GL_RGBA 的“内部格式”来让 OpenGL 创建 BGRA 纹理,但这会导致图像完全变黑。我对文档的解释使我期望 glTexImage2D 会在读取数据时对数据进行字节交换,如果源格式和内部格式不同,但是当我尝试指定“内部格式”时,我得到一个 OpenGL 错误 0x500 (GL_INVALID_ENUM) GL_RGBA。我错过了什么?
【问题讨论】:
标签: opengl jpeg loading nsimage argb