像素数据的传输:24BPP图像和GL_UNPACK_ALIGNMENT设置为4

时间:2013-08-29 23:50:03

标签: c++ opengl textures data-transfer 24-bit

在我的OpenGL程序中,我正在加载宽度为501的24BPP图像。 GL_UNPACK_ALINGMENT参数设置为4。他们写it shouldn't work因为正在上传的每一行的大小(501*3 = 1503)不能除以4.但是,我在显示它时可以看到没有artifac的普通纹理。

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

也许(?)它有效,因为我不仅仅是在调用glTexImage2D。相反,首先我创建一个适当的(尺寸为2的幂)空白纹理,然后使用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

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

1 个答案:

答案 0 :(得分:2)

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

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

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