Странные результаты с шейдером Blinn-Phong GLSL, точечным освещением - PullRequest
1 голос
/ 22 июня 2011

Я сделал шейдер GLSL для освещения блинов фонг на пиксель в сцене, и у меня были некоторые проблемы с освещением сцены. Кажется, что каждый источник света имеет очень жесткую границу своего эффекта (на прикрепленном скриншоте вы можете видеть границу источника света в нижней плоскости - источник света (положение которого в мире эквивалентно висящим черным сферам в сцене) висит над модель самолета и феррари, но по какой-то причине только направляет свет соответственно назад / к / камере, а не вперед, от камеры.

Я чувствую, что совершаю какую-то ошибку / не понимаю, как направление глаза влияет на модель освещения blinn phong. Я испортил свои расчеты, или я просто не понимаю, как эта конкретная модель освещения должна работать?

Мой код шейдера здесь: https://gist.github.com/1040417

Снимок экрана с эффектом: Light boundary cutoff on scene

1 Ответ

2 голосов
/ 23 июня 2011

Ваше вычисление половины вектора, похоже, неверно.Половина вектора - это вектор между направлением света и направлением обзора (направлением на камеру), который также является частью, где направление глаза влияет на освещение.Но поскольку вы вычисляете свое освещение в мировом пространстве, а не в пространстве обзора, вы не можете просто использовать положение пространства обзора в качестве направления глаза, вместо этого вам нужно положение наблюдателя / камеры в мировом пространстве в качестве входных данных для шейдера.Да, и не забудьте нормализовать вектор света перед вычислением половины вектора (а также интерполировать нормализованный вектор света).Поэтому замена

halfVectors[i] = normalize(lights.allLights[i].position + lightDirections[i]);

на

uniform vec3 viewerPos;
...
vec3 eyeDirection = normalize(viewerPos - worldPosition.xyz);
...
lightDirections[i] /= dist;
halfVectors[i] = normalize(eyeDirection + lightDirections[i]);

должна помочь.Направление глаза больше не должно изменяться, так как оно не требуется в фрагментном шейдере (оно неявно сохраняется в половинном векторе).

Я не уверен, дает ли интерполяция половинного вектора именноте же результаты, что и при интерполяции направления глаза и вычислении половинного вектора в фрагментном шейдере (таким образом, вы также избавите от множества вариаций).Но по крайней мере это должно работать сейчас.

РЕДАКТИРОВАТЬ: То же самое с коэффициентом затухания.Поскольку оно нелинейно на расстоянии до источника света, вы можете не получить точно такие же результаты, как при расчете его для каждого фрагмента.Но это может быть терпимо, в зависимости от качества тесселяции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...