У меня проблема с каким-то простым точечным источником света в glsl-шейдере.
Я все еще не понимаю, в каком координатном пространстве нужно сделать освещение.
Сейчас я преобразуюположение по виду модели и нормали по верхнему виду модели 3х3 (без перевода).Я также преобразую световое положение с помощью матрицы вида, чтобы поместить его в то же пространство.
Проблема в том, что световое положение перемещается при перемещении камеры.
void main() {
attribute vec4 position;
attribute vec3 normal;
attribute vec2 texcoord0;
varying vec4 colorVarying;
varying vec2 texOut0;
uniform mat4 Projection;
uniform mat4 Modelview;
uniform mat3 NormalMatrix;//this is the upper 3x3 of the modelview
uniform vec3 LightPosition; //already transformed by view matrix
vec3 N = NormalMatrix * normal;
vec4 P = Modelview * position; //no view
vec3 L = normalize(LightPosition - P.xyz);
float df = max(0.0, dot(N, L.xyz));
vec3 final_color = AmbientMaterial + df * DiffuseMaterial;
colorVarying = vec4(final_color,1);
gl_Position = Projection * Modelview * position;
}
Я понял свою ошибку- Я использую es 2.0 и отправлял свою нормальную матрицу через
glUniformMatrix3fv(gVertexLightingShader->Uniforms[UNIFORM_NORMALMATRIX], 1, 0, m_modelview.data());
Но m_modelview был матрицей 4x4 - поэтому нормальная матрица была неправильной.