如何将QImage格式转换为OpenGL支持的格式
How to convert QImage format to format supported by OpenGL
我使用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开发,你必须自己做字节交换。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- TDateTime格式在C++Builder中不会更改
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- OpenGL不会绘制三角形,遵循确切的格式
- OpenGL纹理格式,为OpenGL创建图像/纹理数据
- OpenGL:是否可能具有16位内部格式,类似于亮度 alpha
- 用于将三维模型导入OpenGL/C++项目的推荐文件格式和图形库
- OpenGL-渲染不同的顶点格式
- 格式转换在OpenGL图像中
- OpenGL从4*浮点格式(C++)上传像素数据
- 如何在FTGL OpenGL中更改RGB格式的颜色
- Qt5转换QImage到OpenGL格式
- 如何将QImage格式转换为OpenGL支持的格式
- OpenGL上下文创建从不选择像素格式