Was ist verzögertes Rendern?

54

Ich habe von verzögertem Rendern gehört und wie die Verwendung es "viele" Lichter in einer Szene ohne großen Leistungseinbruch ermöglichen kann, aber was ist es und wie wird es (von einem hohen Niveau aus) implementiert?

Tetrade
quelle

Antworten:

55

Das bestimmende Merkmal des verzögerten Renderns ist, dass es die Komplexität des Szenenrenderns von O (Geometrie * Lichter) in O (Geometrie + Lichter) wesentlich ändert.

Dies wird erreicht, indem die Szene zunächst mit Shadern gerendert wird, die für die Ausgabe grundlegender Attribute wie (mindestens) Position *, normale und diffuse Farbe ausgelegt sind. Andere Attribute können spiegelnde Werte pro Pixel und andere Materialeigenschaften umfassen. Diese werden in Vollbild-Rendering-Zielen gespeichert, die zusammen als G-Buffer bezeichnet werden.

(*: Es ist erwähnenswert, dass Entwickler sich häufiger dafür entscheiden, Tiefe zu speichern und diese zum Rekonstruieren der Position zu verwenden, da die Verfügbarkeit von Tiefe für so viele andere Effekte nützlich ist. )

Sobald der G-Buffer generiert wurde, ist es möglich, ein vollständig beleuchtetes Ergebnis für jedes Pixel auf dem Bildschirm zu berechnen, indem die BRDF genau einmal pro Pixel und Licht aufgelöst wird. Mit anderen Worten, wenn Sie über 20 Maschen verfügen, von denen jede von 20 Lichtern beeinflusst wird, müssen Sie beim herkömmlichen Rendern ("vorwärts") die einzelnen Maschen mehrmals neu rendern, um das Ergebnis der einzelnen Lichteffekte zu akkumulieren. Im schlimmsten Fall wäre dies ein Draw Call pro Mesh pro Licht oder 400 Draw Calls insgesamt! Bei jedem dieser Draw-Aufrufe transformieren Sie die Scheitelpunkte des Netzes redundant neu. Es besteht auch die Möglichkeit, dass Sie Pixel schattieren, die vom Licht nicht beeinflusst werden oder im Endergebnis nicht sichtbar sind (da sie von anderen Geometrien in der Szene verdeckt werden). Jedes dieser Verfahren führt zu einer Verschwendung von GPU-Ressourcen.

Vergleich mit verzögertem Rendern: Sie müssen die Maschen nur einmal rendern, um den G-Puffer aufzufüllen. Danach rendern Sie für jedes Licht eine Begrenzungsform, die den Umfang des Lichteinflusses darstellt. Bei einem Punktlicht kann es sich um eine kleine Kugel handeln, bei einem gerichteten Licht um ein Vollbild-Quad, da die gesamte Szene betroffen ist.

Wenn Sie dann den Pixel- / Fragment-Shader für das Begrenzungsvolumen dieses Lichts ausführen, lesen Sie die Geometrieattribute an der entsprechenden Position in den G-Puffer-Texturen und verwenden diese Werte, um das Beleuchtungsergebnis zu bestimmen. Nur die Szenenpixel, die im Endergebnis sichtbar sind, werden schattiert, und sie werden genau einmal pro Licht schattiert. Dies ist eine potenziell enorme Einsparung.

Es ist jedoch nicht ohne Nachteile. Es ist ein Paradigma, das sehr schwer zu erweitern ist, um mit transparenter Geometrie umzugehen (siehe: Tiefenschälen). Tatsächlich ist dies so schwierig, dass praktisch alle verzögerten Rendering-Implementierungen auf das Forward-Rendering für die transparenten Teile der Szene zurückgreifen. Das verzögerte Rendern verbraucht auch viel VRAM und Frame-Buffer-Bandbreite, was dazu führt, dass Entwickler große Anstrengungen unternehmen, um G-Buffer-Attribute geschickt zu packen und in die kleinstmöglichen / kleinstmöglichen Komponenten zu komprimieren.

Neverender
quelle
8

Das verzögerte Rendern, auch als verzögerte Schattierung bezeichnet, bezieht sich auf eine Vielzahl von möglichen Renderpfaden, in denen Zwischenergebnisse in Texturen gespeichert und die Rendergleichung später durch Abtasten der Zwischendaten vervollständigt werden.

Geometriepuffer sind ein frühes Beispiel, bei dem die Szene in eine Reihe von Puffern gerendert wird, die z. B. die Position, die Normale und die Basistextur einer undurchsichtigen Geometrie enthalten. Die Beleuchtung wurde nicht angewendet, und die endgültige Farbe ist nicht bekannt. In nachfolgenden Durchgängen werden Lichter gerendert und die Geometriepuffer abgetastet. Dies bedeutet, dass eine große Anzahl von Lichtern mit festen Kosten für die Anzahl von Lichtern gerendert werden kann, die möglicherweise auf einem Bildschirmpixel sichtbar sind. Beim herkömmlichen Rendern wären alle Lichtquellen auf Oberflächen untersucht worden, die verdeckt und auf dem Bildschirm nicht zu sehen waren.

Es gibt viele Variationen, einschließlich der ersten Wiedergabe von Lichtinformationen.

Weitere Informationen finden Sie unter: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading

Vincent Scheib
quelle
-3

Das verzögerte Rendern wird dort verarbeitet, wo sich die Geomtrie befindet, bevor ein zweiter Durchgang durchgeführt wird, um alles zu schattieren. Dies ist nützlich, da die Koplexität in O (Pixel * Lichtquellen) geändert wird, sodass Sie komplexe Szenen mit nur geringen Leistungseinbußen verwenden können.

Die Implementierung ist ziemlich einfach. Für den ersten Durchgang müssen mindestens Abstand, Normal und Farbe gerendert werden. Sie können auf Kosten des Arbeitsspeichers weitere Texturen hinzufügen, um sie wie Spiegelbilder zu rendern und zu positionieren.

Sobald Sie diese gerendert haben, rendern Sie einige Kugeln, bei denen sich eine einzigartige Lichtquelle in der Mitte jeder befindet, addieren das Licht, schneiden alles auf die Geometrie in Ihrer Szene zu und wenden schließlich die Abnahme an.

hellol11
quelle
Ich denke nicht, dass dies den Antworten etwas Neues hinzufügt. Es sieht aus wie umformulierte Teile von Neverenders Antwort.
HolyBlackCat
@HolyBlackCat Es gibt ein paar wichtige Unterschiede. Erstens gibt es die richtige Komplexitätsgleichung, und zweitens ist sie viel prägnanter, und gleichzeitig wird erklärt, wie sie tatsächlich implementiert wird.
Hellol11
there's the correct complexity equationWahr. Aber ich würde sagen, das ist ein kleines Detail. Sie können dies als Bearbeitung für die andere Antwort vorschlagen oder einen Kommentar dazu hinterlassen, sobald Sie über einen ausreichenden Ruf verfügen. Eine neue Antwort zu geben, ist ein bisschen übertrieben. it's much more concisePersönlich finde ich das nicht gut. Je mehr nützliche Details eine Antwort hat, desto besser ist sie, nicht wahr?
HolyBlackCat
1
@HolyBlackCat Bis zu einem gewissen Punkt, ja. Persönlich mag ich es nicht, durch eine Textwand gehen zu müssen, nur um eine einfache Frage zu beantworten.
Hellol11