我使用以下 OpenGL 命令上传 35 x 100 16bpp 纹理:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, 35, 100, 0, GL_RG, GL_UNSIGNED_BYTE, pixelData);
但随着 y 的增加,生成的纹理会向左倾斜一个像素(无论是在绘制时还是在 GPU 内存中检查时):
o o x o o o o o x o
o o x o o o o o o x
o o x o o x o o o o
o o x o o o x o o o
o o x o o becomes-> o o x o o
如果给定的宽度不同于pixelData
一个像素,但缓冲区和给定的尺寸是准确的。将纹理更改为 36 x 100 且不进行其他更改也可以解决该问题。这种情况仅发生在宽度为奇数的纹理上。
我的问题是,这是驱动程序错误吗?据我了解,现代硬件上允许使用非 POT 纹理,但这表明仍然存在某种未公布的对齐要求,可能特定于 16bpp 纹理;至少在我能找到的任何地方都没有提到这种行为或要求。
纹理必须在每条扫描线(水平行)的末尾处满足对齐方式,通常默认为 4 字节。如果不满足这种对齐方式,纹理将需要在这些位置进行填充,您必须在上传的像素数据中提供这些位置。除非您将非 pow2 纹理大小与每像素少于 32 位的纹理数据混合在一起,否则通常不会出现此问题。
Using glPixelStorei()
可以根据需要将此要求调整为 2 或 1 的对齐方式,或者在处理 16 位纹理时,您可以简单地确保纹理大小对齐为 4 的倍数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)