1

通常,您会看到这样的 OpenGL 着色器计算结构:

gl_Position=ProjectionMatrix * ModelViewMatrix * positionVector

那是,matrix*matrix*vector

这个问题中发现,矩阵链的计算效率是完全可控的,实际上从向量开始计算效率更高。

现在,如上所述的典型着色器计算假定列优先排序,因为向量在右侧。我想知道的是OpenGL实际上是如何执行上述计算的?在以列为主的系统中,计算的顺序(不是符号)matrix*matrix*vectorvector*matrix*matrix因为它从右到左流动。

令人困惑的是,与任何编程代码一样,着色器代码是从左到右编写的,并且假定了标准的数学运算顺序。因此,这意味着着色器最后计算向量,因此执行效率低下。

4

1 回答 1

1

在列优先系统中,matrix*matrix*vector 计算的顺序(不是符号)是 vector*matrix*matrix,因为它从右到左流动。

不,不是。操作顺序就是你写的:matrix*matrix*vector。虽然您可以在概念上反转它以便通过变换管道跟随顶点,但这只是您对变换序列的概念性观点。数学运算的顺序保持不变。

矩阵乘法不可交换;你不能像那样重新排列顺序。但它是关联的。这意味着(matrix*matrix)*vector相当于matrix*(matrix*vector). 后者将被更优化地计算。

您的编译器会执行后者的计算而不是前者吗?这完全取决于编译器的质量。但是在正确的位置放几个括号将确保它确实如此。

于 2013-06-06T10:22:17.957 回答