Problemas con el sombreado de Phong

Estoy escribiendo un sombreador de acuerdo con elModelo de Phong. Estoy tratando de implementar esta ecuación:

donde n es lo normal, l es la dirección hacia la luz, v es la dirección hacia la cámara yr es la reflexión de la luz. Las ecuaciones se describen con más detalle en el artículo de Wikipedia.

En este momento, solo estoy probando fuentes de luz direccional para que no haya una caída de r ^ 2. El término ambiente se agrega fuera de la función siguiente y funciona bien. La función maxDot3 devuelve 0 si el producto punto es negativo, como suele hacerse en el modelo Phong.

Aquí está mi código implementando la ecuación anterior:

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

Desafortunadamente, el término especular parece desaparecer por alguna razón. Mi salida:

Salida correcta:

La primera esfera solo tiene sombreado difuso y ambiental. Se ve bien El resto tiene términos especulares y produce resultados incorrectos. ¿Qué hay de malo en mi implementación?

Respuestas a la pregunta(1)

Su respuesta a la pregunta