2012-04-05 5 views
6

In einem neueren OpenGL gibt es keinen Matrixstapel. Ich arbeite an einer einfachen Display-Engine, und ich werde den Transformations-Stack implementieren.OpenGL: Implementieren Transformationsmatrixstack

Was ist eine gemeinsame Strategie hier? Soll ich einen Push/Pop-Stapel erstellen und ihn mit einem Baum verwenden, der mein Modell darstellt? Ich nehme an, dass dies der "alte" Ansatz ist, der in den neueren OpenGL-Versionen veraltet war. Dann ist es vielleicht nicht die beste Lösung (es aus irgendeinem Grund entfernt wurde, mir unbekannt)

+0

Es wäre interessant zu sehen, dass * Grund * Erklärung. Sowie neue bevorzugte Vorgehensweise. – Kromster

Antwort

7

(es wurde aus irgendeinem Grund entfernt)

Es wurde entfernt, weil in der modernen 3D-Anwendungen die Die gesamte Funktionalität der OpenGL-Matrixbearbeitung war hochgradig redundant. Jede moderne 3D-Anwendung muss sowieso mit Matrizen umgehen, und da OpenGL keine richtige Matrix-Math-Bibliothek ist, würden Sie sowieso etwas wie Eigen oder GSL oder etwas Homebrewn verwenden.

Ein Stapel ist immer noch eine sehr brauchbare Struktur.

+0

Ich benutze übrigens Code von 'mesa3d'. Der Matheteil kann ganz einfach extrahiert und wieder verwendet werden. –

2

Ich bin nicht besonders erfahren in diesem speziell, aber ich habe ein gutes Stück Grafik/Spiel Entwicklung gemacht. Ich habe mehr eine Idee als eine Antwort. Meiner Meinung nach sind die glPushMatrix und glPopMatrix Sachen veraltet, weil viele Entwickler die volle Kontrolle über die Transformationen haben wollten und nicht OpenGL, die sich darum kümmern. Meine Idee ist also, dass sie nicht veraltet sind, weil ein Matrix-Stack nicht der richtige Weg ist, sondern weil GL-Entwickler sich selbst um die Matrizen kümmern oder eine andere Bibliothek dafür verwenden sollten.

Mit anderen Worten, ein Matrix-Stack ist immer noch wahrscheinlich der Weg zu gehen, Sie müssen es nur selbst tun, veraltete Funktionalität verwenden oder eine externe Bibliothek verwenden.

2

Die feste Pipeline-Funktionalität war veraltet, weil sie im Wesentlichen behoben wurde.

Um neue Tricks und solche allgemein erforderlichen neuen OpenGL-Funktionen zu unterstützen, und es wurde klar, dass die Größe der OpenGL-API wachsen und immer unhandlicher werden würde, um die angeforderten Funktionen kontinuierlich zu unterstützen.

Mittlerweile wurde Hardware immer ausgefeilter und leistungsfähiger und wurde von OpenGL nicht vollständig ausgenutzt. So wurde die programmierbare Pipeline konzipiert.

Mit OpenGL3 "verwarf" die Kronos-Gruppe die feste Pipeline-Funktionalität. Dies führte zu einem großen Aufschrei, da so viel Code und so viel Talent in die etablierte feste Pipeline investiert wurde, sodass sie teilweise auf ihre Entscheidung zurückgriffen und die Profile "Kern" und "Kompatibilität" einführten. Das Kernprofil umfasst das neue programmierbare Pipeline-Modell, und das Kompatibilitätsprofil umfasst den Kern plus die meisten/alle der festen Funktionalität, so dass Anwendungen beide Modelle verwenden können.

Wir sind jetzt auf OpenGL 4.2 und das Kompatibilitätsprofil ist immer noch da und zeigt kein Anzeichen von verschwinden.

Kurz gesagt, der Grund für die Abwertung ist nicht, weil das alte Modell nicht für Anwendungsprogrammierer geeignet war; eher war es eine schwerere Belastung für die Implementierer. Das eigentliche Modell ist ziemlich solide, und viele Anwendungen/Entwickler, die die programmierbare Funktionalität verwenden, finden wieder die grundlegenden Teile der festen Funktionalität (glBegin, glEnd, Matrixstacks, Transformationsaufrufe usw.).

Also los, implementieren Sie Ihre eigenen Matrix-Stacks.Aber, wenn Sie mit einer noch besseren Idee kommen, teilen Sie es bitte mit uns :)

+1

Es ist nicht wirklich dieser Sound. Es ist furchtbar ineffizient, und Matrix Stacks sind geradezu albern. –

+0

ineffizient, OK kann ich mir vorstellen. Aber warum dumm? –

+0

Sie sind nicht albern ... wir verwenden sie die ganze Zeit in der Spieleindustrie, aber sie wird normalerweise von einer Art Szenengraphhierarchie gehandhabt. Wir verwenden normalerweise Quaternionen anstelle von Matrizen bis zum letzten Moment beim Kombinieren von Matrizen, um an die GPU zu senden, aber im Kern der Dinge werden Matrixstacks absolut immer noch verwendet, nur nicht von Hand, wie typischerweise einfache Anwendungen mit fester Funktion typischerweise dargestellt werden Tutorials und so. (und yeah, kommentieren die Dinge 2 Jahre nach der Tatsache ist die hippe Sache, jetzt zu tun-ein-Tage) – Xoorath

2

Nicht sicher, ob es irgendeinen Gebrauch zu Ihnen ist, aber ich implementierte zwei Sachen für dieses. Die erste ist eine einfache Matrix-Stack-Klasse mit allen üblichen Methoden und die zweite ist eine stapelbasierte RAII-Struktur, die Matrixänderungen mit geschweiften Klammern erlaubt, dh bei der Konstruktion speichert sie einen Verweis auf den Matrix-Stack und bei der Zerstörung stellt sie die Matrix wieder her Zurück zum vorherigen Zustand. So können Sie schreiben:

MatrixStack stack; 

stack.push(rotate...) 
stack.push(translate...) 

{ 
    MatrixScope(stack); 

    stack.push(rotate...)  
} 

... back to previous stack state. 

Und um das hinzuzufügen, ist es nur für die Bequemlichkeit mit bestimmten Arten von Transformationen. Im Allgemeinen für Modelle, die aus einer Baumstruktur von Gittern zusammengesetzt sind, die alle relativ zueinander transformiert sind, werde ich die Matrizen vom Wurzelknoten abwärts kombinieren, bevor ich etwas mit dem Modell mache. Jedes Netz hat also eine lokale Transformation und eine globale Transformation, wobei die globale Transformation die tatsächliche Transformation für dieses Netz relativ zum Wurzelknoten ist. Sie müssen also keinen Matrixstack verwenden.

Es ist ein bisschen anders, wenn Sie einen Teil des Gitters unabhängig vom Rest animieren wollen, deshalb speichere ich auch die lokale Transformation, anstatt sie wegzuwerfen.