OpenGL通常(在文档,示例等中)使用列主矩阵和列向量。由于矩阵向量变换涉及矩阵行与列向量的点积,因此GPU是否会受到跨越和空间局部性的损失? GPU是否重新安排GLSL和GPU汇编代码之间的4x4矩阵来解决这个问题?
如果它们按行排列,似乎可以让点积更快地获取矩阵的前四个浮点数,这样GPU只需要进行一次内存访问而不是四次。
答案 0 :(得分:2)
OpenGL使用列主要表示法,但这只是表示法。底层存储格式如您所料。
列主要表示法中的以下矩阵:
xx xy xz 0 yx yy yz 0 zx zy zz 0 wx wy wz 1
存储在内存中,如下所示:
Matrix * vector
在执行{{1}}产品时,确实可以在4个完全合并的访问中获取每个16字节。
9.005 OpenGL矩阵是专栏还是行专业?
出于编程目的,OpenGL矩阵是16值数组 基本向量在记忆中连续排列。译文 组件占据了16个元素的第13,14和15个元素 矩阵,索引编号从1到16,如 OpenGL 2.1规范的第2.11.2节。
列主要与行主要纯粹是一种符号约定。注意 与列主矩阵相乘后产生相同的结果 结果与行主矩阵预乘。 OpenGL 规范和OpenGL参考手册都使用column-major 符号。您可以使用任何符号,只要它清楚说明。
可悲的是,在规范和蓝皮书中使用了列主要格式 导致OpenGL编程社区无休止的混乱。 列主要表示法表明矩阵没有列出 作为程序员期望的记忆。