为什么 GL_UNPACK_ALIGNMENT 默认为 4?

Why is GL_UNPACK_ALIGNMENT default 4?

我正在尝试使用以下方法将 RGB(无 alpha 通道)像素数据上传到 GPU:

            GLInternalFormat = GL_RGB8;
            GLFormat = GL_RGB;
            GLType = GL_UNSIGNED_BYTE;

这是我的数据结构u_int8* pixels

RGBRGBRGB -> row 1
RGBRGBRGB -> row 2
RGBRGBRGB -> row 3

此特定纹理的纹理宽度不是 4 的倍数。 我能够使用 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 使其工作 我现在明白 GL_UNPACK_ALIGNMENT 是如何工作的了。我现在的问题是,为什么 1 不是 OpenGL 中的默认值(来源:https://docs.gl/gl3/glPixelStore

pname                          Initial value     Value range
GL_UNPACK_ALIGNMENT integer    4                 1, 2, 4, or 8

设置为1安全吗?否则,它会破坏不能被 4 整除的纹理 为什么默认值是 4? 似乎很随意...

纹理或其他图像是您想要从 CPU 内存复制到 GPU 的相当大的内存块,反之亦然。 (早在 1990 年代初期,当 OpenGL 首次出现时,它们是固定功能的图形加速器,并不是真正的通用。)就像复制一块内存 to/from 您的磁盘驱动器或网卡一样,副本应该 运行尽快。

在 1990 年代初期,CPU 的类型比今天多得多。大多数可能 运行ning OpenGL 的都是 32 位的,并且出现了 64 位 RISC。

许多 RISC 系统,包括 SGI 销售的系统,只能读取和写入 32 bit/4 字节值,这些值在 4 字节边界上对齐。 M680x0 系列也很受工作站欢迎,需要 2 字节对齐。只有 Intel x86 可以从任何边界读取 32 位,如果 32 位值是 4 字节对齐的,它们仍然 运行 更快。

(在具有可以 运行 与 CPU 并行的 DMA 控制器的系统上,它很可能具有与 CPU 本身相同的对齐和性能要求。 )

所以默认为 4 字节对齐在大多数系统上提供了最佳性能。指定对齐方式 1 必须一次下降到 reading/writing 个字节。不一定慢 4 倍,但在大多数情况下更慢。

这些 1990 年代初期的系统也有足够的 RAM 和磁盘 space,从每像素 24 位到 32 位还算不错。您仍然可以找到具有 8 个未使用位的图像 file/memory 格式定义,只是为了获得与 24 位 RGB 的 4 字节对齐。