Was ist der Performance-Kompromiss zwischen Forward- und Deferred-Rendering?

9

Beim Forward-Rendering wird ein Strahlungswert für ein Oberflächenfragment direkt aus der Eingabegeometrie und den Beleuchtungsinformationen berechnet. Das verzögerte Rendern teilt diesen Prozess in zwei Schritte auf: erstens einen Bildschirmraumpuffer mit Materialeigenschaften (einen Geometriepuffer oder G-Puffer), der durch Rastern der Eingabegeometrie erstellt wurde, und zweitens einen Strahlungswert für jedes Pixel durch Kombinieren des G- Puffer mit Beleuchtungsinformationen.

Das verzögerte Rendern wird häufig als Optimierung des Vorwärtsrenderings dargestellt. Eine Erklärung ist, dass die Beleuchtung ziemlich teuer ist und wenn Sie eine Überzeichnung haben, beleuchten Sie Pixel, die niemals auf dem Bildschirm angezeigt werden. Wenn Sie jedoch Materialeigenschaften in einem G-Puffer speichern und anschließend beleuchten, beleuchten Sie nur ein Pixel, das dies tut erscheinen tatsächlich auf dem Bildschirm. Ist dies tatsächlich ein Vorteil von verzögert, da Sie auch einen Tiefenvorlauf durchführen und dann einen Vorwärtsrendering-Durchlauf mit einem auf D3D11_COMPARISON_EQUALoder GL_EQUALoder einem gleichwertigen Tiefentest eingestellten Tiefentest durchführen können ?

Das verzögerte Rendern hat auch das Potenzial, auf der GPU einen besseren Zeitplan zu erstellen. Das Aufteilen einer großen Warp / Wellenfront in eine Wellenfront mit kleinerer Geometrie und dann kleinere Lichtwellenfronten verbessert später die Belegung (mehr Wellenfronten gleichzeitig im Flug). Sie haben aber auch viel mehr Bandbreitennutzung (schreiben Sie eine große Anzahl von Kanälen in den G-Puffer und lesen Sie sie dann während der Beleuchtung wieder ein). Natürlich hängen die Einzelheiten hier stark von Ihrer GPU ab, aber was sind die allgemeinen Prinzipien?

Gibt es andere praktische Überlegungen zur Leistung bei der Entscheidung zwischen vorwärtsgerichtetem und verzögertem Rendern? (Nehmen wir an, dass wir bei Bedarf Variationen jeder Technik verwenden können: dh wir können Kacheln vorwärts mit Kacheln auch verzögert vergleichen.)

John Calsbeek
quelle

Antworten:

11

Es ist möglich, ein Überziehen von undurchsichtigen Objekten auch beim Vorwärtsrendern zu vermeiden, indem ein Tiefenvorlauf durchgeführt und diese Informationen verwendet werden, um Pixel abzulehnen, die tatsächlich nicht sichtbar sind. Abhängig von den Scheitelpunktkosten Ihrer Szene kann ein Tiefenvorlauf jedoch einen inakzeptablen Leistungsaufwand verursachen. Darüber hinaus bedeutet das Rendern mit der Pixel-Shading-Pipeline der GPU, dass Sie keine Kosten pro gerendertem Pixel, sondern Kosten pro gerendertem 2x2-Pixel- Quad zahlen . Selbst wenn Sie einen Tiefenvorlauf durchführen, verschwenden Dreieckskanten immer noch Arbeitsschattierungspixel, die verworfen werden.

Die GPU-Planung ist ein komplexes Thema, und der Kompromiss zwischen Vorwärts und Zurückgestellt besteht nicht nur darin, "schneller zu laufen, sondern mehr Bandbreite zu verbrauchen". Wenn Sie zwei gleich günstige Operationen haben, die nacheinander ausgeführt werden und jeweils die gleiche Anzahl von Ressourcen verwenden, gibt es keinen Grund, sie in separate Shader aufzuteilen: Zwei kleine Wellenfronten, die jeweils X-Ressourcen verwenden, funktionieren grundsätzlich nicht besser als eine einzelne längere Wellenfront verwendet auch X-Ressourcen. Wenn Sie jedoch einen billigen Vorgang und einen teuren Vorgang haben, der nacheinander ausgeführt werden kann, kann die Aufteilung in separate Shader von Vorteil sein: Der Shader reserviert im Allgemeinen die maximale Menge an Ressourcen, die er zu jedem Zeitpunkt verwenden kann. Es' Es ist denkbar, dass beim Forward-Rendering möglicherweise nicht die gesamte Bandbreite Ihrer GPU genutzt werden kann, da sich so wenige Wellenfronten im Flug befinden, dass nicht genügend Vorgänge ausgeführt werden können, um die Bandbreite zu sättigen. Aber wenn duWenn die Bandbreite begrenzt ist, kann das verzögerte Rendern keinen Vorteil haben (da wahrscheinlich mehr Bandbreite verwendet wird).

Ein weiteres Leistungsproblem besteht darin, dass das Forward-Rendering verschiedene Materialtypen (z. B. verschiedene BRDFs) unterstützt, indem einfach ein anderer Shader für dieses Objekt verwendet wird. Ein unkomplizierter verzögerter Renderer muss unterschiedliche Materialtypen auf unterschiedliche Weise behandeln (möglicherweise ein Zweig im Shader), da die Arbeit je nach gerendertem Objekt nicht mehr kohärent in Warps / Wellenfronten gruppiert wird. Dies kann mit einem gekachelten Renderer verringert werden. Wenn nur bestimmte Bereiche des Bildschirms einen alternativen Materialtyp verwenden (z. B. für Haare), können Sie die Shader-Variante mit einem Materialtyp-Zweig nur für Kacheln verwenden, die Pixel mit diesem Material enthalten .

John Calsbeek
quelle