Wenn ich das richtig verstanden habe ist es etwas komplizierter. Im Grunde ist eine Matrix ja eine Matrix. Wie sie intern dargestellt wird (row/column major) hat keinen Einfluss auf ihre Bedeutung. Jetzt ist es so, dass ein Vektor auch eine Matrix ist, da gibt es aber 2 Möglichkeiten: 1x4 und 4x1, also Zeilenvektor und Spaltenvektor.
Bei einem Spaltenvektor musst du Matrix * Vektor machen und bei einem Zeilenvektor entsprechend umgekehrt. Das ist mathematisch notwendig, da nur diese Operationen definiert sind. Eine 4x4-Matrix mit einer 1x4-Matrix zu multiplizieren ist nicht erlaubt, da die Anzahl der Spalten des ersten Operanden der Anzahl der Zeilen des zweiten Operators entsprechen müssen.
Nun ist es aber so, dass diese Operationen aber nicht den gleichen Effekt haben. Das bedeutet wenn du denselben Vektor mit einer Matrix multiplizierst und zwar einmal als Spalten- und einmal als Zeilenvektor erhältst du nicht dasselbe Ergebnis. Du musst dafür mit der transponierten Matrix multiplizieren. Immerhin ist der Spaltenvektor auch ein transponierter Zeilenvektor. Das ganze lässt sich hübsch durch das mathematische Gesetz darstellen:
§§
(Mv)^{T} = v^{T}M^{T} \\
§§
Multiplizierst du eine Matrix M also mit einem Spaltenvektor erhältst du einen Spaltenvektor. Multiplizierst du nun den Zeilenvektor mit der transponierten Matrix erhältst du den entsprechenden Zeilenvektor.
Wie du bereits sagtest ist es ja so, dass die Matrix in diesem Fall zusammengesetzt ist und du brauchst jetzt in jedem Fall eine andere Matrix. Welche Auswirkung hat das transponieren auf eine zusammengesetzte Matrix?
§§
M = TRS \\
M^{T} = S^{T}R^{T}T^{T}
§§
Die Reihenfolge der einzelnen Faktormatrizen wird also vertauscht und diese transponiert. Was bedeutet das jetzt? Nun so wie ich es kenne verwendest du in DirectX Zeilenvektoren und in OpenGL Spaltenvektoren und eine entsprechende Multiplikationsreihenfolge (Vektor-Matrix vs. Matrix-Vektor). Entsprechend brauchst du also unterschiedliche Matrizen um dasselbe Ergebnis zu erhalten (nicht exakt dasselbe, bei dem einen ist der transformierte Vektor dann ja ein Zeilenvektor bei dem anderen ein Spaltenvektor). Die einzelnen Matrizen (Scale, Rotation, Transform etc.) sind also transponiert und ihre Multiplikationsreihenfolge umgekehrt wenn du DirectX und OpenGL vergleichst.
Trotzdem bleibt eine Matrix immer dieselbe, du brauchst nur andere Matrizen wenn du eine andere Operation durchführst. Es ist auch möglich in DirectX z.B. Spaltenvektoren zu verwenden wenn du sie einfach als float4x1 definierst und damit dann die "OpenGL-Reihenfolge" zu verwenden. Das Ergebnis sollte aber trotzdem in einen Zeilenvektor transponiert werden, der in einen float4 passt, damit du das richtig in die Pipeline bekommst (zumindest die Clip-Space-Position) (?).