通常,您会看到一个OpenGL着色器计算结构:
gl_Position=ProjectionMatrix * ModelViewMatrix * positionVector
即matrix*matrix*vector
正如在this question中发现的那样,矩阵链的计算效率是完全可控的,并且实际上使用向量开始计算更有效。
现在,如上所述的典型着色器计算假设列主要排序,因为向量在右侧。我想知道的是OpenGL如何实际执行上述计算?在列主系统中,matrix*matrix*vector
计算的顺序(不是表示法)为vector*matrix*matrix
,因为它从右向左流动。
令人困惑的是,着色器代码与任何编程代码一样,是从左到右编写的,并且假定了标准的数学运算顺序。因此,这意味着着色器正在计算向量 last ,从而执行效率低下。
答案 0 :(得分:1)
在列主系统中,矩阵*矩阵*向量计算的顺序(不是符号)是向量*矩阵*矩阵,因为它从右向左流动。
不,不是。操作的顺序正是你所写的:matrix * matrix * vector。虽然你可以从概念上反转它,以便跟随顶点通过变换管道,这只是你对变换序列的概念透视。数学运算的顺序保持不变。
矩阵乘法不是commutative;你无法重新排列这样的顺序。但它是 associative 。这意味着(matrix*matrix)*vector
相当于matrix*(matrix*vector)
。后者将更加优化地计算。
您的编译器会执行后一种计算而不是前者吗?这完全取决于编译器的质量。但是在正确的位置放几个括号将确保它确实存在。