Was ist die Hauptverwendung von Vertex-Pufferobjekten?

8

Nach dem, was ich gelesen habe, scheinen VBOs nur der Leistung zu dienen.

Ich arbeite an einem sehr rudimentären Lernprojekt in lwjgl und versuche nur herauszufinden, in welche erweiterten Funktionen der Bibliothek ich mich vertiefen sollte und welche Verwendung sie haben.

Mein Verständnis ist, dass VBOs es einer Person ermöglichen, Scheitelpunkte im VRAM zu behalten, während sie gerade nicht in einer Szene gezeichnet werden. In meinem Fall zeichne ich nur Quads und Leistung ist wahrscheinlich überhaupt kein Problem, aber ich versuche zusammenzufügen, was unter der Haube passiert. Wenn ich Quads direkt zeichne, zeichne ich aus dem CPU-Speicher, richtig? Wenn ich keine Sichtbarkeitsprüfungen durchführe, bedeutet das dann, dass ich absolut alles in der "Szene" rendere, unabhängig davon, ob es in Sicht ist? Sind VBOs eine Möglichkeit, Objekte zu speichern und nur das zu rendern, was benötigt wird?

sensae
quelle

Antworten:

10

Pedantischer Hinweis: In OpenGL gibt es kein "Vertex Buffer Object". Es gibt einfach Pufferobjekte . Ein Pufferobjekt ist einfach ein lineares Array von GPU-Speicher, das Sie zuweisen, mit Daten füllen, aus dem Sie lesen und auf verschiedene Arten verwenden können. Mit Pufferobjekten können Sie unter anderem Scheitelpunktdaten darin speichern und als Quellarrays für das Rendern verwenden. Aber sie haben auch einige andere Verwendungszwecke .

Pufferobjekte sind kein Weg, um Kegelstumpf oder andere Konstrukte im Stil eines Szenendiagramms zu vermeiden. Bei Verwendung für Scheitelpunktdaten speichern Pufferobjekte einfach Scheitelpunktdaten. Ohne sie glDrawElements/Arrays/etcziehen Ihre Aufrufe Daten aus Arrays, die in CPU-Mitgliedspuffern gespeichert sind. Wenn Sie Pufferobjekte zum Rendern verwenden, werden die Arrays stattdessen aus dem Inhalt des Pufferobjekts gezogen.

Woher Ihre Scheitelpunktdaten stammen, ist der einzige Unterschied zwischen dem Rendern mit Pufferobjekten und dem Rendern ohne Pufferobjekte. Also kein Kegelstumpf. Keine Szenendiagrammverwaltung. Nichts. Es geht nur darum, wo Ihre Scheitelpunktdaten gespeichert werden.

Nicol Bolas
quelle
1
Ich möchte nur ein wenig klarstellen und erwähnen, dass die eigentliche Optimierung, die Sie mit VBOs vornehmen, sich auf den Bus zwischen CPU und GPU bezieht, der relativ langsam (und umstritten) ist. Wenn diese Busgeschwindigkeit vernachlässigbar wäre, gäbe es praktisch keinen Unterschied zwischen der Verwendung eines VBO und der Verwendung eines CPU-seitigen Arrays von Floats.
Notlesh
1
Beachten Sie auch, dass Ihr Treiber Pufferobjekte frei speichern kann, wo immer er möchte, auch im CPU-Speicher.
Maximus Minimus
Abgesehen davon ist es (imho) einfacher, ein VBO / VAO zu erstellen und nur Drawarrays darauf aufzurufen, als feste Pipeline-Funktionen für alle Scheitelpunkte / Flächen zu schleifen. Es ist, als würde man der Grafikkarte sagen: "Lass diese Schachtel Dreiecke durch diesen Shader laufen" anstatt "Geh und nimm diesen Scheitelpunkt, diesen Scheitelpunkt und das und mache dort drüben ein schönes glückliches kleines Dreieck. Nimm jetzt das nächste ...". Oh, warte, jetzt stehe ich mehr auf Shader als auf VBOs.
Exilyth
2

OpenGL-Array-Puffer (= das, was wir VBO nennen) dienen einem einzigen Zweck: Bewahren Sie Ihre Geometriedaten im GPU-Speicher und nicht im Client-Speicher auf, damit Sie sie nicht bei jedem Frame erneut senden müssen.

So einfach ist das :-)

Kos
quelle