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 mehr3n
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.