1字节对齐与4字节对齐(像素包装)

时间:2013-05-18 01:20:05

标签: opengl pixel structure-packing

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

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

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

2 个答案:

答案 0 :(得分:3)

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

在此处查看其他参考资料:

答案 1 :(得分:2)

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

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

这意味着代替每个像素从字节

开始
(x + y * width) * 3

每一行都以字节

开头
y * 600

并且每个像素都在字节

y * 600 + x * 3

但是为什么不让你的纹理成为2的幂,所有OpenGL版本的所有卡都支持它并且不会导致对齐问题?您可以使用纹理坐标来确保不会处理或渲染填充。

相关问题