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?
quelle
Antworten:
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.
quelle
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
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.
quelle
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.
quelle
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.
quelle