Поворот нормалей в шейдере
У меня есть сцена с несколькими моделями с отдельными позициями и поворотами. С учетом нормалей шейдеры применяют простое двунаправленное освещение к каждому пикселю.
Это мой вершинный шейдер.
#version 150
in vec3 position;
in vec3 normal;
in vec2 texcoord;
out vec3 f_normal;
out vec2 f_texcoord;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
void main()
{
mat4 mvp = proj * view * model;
f_normal = normal;
f_texcoord = texcoord;
gl_Position = mvp * vec4(position, 1.0);
}
А вот фрагмент шейдера.
#version 150
in vec3 f_normal;
in vec2 f_texcoord;
uniform sampler2D tex;
vec3 sun = vec3(0.5, 1.0, 1.5);
void main()
{
vec3 light = max(0.0, dot(normalize(f_normal), normalize(sun)));
gl_FragColor = texture(tex, f_texcoord) * vec4(light, 1.0);
}
Для объектов без вращения это работает нормально. Но для повернутых моделей освещение также вращается, что, конечно, не должно иметь место.
Причина в том, что нормали не вращаются. Я уже пробовалаf_normal = model * normal;
но это касается как вращения, так и преобразования нормалей.
Так как же я могу повернуть нормали в вершинном шейдере, прежде чем отправить их на фрагментный шейдер для освещения? Какой общий подход?