Lichtausbreitungsvolumen: Anisotrope Filterung von Volumendaten

9

Ich habe den Algorithmus für kaskadierte Lichtausbreitungsvolumina (noch keine indirekte Abschattung) für die hier und hier beschriebene diffuse globale Echtzeitbeleuchtung implementiert . Es funktioniert gut, aber ich versuche immer noch, ein bestimmtes Artefakt zu reparieren.

Kurze Zusammenfassung

Sie können dies überspringen, wenn Sie bereits wissen, wie der Algorithmus funktioniert.

Der Algorithmus speichert Beleuchtungsinformationen in Form von sphärischen Harmonischen in einem 3D-Gitter, wobei die Daten in jeder Zelle des Gitters zunächst aus dem Rendern einer erweiterten Schattenkarte ( reflektierende Schattenkarte) stammen), der neben der Tiefe auch Farbe und normale Informationen enthält. Die Idee ist, dass im Wesentlichen alle Pixel, die von einer Lichtquelle gesehen werden, die Ursache für den ersten Abprall der indirekten Beleuchtung sind. Sie speichern also die erforderlichen Informationen neben dem normalen Tiefenpuffer, den Sie für die Schattenzuordnung verwenden, und tasten alle Daten ab, um das 3D-Gitter zu initialisieren . Die Informationen im 3D-Gitter werden dann iterativ weitergegeben, indem (für jede Iteration) die Informationen in einer Zelle an alle 6 direkten Nachbarn (oben, unten, links, rechts, oben, unten) weitergegeben werden. Um die Szene anhand der Informationen im Raster zu beleuchten, wenden Sie einen Vollbilddurchlauf über Ihre Szene an. Für jedes gerasterte Pixel steht Ihnen die Weltraumposition der gerasterten Oberfläche zur Verfügung (z. B. von G-Buffers in verzögerter Schattierung) wissen, zu welcher Zelle des Gitters ein bestimmtes Pixel auf dem Bildschirm gehört.

Dies funktioniert größtenteils einwandfrei. Hier sind zwei Bilder ohne simulierten GI und nur einen fest codierten Umgebungsbegriff und daneben ein Bild mit dem LPV-Algorithmus. Beachten Sie farbige Reflexionen auf Oberflächen, bessere Tiefendetails usw.

Geben Sie hier die Bildbeschreibung ein

Problem

Beim Nachschlagen der Zellen während der Beleuchtungsphase wird die trilineare Interpolation (unter Verwendung von Hardwaretexturfiltern) verwendet, um Daten zwischen dem Zentrum einer Zelle, ihren Nachbarzellen und der tatsächlich nachgeschlagenen Texturkoordinate reibungslos zu interpolieren. Im Wesentlichen ahmt diese Interpolation die Ausbreitung der Beleuchtungsinformationen in der Mitte einer Zelle zu den konkreten Pixeln um die Mitte nach, in der die Informationen nachgeschlagen werden. Dies ist erforderlich, da sonst die Beleuchtung sehr rau und hässlich aussehen würde. Da die trilineare Interpolation jedoch nicht die Richtung der Lichtausbreitung von Lichtinformationen berücksichtigt, die in einer Zelle codiert sind (denken Sie daran, es ist in sphärischen Harmonischen), kann das Licht falsch auf das nachgeschlagene Pixel übertragen werden. Zum Beispiel, wenn sich die in der Zelle codierte Strahlung nur in Richtung (1,0,0) ausbreitet ("

Dies führt zu Lichtblutungen durch Wände, wenn die Zellengrößen im Raster im Vergleich zu den Oberflächen in der Szene groß sind (dies ist erforderlich, da Sie große Zellen benötigen, um Licht mit möglichst wenigen Ausbreitungsiterationen weit in die Szene zu verbreiten). So sieht es aus:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können (anhand der Schattenumrisse oben rechts), wird die Szene von einer gerichteten Lichtquelle irgendwo über der Szene oben links beleuchtet. Und da es nur eine Zelle gibt, die die Außenseite des Atriums von der Innenseite trennt, blutet das Licht durch und die Wand links wird falsch beleuchtet.

Aktuelle Frage

Der Autor schlägt eine Form der manuellen anisotropen Filterung vor, um dies zu beheben. Er gibt einen Strahlungsgradienten (ich nehme die von der aktuellen Zelle abgetasteten SH-Koeffizienten an) in Richtung der Oberflächennormalen n an als:

Geben Sie hier die Bildbeschreibung ein

Und Staaten

Durch Vergleichen der Strahlungsrichtungsableitung mit der tatsächlichen Strahlungsrichtung kann somit berechnet werden, ob die Strahlungsverteilung weiter als ihre trilineare Interpolation für diesen Punkt beginnt.

Meine Fragen):

