Die Variablen normal und lightDir sollten noch aus den letzten Shadern bekannt sein, neu ist halfVector. Diese Variable dient der Übergabe des normalisierten Halbvektors - dem Vektor der genau zwischen Vektor vom Augenpunkt zum Vertex (eye vector) und dem Lichtvektor liegt - an den Fragment Shader. Der Halbvektor wird zur Berechnung des spekulaeren Lichtanteils (specular component) genutzt, eine Vereinfachung des Phong-Beleuchtungsmodelles welche zu erst beschrieben in [4]. Des weiteren deklarieren wir vier-komponentige Vektoren diffuse ambient die jeweils den diffusen und den ambienten Anteil des Lichtes in diesem Vertex speichern sollen.
Im eigentlichen Programm berechnen wir zunachst die Normale, die Lichtrichtung und den eben beschriebenen Halbvektor. Dann wird der diffuse Lichtanteil berechnet nachdem wir die diffuse Farbe des Materiales mit dem diffusen Anteil der Lichtquelle multiplizieren. Der ambiente Lichtanteil berechnet sich folglich ganz nach Phong aus der ambienten Farbe des Materiales multipliziert mit der Summe der ambienten Lichtanteile der Lichtquelle und des globalen Lichtmodells welches von der Applikation vorgegeben wird.
Schliesslich transformieren wir nur noch die Position des Vertexes auf bekannte Weise.
Der Fragment Shader ist der bis jetzt komplizierteste:
Nachdem wir die im Vertex Shader geschriebenen Variablen bekannt gemacht haben kommen wir zur eigentlichen main-Funktion. Dort deklarieren wir einige lokale Variablen welche wir im weiteren Verlauf brauchen werden und da wir die varying Variablen nicht im Fragment Shader beschreiben koennen kopieren wir die interpolierte Normale und ambiente Farbe in ebenfalls lokale Variablen.
Nun da die Vorarbeit geleistet ist kommen wir zur eigentlichen Fragmentfarbe. Dazu berechnen wir zunachst das Punktprodukt zwischen der Normalen und der Lichtrichtung. Falls das Punktprodukt groesser ist als 0 muessen wir mehr tun als nur die ambiente Farbe zu setzen: In diesem Fall addieren wir zum ambienten Lichtanteil die nach Blinn berechneten spekulaeren und die diffusen Farben.
Fuehren wir nun diese beiden Shader auf unserem teapot aus (./gltut shader/lighting/perpixel.avs shader/lighting/perpixel.afs) ist das Ergebnis (Abb. 5.5) doch schon recht ansehnlich.