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
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.
Warum ist das so?
Zwei Lichtstrahlen haben die selbe Intensität. Auf der Fläche hat ein Lichtstrahl wegen seines größeren Einfallswinkels eine größere Fläche. Dadurch hat das Licht da pro Fläche eine kleinere Intensität.
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
Im Shader wird aus effizienzgründen mit
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
Mit
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
Wir können die strecke, die die Lichtrichtung an der Normale
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
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
ist die diffuse Farbe am Fragment ist die Normale am Fragment ist die Richtung vom Fragment zur Lichtquelle
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
Siehe auch