OpenGL:当尺寸不能被 4 整除时,灰度纹理数据布局不匹配
OpenGL: Greyscale texture data layout doesn't match when the dimensions aren't divisible by 4
如果我创建尺寸不能被 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);
默认情况下,OpenGL 假定图像的每一行的开头对齐 4 个字节。
这是因为GL_UNPACK_ALIGNMENT
参数默认为4。
由于图像有 1 个(RED)颜色通道,并且被紧密打包,如果 width=16
,则图像行的开头对齐到 4 字节,但如果 width=15
.
将GL_UNPACK_ALIGNMENT
参数改为1,在指定二维纹理图像之前(glTexImage2D
):
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, width,
0, GL_RED, GL_UNSIGNED_BYTE, localBuffer);
由于遗漏了这一点,这会在图像的每一行产生偏移效果,除非图像的宽度可以被 4 整除。
当图像格式改为GL_RGBA
时,单个像素的大小为4,所以一行的大小(以字节为单位)在任何情况下都可以被4整除。
如果我创建尺寸不能被 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);
默认情况下,OpenGL 假定图像的每一行的开头对齐 4 个字节。
这是因为GL_UNPACK_ALIGNMENT
参数默认为4。
由于图像有 1 个(RED)颜色通道,并且被紧密打包,如果 width=16
,则图像行的开头对齐到 4 字节,但如果 width=15
.
将GL_UNPACK_ALIGNMENT
参数改为1,在指定二维纹理图像之前(glTexImage2D
):
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, width,
0, GL_RED, GL_UNSIGNED_BYTE, localBuffer);
由于遗漏了这一点,这会在图像的每一行产生偏移效果,除非图像的宽度可以被 4 整除。
当图像格式改为GL_RGBA
时,单个像素的大小为4,所以一行的大小(以字节为单位)在任何情况下都可以被4整除。