在OpenGL中使用列主矩阵是否会导致GPU上的跨越?

时间:2015-08-23 20:55:12

标签: opengl gpu linear-algebra

OpenGL通常(在文档,示例等中)使用列主矩阵和列向量。由于矩阵向量变换涉及矩阵行与列向量的点积,因此GPU是否会受到跨越和空间局部性的损失? GPU是否重新安排GLSL和GPU汇编代码之间的4x4矩阵来解决这个问题?

如果它们按行排列,似乎可以让点积更快地获取矩阵的前四个浮点数,这样GPU只需要进行一次内存访问而不是四次。

1 个答案:

答案 0 :(得分:2)

OpenGL使用列主要表示法,但这只是表示法。底层存储格式如您所料。

列主要表示法中的以下矩阵:

xx xy xz 0 yx yy yz 0 zx zy zz 0 wx wy wz 1

存储在内存中,如下所示:

Matrix * vector

在执行{{1}}产品时,确实可以在4个完全合并的访问中获取每个16字节。

From the docs:

  

9.005 OpenGL矩阵是专栏还是行专业?

     

出于编程目的,OpenGL矩阵是16值数组   基本向量在记忆中连续排列。译文   组件占据了16个元素的第13,14和15个元素   矩阵,索引编号从1到16,如   OpenGL 2.1规范的第2.11.2节。

     

列主要与行主要纯粹是一种符号约定。注意   与列主矩阵相乘后产生相同的结果   结果与行主矩阵预乘。 OpenGL   规范和OpenGL参考手册都使用column-major   符号。您可以使用任何符号,只要它清楚说明。

     

可悲的是,在规范和蓝皮书中使用了列主要格式   导致OpenGL编程社区无休止的混乱。   列主要表示法表明矩阵没有列出   作为程序员期望的记忆。