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

How to convert QImage format to format supported by OpenGL

本文关键字:格式 OpenGL 支持 转换 QImage      更新时间:2023-10-16

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

有谁知道更好的解决方案吗?至少,有什么方法可以使这种转换与端序无关吗?

谢谢。

glTex(Sub)Image的最后三个参数定义了如何将像素传输到OpenGL。如果按ARGB顺序有4个8位值,那么我建议如下:

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

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


注意:我知道你没有提到这一点,但如果你正在考虑移动平台,请记住OpenGL ES是而不是 OpenGL。桌面OpenGL要求实现能够在传输操作中处理各种像素排列。GL ES的要求几乎相反。像素传输格式必须完全匹配纹理的内部格式。所以如果你在做GL ES开发,你必须自己做字节交换。