像素数据传输:24BPP图像,GL_UNPACK_ALIGNENT设置为4

Transfer of pixel data: 24BPP images and GL_UNPACK_ALIGNMENT set to 4

本文关键字:UNPACK ALIGNENT 设置 GL 数据传输 24BPP 图像 像素      更新时间:2023-10-16

在OpenGL程序中,我正在加载一个宽度为501的24BPP图像。GL_UNPACK_ALINGMENT参数设置为4。他们写它不应该工作,因为正在上传的每一行的大小(501*3 = 1503)不能除以4。然而,当显示时,我可以看到一个没有瑕疵的正常纹理。

所以我的代码是有效的。我正在考虑为什么要充分理解这一点,并防止整个项目被窃听。

也许(?)它有效,因为我不仅仅是在打glTexImage2D。相反,一开始我创建了一个合适的(尺寸是二的幂)空白纹理,然后用glTexSubImage2D上传像素。

编辑:

但是你认为写这样的代码有意义吗?

// w - the width of the image
// depth - the depth of the image
bool change_alignment = false;
if (depth != 4 && !is_divisible(w*depth)) // *
{
    change_alignment = true;
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
}
// ... now use glTexImage2D
if (change_alingment) glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // set to default
// * - of course we don't even need such a function
// but I wanted to make the code as clear as possible

希望它能防止应用程序崩溃或出现故障?

这取决于图像数据的来源。

例如,Windows BMP格式强制执行4字节的行对齐。事实上,像这样的格式正是OpenGL具有行对齐字段的原因:因为一些图像格式强制行对齐。

因此,对数据使用4字节行对齐的正确性完全取决于数据在内存中的对齐方式。一些图像加载程序将自动对齐到4个字节。有些人不会。