Ich bin gründlich verwirrt über Matrixdefinitionen. Ich habe eine Matrixklasse, die eine enthält, von float[16]
der ich angenommen habe, dass sie Zeilenmajor ist, basierend auf den folgenden Beobachtungen:
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
und matrixB
beide haben das gleiche lineare Layout im Speicher (dh alle Zahlen sind in Ordnung). Laut http://en.wikipedia.org/wiki/Row-major_order weist dies auf ein Zeilen-Haupt-Layout hin.
matrixA[0] == matrixB[0][0];
matrixA[3] == matrixB[0][3];
matrixA[4] == matrixB[1][0];
matrixA[7] == matrixB[1][3];
Daher matrixB[0]
= Zeile 0, matrixB[1]
= Zeile 1 usw. Dies zeigt wiederum das Zeilen-Haupt-Layout an.
Mein Problem / meine Verwirrung entsteht, wenn ich eine Übersetzungsmatrix erstelle, die wie folgt aussieht:
1, 0, 0, transX
0, 1, 0, transY
0, 0, 1, transZ
0, 0, 0, 1
Welches in Erinnerung geblieben ist als , { 1, 0, 0, transX, 0, 1, 0, transY, 0, 0, 1, transZ, 0, 0, 0, 1 }
.
Wenn ich dann glUniformMatrix4fv aufrufe , muss ich das Transponierungsflag auf GL_FALSE setzen, um anzuzeigen, dass es spaltenmäßig ist. Andernfalls werden Transformationen wie translate / scale usw. nicht richtig angewendet:
Wenn die Transponierte GL_FALSE ist, wird angenommen, dass jede Matrix in der Hauptreihenfolge der Spalte geliefert wird. Wenn die Transponierte GL_TRUE ist, wird angenommen, dass jede Matrix in der Hauptreihenfolge der Zeile geliefert wird.
Warum muss meine Matrix, die Zeilenmajor zu sein scheint, als Spaltenmajor an OpenGL übergeben werden?
GL_FALSE
"? Wie benutzt du die Uniform?