OpenGL ES 2.0: Verwenden von VBOs?

7

OpenGL VBOs (Vertex Buffer Objects) wurden entwickelt, um die Leistung von OpenGL zu verbessern ( in meinem Fall OpenGL ES 2.0 ). Die Logik ist, dass mit Hilfe von VBOs die Daten nicht pro Frame aus dem Client-Speicher auf die Grafikkarte kopiert werden müssen.

Aus meiner Sicht ändert sich die Spielszene jedoch kontinuierlich: Die Position von Objekten ändert sich, ihre Skalierung und Rotation ändern sich, sie werden animiert, sie explodieren, sie erscheinen oder verschwinden.

Was bringt es in einer so hochdynamischen Umgebung wie der Computerspielszene, VBOs zu verwenden , wenn die VBOs ohnehin pro Frame erstellt werden müssten?

Können Sie mir bitte helfen, zu verstehen, wie man VBOs in Computerspielen praktisch nutzt? Kann es mehr vertexbasierte VBOs geben (z. B. eines pro Objekt) oder muss für jeden Ziehzyklus immer genau nur ein VBO vorhanden sein?

Bunkai.Satori
quelle

Antworten:

13

Was bringt es in einer so hochdynamischen Umgebung wie der Computerspielszene, VBOs zu verwenden, wenn die VBOs ohnehin pro Frame erstellt werden müssten?

Wenn Sie die Scheitelpunktdaten für jedes Objekt in jedem Frame rekonstruieren, machen Sie es falsch. Oder zumindest machen Sie es wahrscheinlich ineffizient.

Das Verschieben von Objekten in einer Szene kann und sollte normalerweise durch Ändern der zum Rendern dieses Objekts verwendeten Welttransformationsmatrix erfolgen, ohne die Scheitelpunktdaten direkt zu ändern. Die Skelettanimation bietet auch vollständig auf der GPU verfügbare Lösungen. Zerlegbare Objekte können mit unterschiedlichen Transformationsmatrizen gerendert werden, sodass sie zusammen erscheinen, bis sie zerlegt werden müssen. Anschließend werden die Matrizen so angepasst, dass sie wie gewünscht aufgeteilt werden. Objekte, die nicht sichtbar sind oder nicht erzeugt wurden, müssen nicht gerendert werden, selbst wenn sich ihre Scheitelpunktdaten aus einem früheren Frame auf der Karte befinden. Sie müssen ihre Puffer nicht jedes Mal zerstören / neu erstellen, wenn ihre Sichtbarkeit umgeschaltet wird.

Können Sie mir bitte helfen, zu verstehen, wie man VBOs in Computerspielen praktisch nutzt? Kann es mehr vertexbasierte VBOs geben (z. B. eines pro Objekt) oder muss für jeden Ziehzyklus immer genau nur ein VBO vorhanden sein?

Sie können mehrere Scheitelpunktpuffer haben. Im Allgemeinen haben Sie eine pro Netz / Modell, und Sie beziehen sich auf diese einzelne Netz- / Modelldatenstruktur mit einer Sammlung von möglicherweise vielen renderbaren Objekten, die ihre eigene eindeutige Welttransformationsmatrix enthalten. Auf diese Weise benötigen Sie, wenn Sie 50 Gegner haben, die alle dasselbe Netz verwenden, dieses Netz nur einmal im Speicher. Dann haben Sie 50 kleinere, leichtgewichtige Instanzstrukturen, die sich auf dieses Netz beziehen und eine einzigartige Welttransformation enthalten, die beim Rendern jeder Instanz verwendet wird.


quelle
+1 für diese detaillierte Antwort. Ich sehe, dass ich auf die Erstellung und Vorbereitung von Szenen achten muss, damit ich keine Scheitelpunkte dupliziere. Obwohl diese Antwort für mich als akzeptierte Antwort erscheint, werde ich eine Weile warten, um zu sehen, ob ich nützlichere Antworten bekomme.
Bunkai.Satori
3

Sie können so viele VBOs haben, wie Sie möchten. Sie können auch jeden Animationsrahmen in einem VBO oder eine ganze Animation in einem VBO haben. Sie können auch die Per-Vertex-Animation verwenden, die mit denselben Daten erstellt, jedoch im Vertex-Shader (Programm) transformiert wird.

Wenn Sie die Position, Drehung oder Skalierung des Objekts ändern, wird VBO nicht geändert, sondern nur die Transformationsmatrix.

Wenn Sie also über genügend Speicher verfügen, können Sie in der Initialisierungsphase einfach alle Ihre Daten in den Grafikspeicher übertragen.

zacharmarz
quelle
+1 für diese Antwort. Ich studiere gerade einige Materialien, aber Ihre Antwort hat mich in die richtige Richtung gelenkt. Vielen Dank.
Bunkai.Satori
"Per-Vertex-Animation" bedeutet im Allgemeinen nicht, dass die Animationslogik in einem Shader ausgeführt wird, sondern nur, dass jeder Vertex animiert wird - was fast immer der Fall ist. Wollten Sie zwischen vertexbasierter Keyframe-Animation (bei der jeder Frame der Animation eine vollständige Kopie des Netzes ist und Sie zwischen ihnen mischen) und Skelettanimation (bei der Scheitelpunkte auf eine einfache Knochenhierarchie gewichtet und animiert werden) unterscheiden? Beides kann entweder auf der CPU oder der GPU erfolgen.