行列の定義について完全に混乱しています。float[16]
次の観察に基づいて、行優先であると仮定した を保持する行列クラスがあります。
float matrixA[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
float matrixB[4][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 8, 9, 10, 11 }, { 12, 13, 14, 15 } };
matrixA
どちらもメモリ内に同じ線形レイアウトをmatrixB
持っています (つまり、すべての数字が順番に並んでいます)。http://en.wikipedia.org/wiki/Row-major_orderによると、これは行優先のレイアウトを示します。
matrixA[0] == matrixB[0][0];
matrixA[3] == matrixB[0][3];
matrixA[4] == matrixB[1][0];
matrixA[7] == matrixB[1][3];
したがって、matrixB[0]
= 行 0、matrixB[1]
= 行 1 などです。繰り返しますが、これは行優先のレイアウトを示します。
私の問題/混乱は、次のような翻訳マトリックスを作成すると発生します。
1, 0, 0, transX
0, 1, 0, transY
0, 0, 1, transZ
0, 0, 0, 1
これは、 としてメモリに配置されます{ 1, 0, 0, transX, 0, 1, 0, transY, 0, 0, 1, transZ, 0, 0, 0, 1 }
。
次に、glUniformMatrix4fvを呼び出すときに、転置フラグを GL_FALSE に設定して、列優先であることを示す必要があります。そうしないと、変換やスケールなどの変換が正しく適用されません。
転置が GL_FALSE の場合、各行列は列優先順で提供されると想定されます。転置が GL_TRUE の場合、各行列は行優先順で提供されると想定されます。
行優先のように見える行列を列優先として OpenGL に渡す必要があるのはなぜですか?