OpenGL是否在内部计算从向量开始的着色器?

时间:2013-06-06 04:13:23

标签: opengl graphics 3d glsl

通常,您会看到一个OpenGL着色器计算结构:

gl_Position=ProjectionMatrix * ModelViewMatrix * positionVector

matrix*matrix*vector

正如在this question中发现的那样,矩阵链的计算效率是完全可控的,并且实际上使用向量开始计算更有效。

现在,如上所述的典型着色器计算假设列主要排序,因为向量在右侧。我想知道的是OpenGL如何实际执行上述计算?在列主系统中,matrix*matrix*vector计算的顺序(不是表示法)为vector*matrix*matrix,因为它从右向左流动。

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

1 个答案:

答案 0 :(得分:1)

  

在列主系统中,矩阵*矩阵*向量计算的顺序(不是符号)是向量*矩阵*矩阵,因为它从右向左流动。

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

矩阵乘法不是commutative;你无法重新排列这样的顺序。但它是 associative 。这意味着(matrix*matrix)*vector相当于matrix*(matrix*vector)。后者将更加优化地计算。

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