【问题标题】:OpenGL pixels drawn with each horizontal pair swapped交换每个水平对绘制的 OpenGL 像素
【发布时间】:2011-06-07 15:53:58
【问题描述】:

虽然我相当确定我的问题在于所使用的像素格式,或者我的纹理是如何生成的,但我对 OpenGL 还是有些陌生...

我正在使用 16 位 RGB5_A1 像素格式在平面 2D 四边形上绘制纹理,但在此阶段我不使用任何 alpha。我遇到的问题是每对水平像素值都已交换

也就是说……如果像素位置应该按这个顺序排列(假设是 8x2 图像)

0 1 2 3 
4 5 6 7

它们被绘制为

1 0 3 2
5 4 7 6

或者,从这张图片(下图)可以更清楚地看到。 左边是我得到的……右边是我应该得到的。

问题是……我是怎么得到这个结果的?像素格式有问题吗?不太可能,因为颜色看起来都是正确的,如果归结为字节序,我会期待各种讨厌的东西。非常感谢您的建议。

更新:原来问题出在我的源渲染器中。有趣的是,我通过使用 32 位纹理完全避免了这个问题(此时还没有尝试过 24 位)。

【问题讨论】:

  • 我宁愿怀疑纹理输入数据格式。你的 glTexture2D 调用是什么样的?
  • 对我来说似乎是一个字节序问题。我是否正确假设,您要么使用 16 位类型的数据点,从 16 位块中的文件读取,或者将纹理数据指定为 16 位类型的硬编码数组?为了避免字节序的任何问题,您应该始终将 I/O 数据存储和处理为可以容纳数据构建块(通常是字节)的最小类型的数组。 CHAR_BITS 告诉你,一个 char 有多少位,但它被断言至少为 8。
  • 你能发布一个演示问题的最小 GLUT 程序吗?
  • 嗯。 Datenwolf,感谢有关字节序的提示。我已经确定问题在于源纹理的生成 - 当我使用硬编码数据破坏纹理时,它会按应有的方式呈现。一个完全 hacky 的解决方案(在 glTexSubImage2D 之前立即交换每个像素)可以实现所需的显示,尽管我相当确定它会降低性能。感谢您的所有回复。现在我只需要弄清楚为什么输入格式被破坏了(Bahbar,看来你是在赚钱)。

标签: opengl distortion pixelformat


【解决方案1】:

这可能不相关,您已经找到了解决方法,但它可能与 OpenGL 解包对齐有关。您是否尝试过以下调用?指示每个图像行对齐到 1 个字节(默认为 4 个)。

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

【讨论】:

  • 这会导致输出偏斜,而不是交错像素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多