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?