Vertex Shader でライトを計算したい場合、ビュー空間に法線ベクトルが必要です。一般的には以下のようになります (OpenGL Superbible 5th より):
// normalMatrix is retrieved from GLMatrixStack modelViewMatrix
vec3 vEyeNormal = normalMatrix * vNormal
GLTライブラリを使わずにプログラムを書きたい。別のソース ( http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Diffuse_Reflection ) で、次の式を見つけました。
vec3 normalDirection = normalize(m_3x3_inv_transp * v_normal);
変数 m_3x3_inv_transp は次のように計算されます。
glm::mat3 m_3x3_inv_transp = glm::transpose(glm::inverse(glm::mat3(mesh.object2world)));
私はそれを意識しています:
- 法線ベクトルの変換は受け入れられないため、法線マトリックスはモデル ビュー マトリックスの回転コンポーネントのみです。
- OpenGL 操作の順序は、Scalng、Translating、Rotating です (マトリックス変換の OpenGL 順序)
- 逆行列は最後の変換を元に戻します ( http://tomdalling.com/blog/modern-opengl/04-cameras-vectors-and-input/ )
私の質問は、マトリックスを反転してトランスポンシングした後、NormalMatrix を取得する理由と、計算を反転してそれをチェックする方法です。