Problemas com o sombreamento Phong

Estou escrevendo um shader de acordo com oModelo Phong. Eu estou tentando implementar esta equação:

onde n é o normal, l é a direção da luz, v é a direção da câmera er é a reflexão da luz. As equações são descritas em mais detalhes no artigo da Wikipedia.

A partir de agora, estou testando apenas fontes de luz direcionais, para que não haja queda de r ^ 2. O termo ambiente é adicionado fora da função abaixo e funciona bem. A função maxDot3 retorna 0 se o produto escalar for negativo, como costuma ser feito no modelo Phong.

Aqui está o meu código implementando a equação acima:

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

Infelizmente, o termo especular parece desaparecer por algum motivo. Minha saída:

Saída correta:

A primeira esfera possui apenas sombreamento difuso e ambiente. Parece certo. O restante possui termos especulares e produz resultados incorretos. O que há de errado com minha implementação?

questionAnswers(1)

yourAnswerToTheQuestion