我在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);
提前感谢您的帮助!
答案 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。