我正在使用QImage
加载图像,然后在OpenGL中用作纹理。
问题是颜色组件在QImage
和OpenGL中的顺序不同。
目前我在OpenGL中使用GL_RGBA
格式,在Qt中使用QImage::Format_ARGB32
。
因此,在OpenGL中创建纹理之前,我必须为加载图像的每个像素手动交换字节。此外,要正确交换字节,我需要知道机器的字节顺序。
有谁知道更好的解决方案吗?至少,有没有办法让这种转换与字节顺序无关?
感谢。
答案 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开发,则必须自行进行字节交换。