z GLSL着色器中矩阵的z方向

时间:2013-08-14 07:46:26

标签: glsl

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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

OpenGL矩阵是默认的列专业。

您可以使用布局限定符(例如layout (row_major) uniform mat4 u_mvMatrix;)将它们设置为GLSL中的行专业。请注意,行主矩阵的预乘与柱主矩阵的后乘相同,因此这是一个真实的陈述:

(mat * vec) == (vec * transpose (mat))

在固定功能流水线中,当OpenGL进行矩阵乘法时,它总是列为主,后乘。 Direct3D是行主要和预乘。在可编程管道中,您可以完全控制矩阵表示法以及是预乘还是后乘。

回到你的问题,在这个例子中,你是后乘(矩阵在*运算符的l手侧)一个列主矩阵。因此,正确的等价是vec3 normal = u_mvMatrix [2].xyz;

对于一篇冗长的文章,它解释了我刚写的内容,请参阅this site