Проблема с Фонг Шейдинг

Я пишу шейдер в соответствии сМодель Фонг, Я пытаюсь реализовать это уравнение:

где n - нормаль, l - направление света, v - направление на камеру и r - отражение света. Уравнения описаны более подробно в статье Википедии.

На данный момент я тестирую только на направленных источниках света, поэтому спада не наблюдается. Окружающий термин добавлен вне функции ниже, и он работает хорошо. Функция maxDot3 возвращает 0, если скалярное произведение отрицательно, как это обычно делается в модели Фонга.

Вот мой код, реализующий приведенное выше уравнение:

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

К сожалению, зеркальный термин, кажется, исчез по некоторым причинам. Мой вывод:

Правильный вывод:

Первая сфера имеет только рассеянное и окружающее затенение. Это выглядит правильно. Остальные имеют зеркальные термины и дают неверные результаты. Что не так с моей реализацией?

Ответы на вопрос(1)

Ваш ответ на вопрос