GLSL着色器中矩阵的z方向

268

我在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);

在此先感谢您的帮助!

安东·科尔曼(Andon M.Coleman)

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章