宽度为奇数的16位纹理为片状

16bit Texture with odd sized width is sheering

本文关键字:纹理 16位      更新时间:2023-10-16

我正在使用以下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位的纹理数据混合,否则这通常不会引起关注。

使用glPixelStorei()可以根据需要将此要求调整为对齐2或1,或者在处理16位纹理时,您可以简单地确保纹理大小对齐为4的倍数。