Простой направленный свет и фонг нормали
Я дергаю себя за волосы уже третий день, пытаясь решить несколько простую задачу, я полагаю. Просто для гуру, а не для начинающего, как я, к сожалению.
У меня очень простая 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. Обе модели будут отображаться в ожидаемых положениях, правильно вращаться, масштабироваться и переводиться. Однако оба будут освещены одинаково. Свет не интерполируется по всей сцене, а применяется равномерно к каждой модели, т. Е. Перевод модели не учитывается.
Теперь я полагаю, что я мог бы просто отбросить нормали сглаживания по фонгу и использовать плоские нормали затенения для решения этой проблемы, но острые края выглядят крайне плохо. Другое решение, возможно, состоит в том, чтобы переключиться на пиксельное освещение в фрагментном шейдере, чего я действительно хочу избежать.
Есть идеи, что не так с математикой выше?
Спасибо