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);
}