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?
Antworten:
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).
quelle
Was sind die Alternativen? Eine Alternative besteht darin, Geometrie-Shader zu verwenden , ein
GL_LINES_ADJACENCY
Primitiv (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_TRIANGLES
undGL_TRIANGLE_STRIP
mit 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.
quelle
glMultiDrawArraysIndirect
es GPU-Seite tun. Was Sie tun können, aber es begrenzt die Hardware.