4

我正在阅读 OpenGL 3.x 的 OpenGL SuperBible。我很难理解整个“像素包装概念”。我知道通常一个 199px 宽的图像需要 597 个字节 [(199 * 3)3 对于每个颜色通道 RGB]。我的第一个问题是为什么这只是有时是正确的,作者说这仅适用于 4 字节对齐系统。他接着说将添加额外的三个字节以使其容易被四整除,我也不明白。所以真的我的问题是 4 字节对齐的意义是什么——这实际上是什么意思?然后作者说替代方案是 1 字节对齐,我也不明白。

作者说 .TGA 是 1 字节对齐或“紧密”的,而 .bmp 是 4 字节对齐的。

什么是 4 字节对齐,1 字节对齐,为什么我应该使用一个而不是另一个?什么时候应该使用 .tga 或 .bmp 进行纹理处理?

4

2 回答 2

3

好吧,这是关于数据对齐的。它在不同的架构和内存管理上有所不同。例如,当您在 32 位处理器中编写代码时,结构 / int 上的默认填充是 4 字节。在 64 位中是 8 字节。当您想要覆盖代码结构上的默认填充时,您可以使用#pragma pack(在 Visual Studio 上)、属性((packed)) (gcc)。

在这里查看更多参考:

于 2013-05-21T05:55:28.470 回答
2

更糟糕的是,您的描述没有区分像素对齐与扫描线对齐。

具有 24 位颜色的 199 像素图像确实需要 597 字节。但是第二条扫描线将从偏移量 600 开始,因为它必须与 4 字节边界对齐,而 600 是不与第一条扫描线重叠的第一个 4 字节边界。

这意味着不是从字节开始的每个像素

(x + y * width) * 3

每行将从字节开始

y * 600

和字节的每个像素

y * 600 + x * 3

但是,为什么不直接将纹理设为 2 的幂,所有 OpenGL 版本中的所有卡都支持它并且不会引起对齐问题?您使用纹理坐标来确保从未处理或渲染填充。

于 2013-05-18T01:36:34.277 回答