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