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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage