OpenGLs Matrixstapel gegen Handmultiplikation

8

Dies ist effizienter, wenn Sie den Transformationsstapel von OpenGL verwenden oder die Transformationen von Hand anwenden.

Ich habe oft gehört, dass Sie die Anzahl der Statusübergänge in Ihrer Grafik-Pipeline minimieren sollten. Das Verschieben und Knallen von Übersetzungsmatrizen scheint eine große Veränderung zu sein. Ich frage mich jedoch, ob die Grafikkarte in der Lage sein könnte, den Pipeline-Schluckauf mehr als auszugleichen, indem sie ihre parallele Ausführungshardware verwendet, um die Eckpunkte in großen Mengen zu multiplizieren.

Mein spezieller Fall. Ich habe Schrift auf ein Sprite-Blatt gerendert. Die Koordinaten jedes Zeichens oder einer Zeichenfolge werden berechnet und einem Scheitelpunktpuffer hinzugefügt. Jetzt muss ich diesen String verschieben. Wäre es besser, durch den Scheitelpunktpuffer zu iterieren und jeden der Scheitelpunkte von Hand anzupassen oder vorübergehend eine neue Übersetzungsmatrix zu verschieben?

deft_code
quelle
Hängt davon ab, auf welche GL-Version Sie abzielen. Sie sind ab 3.x veraltet.
Die kommunistische Ente

Antworten:

7

Nach meinem Verständnis sind in den neuesten Versionen der Spezifikation (3.3 und 4.x) die Matrixstapel weg und Sie müssen Ihre Transformationsmatrizen von Hand verfolgen. Ich glaube, dass dies auch für die mobile (ES) Spezifikation gilt.

Wenn Sie nach einer konsistenten Möglichkeit suchen, Ihre Matrizen von Hand zu handhaben, sind Sie möglicherweise an GLM interessiert . Es ist eine hübsche, ordentliche Mathematikbibliothek (die Matrixtransformationen enthält), die der GLSL-Spezifikation nachempfunden ist, sodass Sie beim Umgang mit OpenGL-Code nur einen Satz mathematischer Routinen im Kopf behalten müssen.

Bob Somers
quelle
Kann jemand das bestätigen? Ich habe Grafikprogrammierung mit OpenGL 1.5 gelernt und dachte, ich wäre fortgeschritten, weil ich mit einigen der 2.0-Funktionen experimentiert habe. Man könnte sagen, ich bin ein bisschen aus dem Ruder gelaufen. Die Unterstützung für Übersetzungsmatrizen fallen zu lassen, scheint ein großer Nachteil zu sein.
Deft_code
1
Einfach doppelt prüfen. Ja, die Matrixstapel sind in 3.0 - 3.2 veraltet und in 3.3 und 4.x entfernt. Die Idee ist, dass Sie, da die gesamte Pipeline programmierbar geworden ist, einfach Ihre endgültige Matrix an Ihren Shader übergeben und von dort aus fortfahren. Nichts hindert Sie jedoch daran, an OpenGL 2.0 festzuhalten. Alle gewohnten Matrix-Stack-Funktionen bleiben erhalten.
Bob Somers
Beachten Sie, dass dies nicht bedeutet, dass "Unterstützung für Übersetzungsmatrizen" gelöscht wurde, @deft_code. Eine Übersetzungsmatrix ist schließlich nur eine bestimmte Menge von Gleitkommawerten. Sie können sie einfach selbst erstellen. Es geht eher um "lineare Algebra" als um den Zugriff auf die Grafik-Pipeline - beachten Sie, dass D3D auch keine analogen Funktionen hat (sie befinden sich in einer separaten Dienstprogrammbibliothek, D3DX).
1
Leichte Ergänzung: GLES 1.x ist das Analogon mit fester Funktionalität von OpenGL 1.5 (ish) und enthält die Stapel Textur, Modellansicht und Projektion. GLES 2.x ist das vollständig programmierbare eingebettete OpenGL und enthält weder die Matrixoperationen noch den Rest der Pipeline mit festen Funktionen. In GLSL gibt es also auch kein gl_Vertex / Normal / Color / etc. Wie Sie Informationen an ein Shader-Programm übergeben, liegt ganz bei Ihnen.
Tommy
3

