【发布时间】:2015-01-27 19:31:41
【问题描述】:
我有this DDS 文件。我编写了一个简单的 DDS 阅读器来读取 DDS 标头并根据 MSDN 规范打印其详细信息。它说它是一个 RGB DDS,每个像素位深度为 32 个字节,并且忽略了 alpha,即像素格式为 X8R8G8B8(或 A8R8G8B8)。为了验证这一点,我还在十六进制编辑器中打开了这个文件,它将第一个(即从数据开始的)4 个字节显示为BB GG RR 00(将它们替换为第一个像素的右十六进制颜色值)。 I read OpenGL 的纹理复制函数作用于字节(至少在概念上),因此从它的角度来看,这个数据是 B8G8R8A8。如果我的理解有误,请纠正我。
现在到glTexImage2D 内部格式 我通过RGBA8 和外部格式 和类型 我通过BGRA 和@987654330 @。这会导致渲染输出中出现蓝色调。在我的片段着色器中,为了验证,我做了一个调换 R 和 B 并且它正确渲染。
我还原了着色器代码,然后用UNSIGNED_INT_8_8_8_8_REV(基于this suggestion)替换了UNSIGNED_BYTE 中的type,它仍然呈现蓝色调。现在将 external format 更改为 RGBA 并使用 type(UNSIGNED_BYTE 或 UNSIGNED_INT_8_8_8_8_REV)呈现良好!
- 由于OpenGL不支持ARGB,给BGRA是可以理解的。但是 RGBA 怎么会在这里正常工作呢?这似乎是错误的。
- 为什么 type 对通道的排序没有影响?
- GL_UNPACK_ALIGNMENT 对此有影响吗?我将其保留为默认值 (4)。如果我正确阅读了手册,这应该不会影响读取客户端内存的方式。
详情
- OpenGL 3.3 版
- 支持最高 OpenGL 4.0 的英特尔核芯显卡
- 使用GLI加载DDS文件并获取数据指针
【问题讨论】:
-
我可以看看你的读者吗?
-
当我问这个的时候,我写了一些扔掉的东西。感谢您的提问,我最终重新写了一些东西:shared here!正如答案所说,上述问题是由于最近修复的 GLI 中的错误造成的。
标签: opengl colors textures texture2d dds-format