GLSL中gl_NormalMatrix的作用

Edit on Github

在vertex shader中使用gl_Normal,一般都会先乘下gl_NormalMatrix:

vec3 n = normalize(gl_NormalMatrix * gl_Normal);

对gl_Vertex的操作是左乘gl_ModeViewMatrix:

vertexEyeSpace = gl_ModelViewMatrix * gl_Vertex;

为什么gl_Normal要特别考虑呢?其实在只有平移和旋转变换的情况下,也就是没scale时,这样做是可行的。但在有scale时,就不一定了,此时不能保证,从世界坐标系变换到eye space(相关计算都是在这个坐标系下进行的)时法向量与切向量保持垂直。

具体关系式推导见: LightHouse 3D GLSL Tutorial: The gl_NormalMatrix 最终gl_NormalMatrix是gl_ModeViewMatrix的左上3X3子矩阵的转置的逆,也就是共轭阵。