Der Stapel ist hier die weniger optimale Option - nicht, weil das Drücken und Knallen teuer war, da er niemals eine komplexe Statusänderung auf Treiberebene hervorrufen sollte (die Matrix sollte nicht an die Karte gesendet werden, bis ein Renderbefehl ausgegeben wird , also ist es normalerweise alles CPU-seitige Manipulation in der API).

Das Problem mit dem Stack ist, dass es eine Grenze gibt, wie weit Sie ihn schieben können - es ist einer der Parameter, die Sie über glGet * erreichen können, denke ich. Es gibt keinen großen Vorteil, den Stapel zu verwenden, es sei denn, Sie haben oder sind nicht in der Lage / möchten keine Matrixmathematik schreiben. Ich würde empfehlen, es selbst zu tun.

Ich weiß nicht, wie der Zustand der Stapelfunktionen im modernen GL ist. Ich glaube, sie wurden ebenfalls veraltet / entfernt, aber ich hatte seit einiger Zeit nicht mehr die Notwendigkeit, GL tatsächlich zu verwenden, so dass ich mich nicht mehr auf dem neuesten Stand gehalten habe.


quelle
3

Wie andere angemerkt haben, ist der Matrixstapel auf dem Weg nach draußen, was ein guter Grund ist, Alternativen zu untersuchen.

In einem meiner Projekte habe ich die Matrixoperationen von OpenGL verwendet, um meine Matrizen zu berechnen, musste jedoch schließlich glGet-Funktionen verwenden, um die Matrix zurückzurufen, damit ich einige Operationen an der Matrix ausführen konnte, die von OpenGLs eigenen Funktionen nicht unterstützt wurden. Die Leistung war miserabel und ich habe den Verlust auf die einzelne glGet-Funktion zurückgeführt. Es ist möglich, dass die Matrix-Operationen tatsächlich irgendwie auf der GPU ausgeführt werden und die Verwendung von glGet zu einem Pipeline-Flush oder so führt.

Was auch immer der Grund war, ich habe die Matrixoperationen durch CML , die konfigurierbare Mathematikbibliothek, ersetzt und die Leistung dramatisch verbessert. Ich war nicht nur nicht mehr an die Leistungsmetriken der OpenGL-Matrixoperationen gebunden, CML enthielt auch Tonnen von Operationen, die OpenGL nicht unterstützt.

Und das Implementieren eines Stapels von Matrizen ist mit STL-Vektoren oder Ähnlichem ziemlich einfach.

Jari Komppa
quelle
2

Ich bin mir nicht sicher, wie viel Erfahrung Sie haben, aber ich würde empfehlen, dies von Hand zu tun. Es kann mehr Aufwand erfordern, um zu lernen, wie man das macht, aber es ist immens vorteilhaft zu wissen, was Ihre Matrizen tun, und sie selbst manipulieren zu können. Außerdem werden Sie auf Probleme aufmerksam gemacht, die beim Anwenden von Matrizen in verschiedenen Reihenfolgen auftreten können (z. B. Skalieren und Drehen). Ich weiß, dass ich viele Stunden damit verbracht habe, seltsame Render-Fehler herauszufinden, bevor ich mich entschied, meine Zeit besser damit zu verbringen, gründlich zu studieren, was jede Operation tat. Die Investition lohnt sich.

Wenn Sie Ihr spezifisches Problem angehen und eine Transformation auf die Scheitelpunkte anwenden, scheint dies der einfachste Weg zu sein. Beachten Sie lediglich die Reihenfolge der Operationen von Matrizen.

Kaunartist
quelle
1

Das Hauptproblem, das ich sehe, ist, dass Sie für andere Spielaufgaben auf die Ergebnisse zugreifen müssen und der Zugriff auf diese Ergebnisse kompliziert und langsam sein kann.

Deshalb ziehe ich es vor, diese Matrixoperationen selbst durchzuführen.

bcsanches
quelle