Reflektierende Schattenkarten: Teil 1

Bild

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.

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

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

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

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

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

Optional
Die 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 .

Source: https://habr.com/ru/post/de440488/


All Articles