我正在为Mac OS> = 10.6编写一个应用程序,该应用程序将从磁盘加载的图像中创建OpenGL纹理。
首先,我将图像加载到NSImage中。然后,我从图像中获取NSBitmapImageRep并使用glTexImage2D将像素数据加载到纹理中。
对于RGB或RGBA图像,效果很好。我可以传入3个字节/像素的RGB或4个字节的RGBA,然后创建一个4字节/像素的RGBA纹理。
但是,我只是让测试人员向我发送了一张似乎具有ARGB字节顺序的JPEG图像(在Canon 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格式将是值得的。我试图让OpenGL通过指定GL_RGBA的“内部格式”来创建BGRA纹理,但这会导致图像全黑。我对文档的解释使我期望,如果源格式和内部格式不同,则glTexImage2D将在读取数据时按字节交换数据,但是当我尝试指定以下内容时,却收到OpenGL错误0x500(GL_INVALID_ENUM) GL_RGBA。我想念什么?
我正在为Mac OS> = 10.6编写一个应用程序,该应用程序从磁盘加载的图像创建OpenGL纹理。首先,我将图像加载到NSImage中。然后我从图像中获取NSBitmapImageRep并加载...
我不知道将ARGB数据直接加载到纹理中的方法,但是有一个更好的解决方法,而不是仅在CPU上进行麻烦。您可以改为在GPU上非常有效地执行此操作:
您正在使用OpenGL渲染它,对吗?如果您想以简单的方式进行操作,则可以让像素着色器实时调整颜色。对于图形卡来说,这根本没有问题,因为它们可以做一些更复杂的事情:)。
这个问题很旧,但是如果有人在寻找这个问题,我找到了一个不是严格安全但有效的
其数据为ARGB格式的纹理的名称。