Rodar Normais no Shader

Eu tenho uma cena com vários modelos com posições individuais e rotações. Dadas as normais, os shaders aplicam uma iluminação bidirecional simples a cada pixel.

Esse é o meu vertex shader.

#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);
}

E aqui está o shader do fragmento.

#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);
}

Para objetos sem rotação, isso funciona bem. Mas para modelos rotacionados, a iluminação também é girada, o que, é claro, não deveria ser o caso.

A razão para isso é que as normais não são giradas. Eu já tenteif_normal = model * normal; mas isso aplica rotação e transformação às normais.

Então, como posso rotacionar as normais no shader de vértice antes de enviá-las ao fragment shader para iluminação? O que é uma abordagem comum?

questionAnswers(2)

yourAnswerToTheQuestion