如何从ARGB NSImage加载OpenGL纹理而不会产生混乱?

问题描述 投票:2回答:4

我正在为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并加载...

opengl jpeg loading nsimage argb
4个回答
4
投票

我不知道将ARGB数据直接加载到纹理中的方法,但是有一个更好的解决方法,而不是仅在CPU上进行麻烦。您可以改为在GPU上非常有效地执行此操作:


1
投票

您正在使用OpenGL渲染它,对吗?如果您想以简单的方式进行操作,则可以让像素着色器实时调整颜色。对于图形卡来说,这根本没有问题,因为它们可以做一些更复杂的事情:)。


1
投票

这个问题很旧,但是如果有人在寻找这个问题,我找到了一个不是严格安全但有效的


0
投票

其数据为ARGB格式的纹理的名称。

© www.soinside.com 2019 - 2024. All rights reserved.