如果我创建的灰度纹理的尺寸不能被4整除,则布局与给定的数据不匹配。如果我将纹理设为RGBA,则一切正常。这是怎么回事? openGL是否在内部将数据打包为RGBA格式?
width=16
:
width=15
:
int width = 15;
unsigned char* localBuffer = new unsigned char[width*width];
glGenTextures(1, &textureObjID);
glBindTexture(GL_TEXTURE_2D, textureObjID);
for (int i = 0; i < width*width; i++)
{
float x = (i % width) / (float)width;
localBuffer[i] = x * 255;
}
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, width, 0, GL_RED, GL_UNSIGNED_BYTE, localBuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
答案 0 :(得分:3)
默认情况下,OpenGL假定图像每行的开头对齐4个字节。
这是因为GL_UNPACK_ALIGNMENT
参数默认为4。
由于图像具有1个(红色)颜色通道,并且包装紧密,因此如果width=16
,则将图像的行的开头对齐为4个字节,但是如果{{1 }}。
在指定二维纹理图像(width=15
)之前,将GL_UNPACK_ALIGNMENT
参数更改为1:
glTexImage2D
由于遗漏了这一点,因此会在图像的每一行产生移位效果,除非图像的宽度可以被4整除。
当图像的格式更改为glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, width,
0, GL_RED, GL_UNSIGNED_BYTE, localBuffer);
时,单个像素的大小为4,因此无论如何一行的大小(以字节为单位)都可以被4整除。