Wenn ich ein Modell für ein 3D-Spiel erstelle, was sollte ich in meinen Budget-Polygonen (Dreiecken) oder Eckpunkten als Maß nehmen? Ich habe ein Experiment mit zwei Mengen von 40000 Würfeln durchgeführt, eine mit 8 Eckpunkten und 12 Dreiecken, eine andere mit 24 Eckpunkten und 12 Dreiecken. Alles wurde in Unity durchgeführt und beide wurden prozedural generiert. Zu meiner Überraschung schnitten beide Sets fast gleich ab, es gab einen sehr kleinen Unterschied zwischen ihnen.
Bedeutet das, dass ich mich nicht um die Anzahl der Scheitelpunkte kümmern und nur die Anzahl der Dreiecke betrachten sollte?
BEARBEITEN: Ich habe ein weiteres Experiment durchgeführt. Ich habe eine Ebene mit 19602 Dreiecken und 10000 Eckpunkten und eine andere mit der gleichen Anzahl von Dreiecken, aber 39204 Eckpunkten erstellt. Ich habe 4000 von beiden erzeugt. Jetzt gewannen weniger Vertices 14 fps bis 19 fps. Ich denke also, im Allgemeinen ist weniger besser, aber nur in großen Unterschieden.
quelle
Antworten:
Stellen wir uns ein großes Gitternetz vor, wie wir es für das Gelände verwenden könnten. Wir rendern davon
n
Dreiecke, die etwa die Hälfte unseres 1080p-Bildschirms abdecken, in einem einzigen Draw-Aufruf.Wenn wir alle unsere Scheitelpunkte schweißen und keine Glättungs- / Texturierungsnähte haben, hat jedes Dreieck 3 Scheitelpunkte und jeder Scheitelpunkt wird von 6 Dreiecken geteilt, sodass wir
n/2
Scheitelpunkte haben.Um dies zu rendern, müssen wir:
Führen Sie den Vertex-Shader mindestens
n/2
einmal aus("Zumindest", weil unser Cache für Vertex-Ergebnisse nur so groß ist. Manchmal wird ein bereits transformierter Vertex entfernt und für ein späteres Dreieck, das ihn gemeinsam nutzt, erneut benötigt, und der Vertex-Shader wird darauf erneut ausgeführt Wir sparen also nicht so viel, wie es auf dem Papier aussieht.
Clip & Cull
n
Dreiecke.Rasterisieren und interpolieren Sie über mindestens 1920 x 1080/2 oder über 1 Million Pixel des Bildpuffers (da wir sagten, dass unser Terrain ungefähr die Hälfte des Bildschirms abdeckt).
("Zumindest", weil GPUs mit vier Pixeln arbeiten , werden einige Fragmente außerhalb der Kanten von Polygonen immer noch gerastert, aber dann maskiert, was bedeutet, dass wir Fragmente zweimal verarbeiten. Für ein holpriges Netz werden wir auch überall überzeichnet verschließt sich, wenn wir nicht das Glück haben, das vorderste Polygon zuerst in den Tiefenpuffer zu ziehen)
Führen Sie den Fragment-Shader für alle diese> = 1 Million Fragmente aus.
~ 1 Million Ergebnisse in die Rahmen- und Tiefenpuffer mischen.
Okay, jetzt wollen wir alle unsere Scheitelpunkte lösen, damit wir jetzt sechsmal mehr
3n
Scheitelpunkte rendern können als zuvor! Unsere Schritte sind ...Führen Sie die Vertex-Shader-
3n
Zeiten aus.(Keine Sternchen aufgrund von Caching, da jeder Scheitelpunkt nur einmal verwendet wird. Dies bedeutet jedoch, dass der Cache uns keine Zeit ersparen kann.)
Clip & Cull
n
Dreiecke.Rasterisieren und interpolieren Sie über mindestens 1920 x 1080/2 oder über 1 Million Pixel des Bildpuffers.
Führen Sie den Fragment-Shader für alle diese> = 1 Million Fragmente aus.
~ 1 Million Ergebnisse in die Rahmen- und Tiefenpuffer mischen.
... warte, jeder Schritt außer dem ersten ist der gleiche! Die meiste Arbeit, die die GPU in einem typischen Zeichenaufruf leistet, hängt also nicht direkt mit der Anzahl der verwendeten Scheitelpunkte zusammen. Die Höhe der Bildschirmabdeckung, Überzeichnung und die Gesamtzahl der Dreiecke machen viel mehr der Kosten aus.
Das bedeutet nicht, dass Scheitelpunkte völlig frei sind. Wenn Sie Eckpunkte gemeinsam nutzen, können Sie durch das Caching geringfügige Einsparungen erzielen, insbesondere wenn Ihre Vertex-Shader kompliziert sind oder die Vertex-Pipeline Ihrer Hardware schwach ist (wie dies bei einigen älteren Konsolen der Fall war). Angesichts der Tatsache, dass die Anzahl der Scheitelpunkte proportional zur Anzahl der Dreiecke plus oder minus eines konstanten Faktors ist, ist es in der Regel nicht so interessant, die Gesamtnetzkosten zu messen.
quelle
Weder.
Es sei denn, Sie sprechen von einer wirklich massiven Anzahl von Tris (Millionen), ist Ihnen Folgendes wichtig:
24 Eckpunkte mal 4000 Würfel ergeben 96'000 Eckpunkte.
640x380 Pixel ergeben 243'200 Fragmente, und die meisten Geräte unterstützen erheblich größere Auflösungen.
Sie können Ihr Experiment mit 1'000'000 Würfeln wiederholen, um den Draw Call-Engpass zu vermeiden (1 einzelnes Modell für 1'000 Würfel).
quelle
Wenn Sie eine WebGL-Anwendung ausführen, wird die Anzahl der Scheitelpunkte schnell zu einem Engpass in Bezug auf die Dateigröße, die Benutzer herunterladen können. Gleiche Anzahl von Dreiecken, aber häufig 2-3 mal mehr Eckpunkte als in der DCC-Software angezeigt. Ein besseres Auspacken kann in diesem Fall sehr hilfreich sein, da weniger Nähte vorhanden sind.
quelle