In der Gleichung scheint die Funktion c (x) die SH-Koeffizienten am Punkt (x) zu sein. Der Strahlungsgradient scheint also wie eine normale numerische Ableitung als gewichtete Differenz der SH-Koeffizienten an den Punkten x - (n / 2) und x + (n / 2) berechnet zu werden. Was ist jedoch c (x) in meinem Kontext? Derzeit gehe ich davon aus, dass c (x) sich auf die trilinear interpolierten Koeffizienten an der Oberflächenposition (x) bezieht, bin mir aber überhaupt nicht sicher, da ich nicht weiß, wie das Ihnen mehr Informationen über die Richtung geben soll Verteilung der SH-Koeffizienten.

Und wie wird dieser Gradient dann verwendet, um genau zu ändern, wie die von der Zelle abgetastete Beleuchtung auf die Oberflächen angewendet wird? Der Autor schreibt nur "Vergleichen der Strahlungsrichtungsableitung mit der tatsächlichen Strahlungsrichtung", aber das ist ziemlich vage.

Er erwähnt die Verwendung eines "zentralen Differenzierungsschemas" und verweist auf diese Folien für die zentrale Differenzierung von SH-Koeffizienten sowie auf dieses Papier, das die Ableitungen des Gradienten zeigt, aber im Moment kann ich daraus keine nützlichen Schlussfolgerungen ziehen.

TravisG
quelle

Antworten:

4

Der zentrale Unterschied wurde durch ein AMD-Papier eingeführt, als sie eine Demo mit Kristallfliegen in einem Tunnel aus dem Gedächtnis machten.

Die cFunktion muss nicht präzise sein, sondern nur eine Vorstellung von beispielsweise der Ausstrahlung. Bewerten Sie den SH also einfach anhand Ihrer aktuellen Normalen.

Was Sie dann damit machen, ist, dass Sie unter Verwendung eines empirischen Faktors die Ausstrahlung unter Verwendung dieses Differentials herabsetzen. Sie können jedoch nur dann nachlassen, wenn das Differential impliziert, dass der Lichtfluss von Ihrer aktuellen Normalität abweicht.

Grundsätzlich besteht die Idee darin, empirisch zu erkennen, dass der Lichtfluss langsam abnimmt, wenn Sie in die Richtung gehen, die der Normalen Ihrer Wand entgegengesetzt ist, da er sich in der Luft (auf der anderen Seite) ausbreitet. Wenn Sie jedoch ein wenig vor Ihrer normalen Sonde prüfen, werden Sie einen plötzlichen Abfall des Flusses bemerken. Dies bedeutet, dass die Zelle, die Sie jetzt abtasten, tatsächlich ein Leck ist.

Ich habe festgestellt, dass es in 70% der Fälle funktioniert, aber wenn es unachtsam angewendet wird, kann es sehr seltsame Effekte von Schwarzen Löchern oder Farbtonverschiebungen (rosa, grün ...) in sehr dunklen Bereichen erzeugen, die andernfalls ein Lichtleck enthalten. Dies liegt daran, dass Sie für jede Farbe 3 LPV haben. Der zentrale Unterschied führt tendenziell zu unterschiedlichen Ergebnissen. Wenn Sie in der Lage sind, versuchen Sie, die Graustufenhelligkeit zu verwenden, um den zentralen Differenzdämpfer zu bewerten, und verwenden Sie später einen gemeinsamen Reduktionsfaktor für alle Farbkanäle.

Ohne diesen Hack sollten Sie normalerweise sowieso nicht viel Strahlung bekommen, da die Norm, die Sie zur Bewertung des SH verwenden, der Flussrichtung entgegengesetzt ist. Wie Sie jedoch bemerken, reichen die in LPV verwendeten 2-Band-SH tatsächlich nicht aus und haben eine starke Gleichstromkomponente, die diese starken Lecks verursacht. Aus diesem Grund ist LPV für Geometrien, die von einem LPV-fähigen Künstler nicht streng kontrolliert werden, unpraktisch. Dadurch erhält jede Wand eine minimale Dicke, um Leckagen zu reduzieren.

Einige Unternehmen (wie Square Enix) verwenden auch manuell entworfene Blockerwände, um die Lecks zu beseitigen, wie es das Geometrievolumen geben sollte. (Das Geometrievolumen hilft, die Lecks zu reduzieren, aber die RSM-Retroprojektion zur Voxelisierung der Szene ist in den meisten Fällen zu partiell und erzeugt ein Aliasing auf LPV-Zellebene, wodurch die Lecks noch schlechter aussehen, weil sie die Intensität merkwürdig variieren.)

Sie können es nur aufsaugen und versuchen, die Probleme zu mildern, indem Sie LPV ein weniger starkes Endwort für das endgültige indirekte Licht geben, einen konstanten Term mit einem Gewicht (0,5?) Verwenden und das LPV zu den verbleibenden 0,5 des indirekten Lichts beitragen könnte Licht. Versuchen Sie auch, das Geometrievolumen zu implementieren, da dies das Problem verringert. Und schließlich der zentrale Unterschied.

v.oddou
quelle
Als Verbesserung gegenüber 50% der konstanten Umgebung kann eine Technik namens "Umgebungs-BRDF" (von Tri-Ace) verwendet werden.
v.oddou