web-dev-qa-db-ja.com

glslの抽出的にmat3(mat4マトリックス)ステートメントは何をしますか?

フラグメントごとのライティングを行っていますが、通常のベクトルを修正すると、次のコードが表示されます:vec3 f_normal = mat3(MVI) * normal;ここで、MVIはmat4 MVI = transpose(inverse(ModelViewMatrix));です。では、mat3(MVI)ステートメントの後のreturnは何ですか?

14
Bình Nguyên
mat3(MVI) * normal

4x4行列から上位の3x3行列を返し、法線にそれを乗算します。この行列は「正規行列」と呼ばれます。これを使用して、法線をワールドスペースからアイスペースに移動します。行列の上部の3x3部分は縮尺と回転にとって重要ですが、残りは平行移動専用です(法線は平行移動されません)。

ワールド空間からアイ空間に法線を適用するには、モデルビュー行列の3x3 逆転置が必要です。行列がothronormal(不均一なスケールがない)でない限り、元の行列はその逆転置と同じです。

From GLSL types "別の行列から行列を作成する場合、サイズに制限はありません。したがって、2x4行列から4x2行列を作成できます。対応するものだけです。要素がコピーされます。 "。したがって、結果としてMVIの左上の3x3サブマトリックスが得られます。

3