我在GLSL着色器中有以下(有效)代码:
vec3 normal = vec3(u_mvMatrix * vec4(0.0,0.0,1.0,0.0));//normal in eye space (no scaling in u_mvMatrix).
但是,由于我需要的只是u_mvMatrix的z方向,因此以下哪几行等效于上面的行:
vec3 normal = u_mvMatrix[2].xyz;
或者:
vec3 normal = vec3(u_mvMatrix[0].z,u_mvMatrix[1].z,u_mvMatrix[2].z);
?
在此先感谢您的帮助!
OpenGL矩阵默认为column-major 。
您可以使用布局限定符(例如layout (row_major) uniform mat4 u_mvMatrix;
)使它们在GLSL中排行。请注意,行主要矩阵的预乘和列主要矩阵的后乘是相同的,因此这是正确的声明:
(mat * vec) == (vec * transpose (mat))
在固定功能管道中,当OpenGL进行矩阵乘法时,它始终为列优先和后乘。Direct3D是行优先的和预乘的。在可编程管线中,您可以完全控制矩阵符号以及是乘前还是乘后。
回到您的问题,在本示例中,您正在乘后(矩阵在*
运算符的左手边)一个以列为主的矩阵。因此,正确的等价于vec3 normal = u_mvMatrix [2].xyz;
有关冗长的文章,在解释我刚刚写的内容方面做得不错,请访问此站点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句