Eine mögliche Implementierung der diffusen und spekularen Komponente des Phong-Beleuchtungsmodell in GLSL könnte wie folgt aussehen:
Fragment Shader
// Helper: Skalarprodukt mit nur positiven Ergebnissen
float dot_p(vec3 a, vec3 b) {
return max(dot(a, b), 0);
}
// Phong-Shading
vec3 phong(
float I_in, // Lichtintensität
vec3 l, // Richtung zum Licht
vec3 v, // Richtung zur Kamera
vec3 n, // Normale
vec3 k_diff, // Diffuse Farbe
vec3 k_spec, // Spekulare Farbe
float n_s // Shininess-Exponent
) {
if (dot(n, l) < 0) return vec3(0);
vec3 diff = k_diff * dot_p(n, l);
vec3 r = 2 * n * dot(n, l) - l;
vec3 spec = k_spec * pow(dot_p(v, r), n_s);
return I_in * (diff + spec);
}