【问题标题】:Transfer of pixel data: 24BPP images and GL_UNPACK_ALIGNMENT set to 4像素数据的传输:24BPP 图像和 GL_UNPACK_ALIGNMENT 设置为 4
【发布时间】:2013-08-29 23:50:02
【问题描述】:

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

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

也许(?)它有效,因为我不只是打电话给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

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

【问题讨论】:

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


    【解决方案1】:

    这取决于您的图像数据来自哪里。

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

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

    【讨论】:

    • 对,我很傻。我忘记了像素的来源——我正在使用 SDL_image 库中的 IMG_Load(...) 函数。因此,至少在涉及每个像素 3 个字节的位图时,它似乎将其转换为 32BPP。但是我不能确定它在任何情况下都会这样工作(意思是:任何加载的格式),对吧?所以我打开了它的手册,但没有太多关于它的信息。我想我应该开始搜索属于 SDL_image 一部分的库,例如 libpng、libtiff 等。如果我找到了,我仍然无法确定 SDL_image 是如何使用它们的。
    • @somnock:不。您将不得不实际阅读任何图像加载器的文档并弄清楚 actual 行对齐是什么。仅仅因为像素不是 4 字节大小并不意味着它不使用 4 字节行对齐。
    • 我不确定我是否理解正确。所以实际的行对齐只取决于文件格式?我应该在哪里寻找这些信息?你能给我一个例子的链接吗?
    • @somnock:这取决于文件格式和您使用的任何加载代码。你必须查一下。
    • 好的,我去查一下,如果有问题,我会在这里发帖。谢谢,伙计!
    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多