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

Ole*_*leg 4 c++ opengl qt qt4

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

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

谢谢.

Nic*_*las 5

最后三个参数glTex(Sub)Image定义像素传输到OpenGL的方式.如果你有4个8位值,顺序,在ARGB顺序,那么我会建议如下:

glTexImage2D(..., GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, *);
Run Code Online (Sandbox Code Playgroud)

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


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