如何从ARGB NSImage加载OpenGL纹理而不进行调整?
我正在为Mac OS> = 10.6编写一个应用程序,它可以从磁盘加载的图像创建OpenGL纹理。
首先,我将图像加载到NSImage中。然后我从图像中获取NSBitmapImageRep并使用glTexImage2D将像素数据加载到纹理中。
对于RGB或RGBA图像,它可以完美地工作。我可以传入3个字节/像素的RGB或4个字节的RGBA,并创建一个4字节/像素的RGBA纹理。
但是,我刚给测试人员发送了一张JPEG图像(在佳能EOS 50D上拍摄,不知道它是如何导入的)似乎有ARGB字节排序。
我在这个帖子上发了一篇文章:(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。我错过了什么?
没有找到相关结果
已邀请:
3 个回复
田眯衅
懊毁暗
如果您不了解着色器,请在此处阅读此内容:http://www.lighthouse3d.com/opengl/glsl/
傻寺俊擒