Проблема с Фонг Шейдинг
Я пишу шейдер в соответствии сМодель Фонг, Я пытаюсь реализовать это уравнение:
где 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;
}
К сожалению, зеркальный термин, кажется, исчез по некоторым причинам. Мой вывод:
Правильный вывод:
Первая сфера имеет только рассеянное и окружающее затенение. Это выглядит правильно. Остальные имеют зеркальные термины и дают неверные результаты. Что не так с моей реализацией?