我尝试使用以下方法将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的默认值(源代码:(第10页)
pname Initial value Value range
GL_UNPACK_ALIGNMENT integer 4 1, 2, 4, or 8
将其设置为1安全吗?否则,它会在不能被4整除的纹理上中断**为什么默认值为4?**似乎是任意的...
1条答案
按热度按时间kt06eoxx1#
纹理或其他图像是一个相当大的内存块,你想从CPU内存复制到GPU,反之亦然。(早在20世纪90年代初,当OpenGL第一次出现时,它们是固定功能的图形加速器,而不是真正的通用。)就像复制内存块到/从你的磁盘驱动器或网卡,复制应该运行得尽可能快。
在20世纪90年代早期,CPU的种类比现在多得多,大多数可能运行OpenGL的CPU都是32位的,64位的RISC正在出现。
许多RISC系统,包括SGI出售的那些,只能读写在4字节边界上对齐的32位/4字节值。同样在工作站中流行的M680 x 0系列需要2字节对齐。只有Intel x86可以从任何边界读取32位,如果32位值是4字节对齐的,它们仍然运行得更快。
(On带有DMA控制器的系统可以与CPU并行运行,则它很可能具有与CPU本身相同的对齐和性能要求。)
因此,在大多数系统上,默认为4字节对齐会提供最佳性能。指定对齐1将不得不降低到一次阅读/写一个字节。不一定会慢4倍,但在大多数系统上会慢。
这些20世纪90年代早期的系统也有足够的RAM和磁盘空间,从每像素24位到32位也不算太差。你仍然可以找到有8个未使用的位的图像文件/内存格式定义,只是为了获得与24位RGB的4字节对齐。