Verwenden von Row-Major im OpenGL-Shader

Ich habe das am gesehenOpenGL Seite:

OpenGL Shading Language-Attributvariablen dürfen vom Typ mat2, mat3 oder mat4 sein. Attribute dieses Typs können mithilfe der glVertexAttrib-Einstiegspunkte geladen werden. Matrizen müssen in aufeinanderfolgenden generischen Attribut-Slots in Spaltenhauptreihenfolge geladen werden, wobei sich in jedem generischen Attribut-Slot eine Spalte der Matrix befindet.

Ich habe nacheinander eine Vektorbibliothek verwendet, die auf Row-Major basiert. Das heißt, die 16 Elemente der 4x4-Matrix sind folgendermaßen in einer Struktur angeordnet:

vec4 x;
vec4 y;
vec4 z;
vec4 w;

Wo jedervec4 hat Komponentenx, y, z, w, Und so kam es dass derlineare Reihenfolge Der Inhalt ist zeilenmajor, da die erste Zeile die ersten 4 Positionen im Speicher einnimmt und die Matrixmathematik als solche behandelt wird. Beispiel:

 static Matrix4<T> RotateZ(T degrees)
{
    T radians = degrees * 3.14159f / 180.0f;
    T s = std::sin(radians);
    T c = std::cos(radians);

    Matrix4 m;
    m.x.x =  c; m.x.y = s; m.x.z = 0; m.x.w = 0;
    m.y.x = -s; m.y.y = c; m.y.z = 0; m.y.w = 0;
    m.z.x =  0; m.z.y = 0; m.z.z = 1; m.z.w = 0;
    m.w.x =  0; m.w.y = 0; m.w.z = 0; m.w.w = 1;
    return m;
}

Die Bibliothek ist zeilenweise aufgebaut, um Berechnungen von links nach rechts beim Schreiben des clientseitigen Codes zu unterstützen, was für viele Programmierer selbstverständlich ist. Was ich jedoch nicht verstehe, ist, dass diese Zeilenmatrizen so wie sie sind an die Shader gesendet werden, die demnach Spaltenmatrizen erwarten.

Ich verstehe, dass der Shader Berechnungen von rechts nach links durchführt. Aber sollte eine Zeilenmatrix nicht so transponiert werden, dass sie Spaltenmatrix ist, bevor sie einem Shader zugeführt wird? Ich habe das noch nicht gemacht, aber es funktioniert einwandfrei.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage