ENSIMAG 3A - Synthèse d'images et animation
TP1 : Illumination locale


Echauffement

pipeline

(d'après LightHouse3D, A. R. Fernandes)

smoothColor

Testez le shader smoothColor. Le code des shaders se trouve dans les fichiers .vp pour la transformation des sommets des objets et .fp pour le calcul des couleurs de chaque fragment de l'image. Vous obtenez l'image d'un cube dont les couleurs aux sommets sont interpolées linéairement. Une fois l'application compilée, vous pouvez modifier le shader courant et le recharger durant l'exécution avec la touche 'r'.

Regarder le code OpenGL des fonctions initShader, initCube et drawCube.

La première s'assure du chargement, de la compilation et de la liaison des vertex et fragment shaders selon l'API OpenGL. Elle permet ensuite de récupérer l'emplacement des variables uniformes du shader, notamment celui des matrices de transformation et projection

La deuxième va créer un Vertex Array Object (VAO) pour, ensuite à l'affichage, pouvoir envoyer en une seul instruction la géométrie et ses attributs (couleur, normales...) à la carte graphique.

La dernière est appelée à chaque fois que la fenêtre doit être redessinée. Elle initialise les états OpenGL, envoie les variables uniformes, active le programme shader instancié précédemment avant d'envoyer le VAO à la carte graphique.

Vous pouvez mettre la variable globale shading à 1 dans la fonction main pour charger un maillage de lemming à la place du cube.

Modèle de Phong

La luminance réfléchie par cette source se décompose en une partie ambiante la, une partie diffuse ld et une partie spéculaire ls. Si N est la normale à la surface au point d’intérêt à ombrer P, L la direction de la source de lumière depuis le point P et V la direction de P au point de vue alors :

illumination

ca = ka * ma * la

avec ka le coefficient de réflexion ambiant, ma la couleur ambiante du matériel et la la couleur ambiante de la lumière.

cd = kd * md * N.L * ld

avec kd le coefficient de réflexion diffus, md est la couleur diffuse du matériel et ld la couleur diffuse de la lumière.

cs = ks * ms * ls * (max(R.V,0))^s

avec ks le coefficient de réflexion spéculaire, ms et ls couleurs spéculaires de l’objet et de la lumière, s la brillance de l’objet.

La couleur de l’objet sera alors ca + cd + cs.

Gouraud shading (par sommet)

Le programme phong_vertex illumine le lemming avec un éclairement de Phong pour une source lumineuse ponctuelle avec une interpolation de Gouraud.

Afin de bien comprendre comment est formée l'image finale, modifiez le vertex shader pour afficher tour à tour des images constituées uniquement de l'éclairement ambiant, puis diffus, puis enfin spéculaire :

gouraud

Phong shading (par fragment)

phong

Modifier les shaders pour implémenter une interpolation de Phong, c'est-à-dire calculer la couleur en chaque fragment. Vous avez également besoin de passer les vecteurs L, N et V du vertex au fragment shader : ces vecteurs doivent être normalisés, mais où doit être réalisée cette normalisation ?

Quel(s) changement(s) dans l'illumination constatez-vous ? (pour zoomer, modifier : modelWorldMatrix = translate(-0.5f, -1.0f, -4.0f); dans la fonction initMaillage)

Que pensez-vous du surcoût en terme de calcul qu'implique cette interpolation ?

Éclairement de Blinn-Phong

Modifier les shaders afin d'implémenter un éclairement de Blinn-Phong. Pour cette variante, la composante spéculaire s'obtient avec la formule :

ls = ks * ms * ls * (max(N.H,0))

H est le demi-vecteur entre les vecteurs entre l'oeil et la source lumineuse.

Vous devriez obtenir un résultat équivalent à l'éclairement de Phong en multipliant par quatre l'exposant de brillance.

Toon shading

toonShading

Le Toon shading est un modèle d'éclairage non réaliste qui permet de générer des images à l'aspect cartoon. Le principe est de seuiller l'ombrage utilisé pour le rendu pour obtenir des bandes de couleur uniformes.

La couleur est calculée à partir de l’angle formé entre la normale à la surface N et le vecteur L. Plus précisément, on peut atténuer la couleur du lemming par pallier en seuillant le produit scalaire N.L.

Créer une nouvelle paire de shaders toon implémentant cette première étape de rendu non-photoréaliste (la suite au TP3).