Ho una scena con diversi modelli con posizioni e rotazioni individuali. Date le normali, gli shader applicano una luce bidirezionale semplice a ciascun pixel.Ruota Normale in Shader
Questo è il mio 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);
}
Ed ecco il frammento shader.
#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);
}
Per oggetti senza rotazione funziona correttamente. Ma per i modelli ruotati viene anche ruotata l'illuminazione, il che, naturalmente, non dovrebbe essere il caso.
Il motivo è che le normali non vengono ruotate. Ho già provato f_normal = model * normal;
ma questo applica sia la rotazione che la trasformazione alle normali.
Quindi, come posso ruotare le normali nel vertex shader prima di inviarle allo shader di frammenti per l'illuminazione? Qual è un approccio comune?
Grazie. Mi consiglierebbe di inviare allo shader una matrice normale separata (inclusa solo la rotazione del modello ma non la ridimensionamento o la trasformazione)? Ho visto questa pratica da qualche parte e mi chiedo se sia meglio che ri-estrarre la rotazione dalla matrice del modello nello shader. – danijar
Mi dispiace, il mio tempo è scaduto durante la modifica del commento precedente ... Penso che il ridimensionamento sia necessario, perché può modificare la distanza di una superficie dalla sorgente di luce. E poiché hai bisogno della scala, devi correggere la scala usando la trasposizione inversa della matrice 3x3 superiore. Io mando la mia matrice normale allo shader come un'uniforme però, in modo che venga calcolata una volta sola invece di una volta per vertice.Potrebbe tuttavia essere necessaria una libreria matematica, poiché la piattaforma potrebbe non fornire funzioni per eseguire questi calcoli a matrice. – bwroga
Questo ha senso. A proposito, io uso GLM. – danijar