Gibt es noch Vorteile bei der Verwendung von gl_quads?

10

OK, ich verstehe, dass gl_quads veraltet sind und wir sie daher nicht mehr verwenden sollen. Ich verstehe auch, dass ein moderner PC beim Ausführen eines Spiels mit gl_quads tatsächlich zwei Dreiecke zeichnet.

Jetzt habe ich gehört, dass ein Spiel stattdessen mit Dreiecken geschrieben werden sollte. Aber ich frage mich, ob es aufgrund der Besonderheiten, wie OpenGL dieses Quad in zwei Dreiecke zerlegt, jemals vorteilhaft ist, immer noch Quads zu verwenden?

Insbesondere rendere ich derzeit viele nicht verbundene Quads aus ziemlich großen Pufferobjekten. Einer der Bereiche, in denen ich vorsichtig sein muss, ist, wie groß der Vektor der Floats ist, die ich zum Erstellen / Aktualisieren dieser Pufferobjekte verwende (ich habe einige zusätzliche Float-Werte pro Scheitelpunkt und viele Scheitelpunkte in einem Puffer - die Die größten Puffer sind ca. 500 KB groß.

Wenn ich also meine Pufferobjekte zum Zeichnen von Dreiecken ändere, werden diese Scheitelpunktdaten um 50% größer (sechs Scheitelpunkte zum Zeichnen eines Quadrats anstelle von 4) und die Generierung der CPU dauert 50% länger.

Wenn gl_quads noch funktionieren, bekomme ich hier einen Vorteil, oder wird der 50% zusätzliche Speicher und die CPU-Zeit noch für die automatische Konvertierung von OpenGL in zwei Dreiecke verwendet?

user27018
quelle
5
Ich bin sicher, OpenGL unterstützt eine Art indizierten Scheitelpunktpuffer, dh Sie speichern nur die gleichen 4 Scheitelpunkte für ein Quad, und anstatt ganze Scheitelpunkte zu wiederholen, um die beiden Dreiecke zu bilden, wiederholen Sie nur die Indizes: [0,1,2] , [2,3,0]
Tolle Antwort hier
Bobobobo
Ich glaube, dass die GL-Spezifikation noch einige Fälle vorsieht, in denen das Zeichnen als Quad wichtig ist, z. B. mit glPolygonMode (..., GL_LINE).
Maximus Minimus

Antworten:

5

Testen Sie Ihr aktuelles Spiel. Wenn Quads schneller sind, verwenden Sie diese. Wenn nicht, nicht.

Man kann argumentieren, dass sie in einigen Fällen langsamer sind, weil einige Hardware Quads nicht unterstützt, so dass der Treiber viel Arbeit leisten muss, um Quad-Draw-Aufrufe zu "reparieren". Einige Hardwarekomponenten unterstützen Quads und teilen die Dreiecke in einem Eingabeschritt mit fester Funktion auf, sodass kein nennenswerter Overhead entsteht. Es gibt auch Fragen dazu, wie Quads indiziert oder nicht indiziert eingereicht werden, wie Sie angesprochen haben, und welche die begrenzte Busübertragungsbandbreite und die CPU-Generierungszeit besser nutzen. Volksweisheit sagt, Quads zu vermeiden, was ein guter Rat ist, wenn Sie von nichts ausgehen, vielleicht nicht so sehr, wenn Ihr Code bereits funktioniert. Volksweisheit besagt, dass viele Dinge die Leistung ermorden, obwohl echte, leistungsfähige Spiele diese Dinge tun.

Kurz gesagt, testen. Gehen Sie nicht davon aus und fragen Sie das Internet nicht nach Leistungsempfehlungen. Manchmal haben wir vielleicht Recht, aber häufiger geben wir Ihnen entweder veraltete Daten, Daten, die auf bestimmten Umständen basieren, in denen Sie sich nicht befinden, oder direkten Müll, den wir selbst aus zweiter Hand aus dem Internet oder von Kollegen (die möglicherweise selbst nicht stammen) erworben haben Erfahrung aus erster Hand haben).

Sean Middleditch
quelle
3

Was sind die Alternativen? Eine Alternative besteht darin, Geometrie-Shader zu verwenden , ein GL_LINES_ADJACENCYPrimitiv (4 Eckpunkte) zu übergeben und die GS dieses Primitiv in einen Dreiecksstreifen umwandeln zu lassen. Das Rendern wird jedoch langsamer sein, da man davon ausgehen sollte, dass Geometrie-Shader immer langsamer zu rendern sind.

Eine bessere Methode ist die Verwendung von indiziertem Rendering. Hier haben Sie zwei Alternativen: GL_TRIANGLESund GL_TRIANGLE_STRIPmit primitivem Neustart. Letzteres führt zu einem etwas kürzeren Indexpuffer (ein Index für jedes Quad). Sie können denselben Indexpuffer für jedes Quad-Rendering wiederverwenden, sodass Sie den Indexpuffer nicht aktualisieren oder ändern müssen.

Ich würde auch vorschlagen, vorzeichenlose Shorts als Indextyp zu verwenden. Wenn Sie mehr als 16384 Quads gleichzeitig rendern müssen, führen Sie mehrere Renderaufrufe durch und verwenden Sie glDrawElementsBaseVertex , um die Indizes zu versetzen.

Nicol Bolas
quelle
Einige kürzlich von mir durchgeführte Benchmarking-Tests haben gezeigt, dass glMultiDrawArrays jetzt sowohl auf NV als auch auf AMD ein schneller Weg ist (hat sich nicht um Intel gekümmert), daher gibt es eine andere Option - glMultiDrawArrays mit Lüfter oder Streifen.
Maximus Minimus
@ mh01: Dies erfordert ein clientseitiges Array von Zeichenbefehlen. Sie müssten glMultiDrawArraysIndirectes GPU-Seite tun. Was Sie tun können, aber es begrenzt die Hardware.
Nicol Bolas