Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在OpenGL中使用列主矩阵是否会导致GPU上的跨步?_Opengl_Gpu_Linear Algebra - Fatal编程技术网

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

在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

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


如果点积按行排列,那么它似乎可以使点积更快地获取矩阵的前四个浮点数,这样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上是不可能的,是吗?