如何将QImage格式转换为OpenGL支持的格式

时间:2011-07-16 19:36:46

标签: c++ qt opengl qt4

我正在使用QImage加载图像,然后在OpenGL中用作纹理。 问题是颜色组件在QImage和OpenGL中的顺序不同。 目前我在OpenGL中使用GL_RGBA格式,在Qt中使用QImage::Format_ARGB32。 因此,在OpenGL中创建纹理之前,我必须为加载图像的每个像素手动交换字节。此外,要正确交换字节,我需要知道机器的字节顺序。

有谁知道更好的解决方案吗?至少,有没有办法让这种转换与字节顺序无关?

感谢。

1 个答案:

答案 0 :(得分:5)

glTex(Sub)Image的最后三个参数定义了pixel transfer to OpenGL的发生方式。如果你有4个8位值,顺序,按照ARGB顺序,那么我会建议如下:

glTexImage2D(..., GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, *);

要处理字节序转换问题,请使用glPixelStore参数。具体来说,GL_UNPACK_SWAP_BYTES。以上是针对little-endian机器设计的,所以如果你在big-endian机器上,你应该在调用这个函数之前调用glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_TRUE);,然后再将它设置回GL_FALSE


注意:我知道你没有提到它,但是如果你正在考虑移动平台,请记住OpenGL ES OpenGL。 Desktop OpenGL要求实现能够在传输操作中处理各种像素排列。 GL ES几乎完全相反。像素传输格式必须完全匹配纹理的内部格式。因此,如果您正在进行GL ES开发,则必须自行进行字节交换。