OpenGL:尺寸不能被4整除时,灰度纹理数据布局不匹配

时间:2019-08-04 11:53:13

标签: c++ opengl textures

如果我创建的灰度纹理的尺寸不能被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);

1 个答案:

答案 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整除。