在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子矩阵的转置的逆,也就是共轭阵。
PREVIOUSoperator const void*()
NEXTsmplayer中文字幕问题