为什么 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 字节对齐。
我正在尝试使用以下方法将 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 字节对齐。