Falsche Reihenfolge der Matrixwerte in Glm?

8

Ich begann mit der GLM -Bibliothek, um mathematische Operationen über OpenGL 3 und GLSL durchzuführen. Ich brauche eine orthographische Projektion, um 2D-Grafiken zu zeichnen, also habe ich diesen einfachen Code geschrieben:

%Vor%

Auf dem Bildschirm werden die Werte angezeigt, die glm :: ortho erzeugt hat:

%Vor%

Wie ich weiß, ist das nicht die richtige Reihenfolge für die Werte in OpenGL, da die Multiplikation dieser Matrix mit einem Positionsvektor alle Übersetzungswerte ignoriert.

Ich habe diese Matrix mit meinem Shader und einigen Primitiven getestet und bekomme nur einen leeren Bildschirm. Aber wenn ich die Matrix wie folgt manuell modifiziere, funktioniert es gut:

%Vor%

Betrachtet man außerdem die Funktion "ortho" in der Datei "glm / gtc / matrix_transform.inl":

%Vor%

Ich habe die letzten 3 Initialisierungszeilen durch den folgenden Code ersetzt und auch ok funktioniert:

%Vor%

Dies ist ein minimaler Vertex-Shader, den ich für den Test verwende (beachte, dass in diesem Moment das uni_MVP nur die oben erklärte Projektionsmatrix ist):

%Vor%

Ich denke, das ist kein Fehler, weil alle Funktionen auf die gleiche Weise funktionieren. Vielleicht ist ein Problem meines C ++ - Compilers, der die Reihenfolge von mehrdimensionalen Arrays invertiert? Wie kann ich das lösen, ohne den gesamten GLM-Quellcode zu ändern?

Ich verwende die letzte Version der GLM-Bibliothek (0.9.1) mit Code :: Blocks und MinGW unter Windows Vista.

    
Dani 23.02.2011, 21:20
quelle

1 Antwort

22

Erstens heißt das Transponieren, nicht Inversion. Inversion bedeutet etwas völlig anderes. Zweitens, genau so soll es sein. OpenGL greift auf Matrizen in Spaltenhauptordnung zu, d. H. Die Matrixelemente müssen folgende Indizes aufweisen:

%Vor%

Aber Ihre üblichen mehrdimensionalen C / C ++ - Arrays sind normalerweise wie folgt nummeriert:

%Vor%

d. Zeilen- und Spaltenindizes werden transponiert. Ältere Versionen von OpenGL verfügten über eine Erweiterung, die es ermöglicht, Matrizen in transponierter Form zu liefern, um den Leuten das Umschreiben ihres Codes zu ersparen. Es heißt GL_ARB_transpose_matrix Ссылка

Mit Shadern ist es sogar einfacher als neue Funktionen zu verwenden. glUniformMatrix hat einen Parameter GLboolean transpose , Sie haben 3 Raten, was es tut.

    
datenwolf 23.02.2011, 21:59
quelle

Tags und Links