Ich versuche, mehr über Vertex-Arrays und Vertex-Buffer-Objekte zu erfahren , verstehe die Unterschiede jedoch nicht in Bezug auf:
- Anwendungsfall (statische Geometrie wie Terrains, Geometrie, die jeden Frame wie ein Partikelsystem ändert usw.)
- Performance
- Portabilität (alte Grafikkarte, Konsolen, Geräte wie Android oder iPhone usw.)
einige Klarstellungen?
Antworten:
Hier ist ein anständiger Bericht über VBOs.
Performance
Hier ist eine gute Übersicht über die Aufrufsemantik.
Hier finden Sie einen weiteren guten Überblick über Leistungsprobleme. Darin sehen wir, dass VBOs performanter sind als Arrays.
Der Grund, warum wir VBOs bevorzugen, ist, dass die Daten auf die Karte geladen werden und Sie sie nicht bei jedem Frame übertragen müssen. Abhängig vom Typ des erstellten VBO können Sie dem Grafiktreiber Hinweise zur Verwendung geben (Write-Many, Read-Many vs. Write-Many, Never-Read usw.).
Verwendung
VBOs eignen sich hervorragend für statische Geometrie wie Gelände, von dem Sie nicht erwarten, dass es sich ändert, oder für instanziierte Geometrie.
Vertex-Arrays eignen sich für Daten, die sich häufig ändern, aber auch vom Host-Computer gelesen werden. Daher werden sie häufig zum direkten Rendern von Daten verwendet, die gerade bearbeitet werden (z. B. Laser-Entfernungsmesser-Datenpuffer). Wenn Sie nicht die Daten auf dem Host-Gerät lesen müssen (also nur auf die Karte schieben), sind VBOs im Nur-Schreib-Modus eine gute Option.
Portabilität
Clientseitige Vertex-Arrays Diese sind in OpenGL vor 3.0 verfügbar, in 3.0 nicht mehr unterstützt und in 3.1+ enthalten. OpenGL ES unterstützt sie (OpenGL ES 2 nicht).
VBOs Diese sind ab OpenGL 1.5 verfügbar. Dies ist die einzige Möglichkeit, Geometriedaten in OpenGL ES 2 (und damit in WebGL) zu speichern.
quelle
(Ich füge dies hier hinzu, weil die Antwort von ChrisE sehr vieldeutig ist, was leider auf die Mehrdeutigkeit der ursprünglichen Frage zurückzuführen ist. Ich gehe jedoch davon aus, dass die Frage des OP den Titel "Wann sollten VAOs verwendet werden ? " Tragen sollte und wann man VBOs benutzt ".)
V ertex B Uffer O bjects (die eigentlich nicht unähnlich sind , von anderen Arten von B Uffer O bjects, beispielsweise U niversal B Uffer O bjects) eine Einrichtung zum Hochladen von Vertexdaten an die Grafikhardware.
V ertex A rray O bjects werden zusätzlich zu verwendet VBO s zu verbessern , um clientseitige (CPU-Seite) Leistung, indem die Anzahl der Anrufe benötigten Reduzierung einzelnen Vertex - Puffer und Re-Set Vertex erneut zu binden Attribute jedes Mal , wenn Sie möchten , ändern, um auf eine bestimmte Weise zu rendern. Anstatt all das zu tun, was bei jedem Frame funktioniert, führen Sie dies einmal (bei der Initialisierung) durch und binden dann einfach den entsprechenden VAO für jeden (Satz von) Zeichenaufruf (en) neu, der die zugeordneten Scheitelpunktattribute verwendet.
Trotzdem entbindet Sie die Verwendung von VAOs nicht von der zusätzlichen Verantwortung,
glBindBuffer
+glBufferData
für Daten zu tun , die jeden Frame ändern , z. B. Positionen / Rotationen / Transformationsmatrizen von Spieleinheiten. Nur wenn Sie vollständig statische Daten haben, müssen Sie diese nurglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
rendern.quelle