Illumination/Shading avec OpenGL

Compilez et executez le code du répertoire scenes_inf443/02b_opengl_shading/.
void main()
{
  vec3 current_color;
  current_color = ambiant * material.color * light_color;
  FragColor = vec4(current_color, 1.0);   // Note: the last alpha component is not used here

}
assets/uniform_color.jpg
L'utilisation d'une couleur constante (/ambiante) sur un objet ne permet pas de distinguer la forme 3D. Notez que changer la position de la lumière n'a pas d'influence. Pour cela, il est nécessaire d'adapter localement l'illumination sur la forme en fonction de l'orientation par rapport aux sources lumineuse.

Illumination de Phong

Coefficient diffus

Implémentez dans un premier temps la gestion du coefficient diffus suivant la formulation
Pour cela vous devez modifiez le shader pour implémenter cette formule.
assets/color_diffuse.jpg
Aide:
Solution du shader au besoin (faites l'exercice avant de regarder la solution).

Coefficient spéculaire

Ajoutez la prise en compte du coefficient spéculaire. La formulation sera alors
Similairement au cas précédent, fixez dans un premier temps les valeurs des coefficients dans le code GLSL avant de les ajouter à votre GUI pour les passer en paramètres uniformes.

Modèle d'illumination de Phong avec coefficients ambiant, diffus et spéculaire modifiables.
Aide:
mat3 O = transpose(mat3(view)); // get the orientation matrix
vec3 last_col = vec3(view * vec4(0.0, 0.0, 0.0, 1.0)); // get the last column
vec3 camera_position = -O * last_col;
Solution du shader au besoin (faites l'exercice avant de regarder la solution).

Effet de brume

Un effet de "brume" (/fog) peut être réalisé en attenuant la couleur du fragment en fonction de sa profondeur. Un fragment proche de la caméra aura l'illumination de phong, alors qu'un fragment éloigné tendra vers la couleur de la brume.
Dans le cas d'une atténuation linéaire en fonction de la distance, on peut considérer
> Implémentez un effet de brume. Permettez à l'utilisateur de modifier la couleur de la brume dans la GUI.

Effet de brume avec atténuation linéaire. Ici \(d_{max}=15\).
Aide:
Remarques: La sphère représentant la lumière, ainsi que les axes du repère global (si affiché) ne sont pas affecté par la brume car ils utilisent un autre shader (le shader par défaut utilisé pour l'affichage des maillages).

Attenuation d'éclairage

Un autre effet d'illumination possible est l'atténuation de l'effet de la lumière en fonction de sa distance aux objets. On peut alors considérer une atténuation linéaire en fonction de la distance telle que
> Implémentez un effet d'attenuation de la source lumineuse.

Effet d'attenuation de la source lumineuse avec effet de brume \(d_{max}=12, d_{l,max}=4\).

Extensions possibles

Uniquement si jamais vous avez fini en avance