Sollte der Oj-Lappen eines Lafortune-Shaders dazu führen, dass das Licht verschoben wird?

7

Ich habe den Lafortune-Shader in WebGL implementiert und meine größte Sorge gilt dieser Formel:

Geben Sie hier die Bildbeschreibung ein

Erläuterung

Kd / Ks ist die diffuse / spiegelnde Materialfarbe, ρd / ρs ist die diffuse / spiegelnde Lichtkomponente, m ist die Anzahl der Lappen (in meinem Shader verwende ich immer einen einzelnen Lappen), 𝜔o ist die Blickrichtung (vom Oberflächenpunkt aus) ), 𝜔i ist die Lichtrichtung, Oj ist der Lappen und ej ist der Glanzfaktor.
Die vollständige Referenz finden Sie hier: Eine Übersicht über Schattierungsmodelle für das Echtzeit-Rendering auf Seite 28.

Frage

Das Problem kommt mit dem Oj-Lappen. Ich habe festgestellt, dass beim Ändern des Werts von Oj das Licht von seiner ursprünglichen Position verschoben wird. Dies ist beispielsweise das, was ich mit Oj = (-1, -1,1) erhalte:

Geben Sie hier die Bildbeschreibung ein

Und das bekomme ich mit Oj = (0,0,1):

Geben Sie hier die Bildbeschreibung ein

Ist das normal? Sollte das Licht entsprechend dem Wert von Oj verschoben werden?

Ramy Al Zuhouri
quelle
Das BRDF-Modell von Lafortune wird in diesem GPU Gems-Artikel ausführlich beschrieben (einschließlich Beispielquellcode) .
MooseBoys
Ich habe auch meine Referenz hinzugefügt, um die Frage zu bearbeiten.
Ramy Al Zuhouri

Antworten:

10

Ja, absolut, es wird erwartet, dass sich das Licht irgendwie an einem anderen Ort befindet, wenn Sie die Eigenschaften des Hauptlappens ändern, ohne zu berücksichtigen, was es physikalisch bedeutet.

Die Keulen beschreiben für eine gegebene einfallende Lichtrichtung, in welche Richtungen Licht wieder emittiert wird. Hier einige Beispiele für mögliche Lappen: ein perfekter Spiegelreflexionslappen (für das Phong-Modell), ein nicht spiegelnder Lappen und ein Retroreflexionslappen (wie dies bei katadioptrischen Oberflächen der Fall ist).

Lappen

Sie kennen wahrscheinlich das Glanzlicht . Wenn die Oberfläche sehr glänzend ist, ist dies der Bereich, um den das am meisten wieder emittierte Licht das Auge des Betrachters erreicht. Dies geschieht, wenn die Lichtrichtung und die Betrachterrichtung genau reflektiert werden ( dh der Ansichtsvektor liegt nahe am obigen R- Vektor).

Im Falle einer Retroreflexion gibt es auch eine Hervorhebung, aber diese Hervorhebung befindet sich dort, wo Licht und Betrachterrichtung nahe beieinander liegen ( dh der Ansichtsvektor liegt nahe am L- Vektor).

Hier ist ein Beispiel für hervorgehobene Bereiche in diesen beiden verschiedenen Fällen:

Highlights

Wie Sie sehen können, können sich die Glanzlichter je nach Keule und auch wenn sich das Licht nicht bewegt, an sehr unterschiedlichen Orten befinden.

In Ihrem speziellen Fall haben Sie gewählt Oj = [0,0,1]. Dies bedeutet, dass unabhängig von der Richtung des einfallenden Lichts immer das meiste Licht entlang der Normalen der Oberfläche wieder emittiert wird. Mit anderen Worten, die Hervorhebung befindet sich dort, wo der Ansichtsvektor zur Oberflächennormalen zeigt . Und genau das zeigt Ihr zweiter Screenshot.

Sam Hocevar
quelle