Простой направленный свет и фонг нормали

Я дергаю себя за волосы уже третий день, пытаясь решить несколько простую задачу, я полагаю. Просто для гуру, а не для начинающего, как я, к сожалению.

У меня очень простая 3d модель с фонгом, сглаживающим нормали.

Модель визуализируется с использованием стандартного подхода для каждого вершинного направленного освещения, описанного везде в книгах и в Интернете.

Вот мой вершинный шейдер:

uniform mat4 mvpMatrix;
uniform mat4 normalMatrix;
uniform vec3 lightPosition;
uniform vec4 diffuseColor;

attribute vec4 vertexPosition;
attribute vec3 vertexNormal;

varying vec4 vertexColor;    

void main()
{
    vec3 eyeNormal = normalize(normalMatrix * vertexNormal);
    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));

    vertexColor = diffuseColor * nDotVP;
    gl_Position = mvpMatrix * vertexPosition;
}

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

Например, я отрисовываю одну и ту же модель дважды, с той лишь разницей, что матрица модели переводится в -1,0 в Z dir. Обе модели будут отображаться в ожидаемых положениях, правильно вращаться, масштабироваться и переводиться. Однако оба будут освещены одинаково. Свет не интерполируется по всей сцене, а применяется равномерно к каждой модели, т. Е. Перевод модели не учитывается.

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

Есть идеи, что не так с математикой выше?

Спасибо

0 ответов

Другие вопросы по тегам