フラグメントごとのライティングを行っていますが、通常のベクトルを修正すると、次のコードが表示されます:vec3 f_normal = mat3(MVI) * normal;
ここで、MVIはmat4 MVI = transpose(inverse(ModelViewMatrix));
です。では、mat3(MVI)
ステートメントの後のreturnは何ですか?
mat3(MVI) * normal
4x4行列から上位の3x3行列を返し、法線にそれを乗算します。この行列は「正規行列」と呼ばれます。これを使用して、法線をワールドスペースからアイスペースに移動します。行列の上部の3x3部分は縮尺と回転にとって重要ですが、残りは平行移動専用です(法線は平行移動されません)。
ワールド空間からアイ空間に法線を適用するには、モデルビュー行列の3x3 逆転置が必要です。行列がothronormal(不均一なスケールがない)でない限り、元の行列はその逆転置と同じです。
From GLSL types : "別の行列から行列を作成する場合、サイズに制限はありません。したがって、2x4行列から4x2行列を作成できます。対応するものだけです。要素がコピーされます。 "。したがって、結果としてMVIの左上の3x3サブマトリックスが得られます。