Ich habe den Lafortune-Shader in WebGL implementiert und meine größte Sorge gilt dieser Formel:
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:
Und das bekomme ich mit Oj = (0,0,1):
Ist das normal? Sollte das Licht entsprechend dem Wert von Oj verschoben werden?
Antworten:
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).
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:
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.quelle