在OpenGL中使用列主矩阵是否会导致GPU上的跨步?
OpenGL通常(在文档、示例等中)使用列主矩阵和列向量。由于矩阵向量变换涉及矩阵行与列向量的点积,GPU是否会出现跨步和空间局部性损失?GPU是否重新排列GLSL和GPU汇编代码之间的4x4矩阵以解决此问题在OpenGL中使用列主矩阵是否会导致GPU上的跨步?,opengl,gpu,linear-algebra,Opengl,Gpu,Linear Algebra,OpenGL通常(在文档、示例等中)使用列主矩阵和列向量。由于矩阵向量变换涉及矩阵行与列向量的点积,GPU是否会出现跨步和空间局部性损失?GPU是否重新排列GLSL和GPU汇编代码之间的4x4矩阵以解决此问题 如果点积按行排列,那么它似乎可以使点积更快地获取矩阵的前四个浮点数,这样GPU只需进行一次内存访问,而不是四次。OpenGL使用列主符号,但这仅仅是一种符号。底层存储格式与您预期的一样 以下列中的矩阵主要表示法: xx yx zx wx xy yy zy wy xz yz zz wz 0
如果点积按行排列,那么它似乎可以使点积更快地获取矩阵的前四个浮点数,这样GPU只需进行一次内存访问,而不是四次。OpenGL使用列主符号,但这仅仅是一种符号。底层存储格式与您预期的一样 以下列中的矩阵主要表示法:
xx yx zx wx
xy yy zy wy
xz yz zz wz
0 0 0 1
存储在内存中的方式如下:
xx xy xz 0 yx yy yz 0 zx zy zz 0 wx wy wz 1
当执行矩阵*向量的乘积时,它确实可以通过4次16字节的完美合并访问来获取
9.005 OpenGL矩阵是列主还是行主?
出于编程目的,OpenGL矩阵是具有
在内存中连续排列的基向量。翻译
组件占据16个元素中的第13、14和15个元素
矩阵,其中索引的编号范围为1到16,如中所述
OpenGL 2.1规范的第2.11.2节
列主键与行主键纯粹是一种符号约定。注
与列主矩阵相乘后产生相同的结果
结果为与行主矩阵的预乘。OpenGL
规范和OpenGL参考手册都使用ColumnMajor
符号你可以使用任何符号,只要清楚地说明
遗憾的是,在规范和蓝皮书中使用列主格式已经过时了
导致OpenGL编程社区中无休止的混乱。
列主符号表示矩阵未在中列出
内存是程序员所期望的
Ack,我已经读了无数遍这个常见问题,但从未注意到基本向量在内存中的连续排列。尽管如此,dot产品不会抓取xx-yx-zx-wx吗?@MaiLongdong:至少在客户端,内存布局是主要的列,而不是您所描述的。大多数GPU也是这样。然而,这通常不会引起问题,因为GPU的内存提取和缓存电路设计时就考虑到了这一点。@MaiLongdong:基本向量是OpenGL表示法中的列向量。如果查看(常规)modelview矩阵,它的第一列是X,第二列是Y,第三列是转换为视图的模型空间的Z向量。事实上,如果你取第三个向量(Z),它会告诉你“相机”正在看的方向。变换矩阵的平移向量是第四列,它占据了第13、14和15个元素。哦,是的,我上面的矩阵确实应该被转置。修复了,谢谢。看起来Cg允许在GPU上选择矩阵布局,但在OpenGL上是不可能的,是吗?