Поворот нормалей в шейдере

У меня есть сцена с несколькими моделями с отдельными позициями и поворотами. С учетом нормалей шейдеры применяют простое двунаправленное освещение к каждому пикселю.

Это мой вершинный шейдер.

#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; но это касается как вращения, так и преобразования нормалей.

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

Ответы на вопрос(2)

Ваш ответ на вопрос