Das Phong-Beleuchtungsmodell (nicht zu verwechseln mit Phong Shading) ist ein einfaches lokales Beleuchtungsmodell. Es besteht aus 3 Komponenten:

Ambiente Komponente

Die Ambiente Komponente wird genutzt, um auch Objekte Leuchten zu lassen, an die kein direktes Licht kommt (da sie sonst schwarz wären).

Idee: Eine Konstante (abhängig vom Material) an jeder Stelle dazuaddieren.

Berechnung

Wir können einstellen:

  • “Ambiente Farbe” - mit welcher Farbe die Oberfläche ambient leuchten soll.

Gegeben dann noch wie viel Ambientes Licht es gibt , dann berechnet sich die ambiente Komponente an der Stelle so:

Diffuse Komponente

Mit der Diffusen Komponente lassen sich diffuse Reflexionen modellieren, z.B. die von matter Farbe, Stoff oder unpoliertem Holz.

Idee: Abhängig vom Winkel, in dem das Licht auf das Material einfällt, verstärkt oder weniger verstärkt reflektieren. Die Kameraposition ist dabei egal. Grundsätzlich wird bei kleinen Winkeln am meisten reflektiert. Je größer der Winkel wird, desto weniger wird reflektiert.

Die abfallende Intensität mit größer werdendem Einfallswinkel wird mit Hilfe des Lambertschen Gesetz modelliert. Dabei nutzen wir den Cosinus, der wachsendem Winkel abnimmt, also genau das Verhalten was wir brauchen.

Berechnung

Wir können einstellen:

  • “Diffusionsfarbe” - welche Farbe die Diffuse Reflexion haben soll.

Gegeben ist zusätzlich die eingehenden Lichtintensität und der Lichteinfallswinkel . Die diffuse Komponente berechnet sich dann so:

Im Shader wird aus effizienzgründen mit der Cosinus ersetzt durch das Skalarprodukt der Normalen:

Gleichzeitig müssen wir darauf achten, dass negative Einfallswinkel nicht in die Berechnung einfließen:

Notation

Statt kann man auch schreiben, die beiden Ausdrücke sind äquivalent.

Spiegelnde Komponente

Mit dieser Komponente lassen sich glänzende Reflexionen modellieren, wenn die Lichtquelle direkt in der Reflexion sichtbar ist, z.B. auf Metall.

Anmerkung

Wir simulieren hier nur Reflexionen von Lichtquellen, nicht Reflexionen von anderen Objekten. Dafür brauche wir eine ganz andere Klasse von Algorithmen, siehe Raytracing.

Idee: Wir wollen das Licht nicht einfach nur spiegeln (dann würde man z.B. Punktlichtquellen nie sehen), sondern es auf der Oberfläche in einen kleinen Bereich streuen. Die Streuung nennt man auch Specular Highlight. Wir verringern also die Intensität der Reflexion um die Reflexionsrichtung, sodass in einem gewissen Bereich immer noch ein Anteil reflektiert wird.

Modelliert wird das durch einen potenzierten Cosinus von der Winkeldifferenz zur Reflexionsrichtung. Der Cosinus nimmt ja mit wachsender Winkeldifferenz ab. Durch die Potenz können wir zusätzlich einstellen, wie schnell der Cosinus abnimmt, also wie “breit” der Streubereich ist.

Berechnung

Wir können einstellen:

  • “Shinyness exponent” - wie breit das Licht gestreut werden soll.
    • Kleine Werte führen zu diffusen Reflexionen
    • Große Were führen zu mehr glänzenden Reflexionen
  • Reflexionsfarbe - welche Farbe die Reflexion haben soll.

Gegeben ist dann die Winkeldifferenz zur Reflexionsrichtung und die eingehende Lichtintensität . Dann berechnet sich die Spiegelnde Komponente so:

Mit und dem ausschließen von negativen Werten ergibt sich dann:

Anmerkung

Wir sehen, dass für diese Formel die Kameraposition gebraucht wird. Oft wird deshalb die Lichtberechnung im Eyespace gemacht, weil hier die Kamera ja der Nullpunkt ist. Damit fällt diese Variable weg.

Reflexionsrichtung bestimmen

Beim Rendern haben wir aber keinen direkten Zugriff auf die Reflexionsrichtung . Das ist aber kein Problem, denn die können wir uns aber durch eine kleine geometrische Überlegung berechnen:

Wir können die strecke, die die Lichtrichtung an der Normale hochgeht mit dem Skalarprodukt berechnen:

Multiplizieren wir die Strecke mit dem zweifachen der Normalen, kommen wir an die doppelte Strecke der Lichtrichtung an der Normalen entlang:

Wenn wir jetzt die Lichtrichtung abziehen, kommen wir genau an der Reflektionsrichtung raus:

Zusammenfassung

Nimmt man alle Komponenten zusammen und die Lichtquellen, dann ist das gesamte Licht eines Punktes :

Ambiente Komponente

  • ist die ambiente Farbe am Fragment
  • ist die Intensität der ambienten Beleuchtung

Pro Lichtquelle :

  • ist die Anzahl der Lichtquellen in der Szene
  • ist die Intensität der Lichtquelle

Diffuse Komponente

  • ist die diffuse Farbe am Fragment
  • ist die Normale am Fragment
  • ist die Richtung vom Fragment zur Lichtquelle

Spiegelnde Komponente

  • ist die spekulare Farbe am Fragment
  • ist die Richtung von Fragment zur Kamera
  • ist die Reflexionsrichtung der Lichtquelle, also
  • ist der Shininess-Exponent am Fragment