0

GLSL シェーダーに次の (作業中の) コードがあります。

vec3 normal = vec3(u_mvMatrix * vec4(0.0,0.0,1.0,0.0));//normal in eye space (no scaling in u_mvMatrix).

ただし、必要なのは u_mvMatrix の z 方向だけなので、次の行のどれが上記の行と同等ですか。

vec3 normal = u_mvMatrix[2].xyz;

また:

vec3 normal = vec3(u_mvMatrix[0].z,u_mvMatrix[1].z,u_mvMatrix[2].z);

?

よろしくお願いします。

4

1 に答える 1

0

デフォルトでは、OpenGL 行列は列優先です。

レイアウト修飾子 (例: ) を使用して、GLSL でそれらを行優先にすることができますlayout (row_major) uniform mat4 u_mvMatrix;。行優先行列の事前乗算は、列優先行列の事後乗算と同じであることに注意してください。したがって、これは正しいステートメントです。

(mat * vec) == (vec * transpose (mat))

OpenGL が行列乗算を行う固定関数パイプラインでは、常に列優先で後置乗算されます。Direct3D は行優先で、事前に乗算されます。プログラマブル パイプラインでは、行列表記を完全に制御し、前乗算か後乗算かを制御できます。

質問に戻ります。この例では、列優先の行列を事後乗算しています (行列は*演算子の左側にあります)。したがって、正しい同等性は次のとおりです。vec3 normal = u_mvMatrix [2].xyz;

私が今書いたことをきちんと説明している長い記事については、このサイトを参照してください。

于 2013-08-14T21:28:27.393 に答える