Probleme mit Phong Shading

Ich schreibe einen Shader nach demPhong-Modell. Ich versuche diese Gleichung zu implementieren:

Dabei ist n die Normale, l die Richtung zum Licht, v die Richtung zur Kamera und r die Lichtreflexion. Die Gleichungen werden im Wikipedia-Artikel genauer beschrieben.

Ab sofort teste ich nur auf direktionalen Lichtquellen, damit es nicht zu einem r ^ 2-Abfall kommt. Der Umgebungsbegriff wird außerhalb der folgenden Funktion hinzugefügt und funktioniert gut. Die Funktion maxDot3 gibt 0 zurück, wenn das Skalarprodukt negativ ist, wie dies normalerweise im Phong-Modell der Fall ist.

Hier ist mein Code, der die obige Gleichung implementiert:

#include "PhongMaterial.h"

PhongMaterial::PhongMaterial(const Vec3f &diffuseColor, const Vec3f &specularColor, 
                            float exponent,const Vec3f &transparentColor, 
                             const Vec3f &reflectiveColor,float indexOfRefraction){

            _diffuseColor = diffuseColor;
            _specularColor = specularColor;
            _exponent = exponent;
            _reflectiveColor = reflectiveColor;
            _transparentColor = transparentColor;


}

Vec3f PhongMaterial::Shade(const Ray &ray, const Hit &hit, 
                    const Vec3f &dirToLight, const Vec3f &lightColor) const{

        Vec3f n,l,v,r;
        float nl;

        l = dirToLight;
        n = hit.getNormal();
        v = -1.0*(hit.getIntersectionPoint() - ray.getOrigin());

        l.Normalize();
        n.Normalize();
        v.Normalize();

        nl = n.maxDot3(l);
        r = 2*nl*(n-l);
        r.Normalize();

        return (_diffuseColor*nl + _specularColor*powf(v.maxDot3(r),_exponent))*lightColor;
}

Leider scheint der Spiegelbegriff aus irgendeinem Grund zu verschwinden. Meine Ausgabe:

Richtige Ausgabe:

Die erste Kugel hat nur diffuse und Umgebungsschattierungen. Es sieht richtig aus. Der Rest hat spekulare Ausdrücke und führt zu falschen Ergebnissen. Was ist falsch an meiner Implementierung?