
Hallo Habr! Ich präsentiere Ihnen die Übersetzung des Artikels
„Reflective Shadow Maps“ von Eric Polman.
Reflective Shadow Maps (RSM) ist ein Algorithmus, der die „einfache“
Schattenkarte erweitert . Der Algorithmus berücksichtigt das nach dem ersten Treffer auf der Oberfläche gestreute Licht (
diffus ). Dies bedeutet, dass Sie neben der direkten Beleuchtung auch eine indirekte Beleuchtung erhalten. In diesem Artikel werde ich den Algorithmus aus einem
offiziellen Artikel analysieren, um ihn menschlich zu erklären. Ich werde auch kurz über
Shadow Mapping sprechen.
Schattenzuordnung
Shadow Mapping (SM) ist ein Algorithmus zur Schattenerzeugung. Gemäß dem Algorithmus speichern wir die Entfernung von der Lichtquelle zum Objekt in der Tiefenkarte.
Abbildung 1 zeigt ein Beispiel einer Tiefenkarte. Es speichert den Abstand (Tiefe) für jedes Pixel.
Abbildung 1: Dieses Bild zeigt eine Tiefenkarte. Je näher das Pixel ist, desto heller ist es.Wenn Sie also eine Tiefenkarte in Bezug auf die Lichtquelle haben, zeichnen Sie die Szene in Bezug auf die Kamera. Um festzustellen, ob ein Objekt beleuchtet ist, überprüfen Sie den Abstand von der Lichtquelle zum Objekt. Wenn der Abstand zum Objekt größer ist als der in
der Schattenkarte gespeicherte Wert (Tiefe), befindet sich das Objekt im Schatten. Dies bedeutet, dass das Motiv nicht beleuchtet werden sollte.
Abbildung 2 zeigt ein Beispiel. Sie führen diese Überprüfungen für jedes Pixel durch.
Abbildung 2: Der Abstand von der Lichtquelle zum Pixel im Schatten ist größer als der in der Schattenkarte gespeicherte Abstand.Reflektierende Schattenabbildung
Nachdem Sie das Grundkonzept der
Schattenzuordnung verstanden haben , fahren wir mit der
reflektierenden Schattenzuordnung (RSM) fort. Dieser Algorithmus erweitert die Funktionalität von „einfachen“
Schattenkarten . Zusätzlich zu den
Tiefendaten speichern Sie auch die
Position des Weltraums (im Weltkoordinatensystem), die Weltraumnormalen und den
Fluss (Lichtleistung). Ich werde erklären, warum Sie diese Daten benötigen.
Daten
Weltraumposition
Im
RSM -Weltraum muss die Position gespeichert werden, um den Abstand zwischen den Pixeln zu bestimmen. Dies ist nützlich für die Berechnung der Lichtschwächung. Licht verblasst (wird weniger konzentriert), wenn eine bestimmte Entfernung vergeht. Der Abstand zwischen zwei Punkten im Raum wird zur Berechnung der Lichtintensität verwendet.
Normal
Normalen (Weltraum) werden verwendet, um die Reflexion von Licht von einer Oberfläche zu berechnen. Im Fall von
RSM werden sie auch verwendet, um zu bestimmen, ob ein gegebenes Pixel eine Lichtquelle für ein anderes Pixel ist. Wenn die beiden Normalen praktisch zusammenfallen, geben sie sich nicht viel reflektiertes Licht.
Lichtstrom (Lichtstrom)
Fluss ist die Lichtintensität einer Lichtquelle. Die Maßeinheit ist
Lumen , ein Begriff, den Sie derzeit auf Glühbirnenpaketen sehen können. Der Algorithmus speichert den
Fluss für jedes Pixel, während eine Schattenkarte gezeichnet wird.
Der Fluss wird berechnet, indem die Lichtintensität mit dem Reflexionskoeffizienten multipliziert wird. Für
gerichtetes Licht erhalten Sie ein gleichmäßig beleuchtetes Bild. Bei
Scheinwerfer berücksichtigen Sie auch den Einfallswinkel. Die Dämpfung und der Empfangskosinus (zwischen Normal- und Lichtvektor) werden nicht berücksichtigt, da dies bei der Betrachtung der indirekten Beleuchtung berücksichtigt wird. Dieser Artikel behandelt nicht die Details.
Abbildung 3 zeigt die Texturen für
Scheinwerfer aus einem offiziellen Artikel.
Abbildung 3: Die vier in RSM enthaltenen Karten sind dargestellt. Von links nach rechts: Tiefenkarte, Weltraumposition, Weltraumnormal, Fluss.Datenanwendung
Nachdem die Daten (theoretisch) generiert wurden, ist es Zeit, sie auf das endgültige Bild anzuwenden. Wenn Sie das endgültige Bild zeichnen, berechnen Sie den Effekt jeder Lichtquelle auf jedes Pixel. Neben der einfachen Beleuchtung von Pixeln mit Lichtquellen verwenden Sie jetzt auch die
Reflective Shadow Map .
Ein naiver Ansatz zur Berechnung des Beleuchtungsbeitrags besteht darin, alle Texel in
RSM zu durchlaufen. Sie überprüfen, ob das Licht des Texels im
RSM auf das Pixel trifft, das Sie zählen. Dies geschieht unter Verwendung von Weltraumpositionen und Weltraumnormalen. Sie berechnen die Richtung von der Weltraumposition im
RSM- Texel zum Pixel. Dann vergleichen Sie es mit dem Normalen unter Verwendung des Skalarprodukts von Vektoren. Jeder positive Wert bedeutet, dass das Pixel mit einem
Fluss beleuchtet werden muss, der in
RSM gespeichert ist.
Abbildung 4 zeigt diesen Algorithmus.
Abbildung 4: Demonstration des Beitrags der indirekten Beleuchtung basierend auf Weltraumpositionen und Normalen.Schattenkarten (und
RSMs ) sind von Natur aus groß (512 x 512 = 262144 Pixel), sodass die Überprüfung jedes Texels alles andere als optimal ist. Stattdessen ist es am besten, eine bestimmte Anzahl von Proben aus der Karte zu erstellen. Die Anzahl der Beispiele hängt davon ab, wie leistungsfähig Ihre Hardware ist. Eine unzureichende Anzahl von Proben kann zu Artefakten wie Streifen oder Flimmern führen.
Die Texel, die das Beleuchtungsergebnis am meisten beeinflussen, sind dem berechneten Pixel am nächsten. Die Abtastmethode, bei der die meisten Abtastungen in der Nähe der Pixelkoordinaten erfasst werden, liefert bessere Ergebnisse. Diese Methode wird als
"Wichtigkeitsabtastung" bezeichnet . Der offizielle Artikel beschreibt, dass die Abtastdichte mit dem Quadrat der Entfernung von dem Pixel, das wir berechnen, abnimmt.
Wir müssen auch die Intensität der Proben unter Berücksichtigung eines Faktors skalieren, der von der Entfernung abhängt. Dies ist auf die Tatsache zurückzuführen, dass die weiter entfernten Texel, obwohl sie seltener abgetastet werden, in Wirklichkeit die gleiche Menge an Fluss beeinflussen. Daher müssen Sie in entfernten Pixeln die Intensität erhöhen, um die Ungleichung auszugleichen, während Sie eine kleine Anzahl von Abtastwerten beibehalten.
Abbildung 5 zeigt, wie dies funktioniert.
Abbildung 5: Wichtigkeitsstichprobe. Es werden mehr Proben aus der Mitte entnommen und die Proben werden basierend auf ihrem Abstand vom Mittelpunkt um einen Faktor skaliert. Adaptiert aus einem Artikel über RSM .OptionalDie Projektion des aktuellen Pixels auf die Schattenkarte wird als Punkt (s, t) genommen. Und die Abtastkoordinaten relativ zu (s, t) werden im Voraus berechnet und als Array an den Shader übertragen.
Sie sollten die Probe als Punktbeleuchtungsquelle behandeln. Sie verwenden den
Flusswert als
Lichtfarbe und nur die Lichtquellen, die sich gegenüber dem Pixel befinden.
Fazit
Der
offizielle Artikel beschreibt detaillierter andere Optimierungen dieses Algorithmus, aber ich werde darauf eingehen. Im Abschnitt
Bildschirm-Raum-Interpolation wird beschrieben, wie Sie die Produktivität steigern können. Ich denke jedoch, dass die
Stichprobenerfassung wichtig sein wird, um zu beginnen.
Der
zweite Teil stellt die Implementierung von
RSM vor .