TP1 : Modèles d'illumination locale
- Sources du projet
- Spécifications GLSL
- OpenGL 3.2 API Quick Reference Card
Échauffement
(d'après LightHouse3D, A. R. Fernandes)
Testez le shader smoothColor. 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 combinaison de touches 'CTRL+L'. Le code des shaders se trouve dans les fichiers .vert pour la transformation des sommets et .frag pour la rasterisation des fragments (dans le répertoire qviewer/shaders). Un menu déroulant vous permet par ailleurs de choisir l'un des shaders déclaré dans le fichier programs.xml.
La gestion des shaders est encapsulé dans la classe GQShaderManager. Comme illustré par le diagramme, cette classe charge et compile indépendamment les vertex et fragment shaders avant de pratiquer l'édition de lien du programme complet. Regarder la méthode drawScene de la classe Scene pour un exemple d'utilisation de GQShaderManager. Une fois le programme activé, les variable uniformes (notamment les matrices de transformation) peuvent être initialisées.
Regarder ensuite le code OpenGL dans les méthodes createVAO et draw de la classe Cube. La première va créer un Vertex Array Object (VAO). Celui-ci permet, lors de l'affichage, d'envoyer en une seul instruction la géométrie (le buffer des sommets : VBO) et ses attributs (couleur, normales...) à la carte graphique. La seconde méthode est appelée à chaque fois que la fenêtre doit être redessinée. Elle active le VAO et demande le dessin de la géométrie à la carte graphique. Dans la suite des TP, nous utiliserons la classe GQVertexBuffer pour encapsuler ces appels.
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 :
ca = ka * ma * la
avec ka le coefficient de réflexion ambiant, ma la couleur ambiante du matériau et la la couleur ambiante de la lumière.
cd = kd * md * N.L * ld
avec kd le coefficient de réflexion diffus, md la couleur diffuse du matérau 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 la couleur 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 phongVertex doit illuminer 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, mécrire le vertex shader pour afficher tour à tour les images constituées uniquement de l'éclairement ambiant, puis diffus, puis enfin spéculaire :
Phong shading (par fragment)
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 ?
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))^s
où H est le demi-vecteur entre les vecteur oeil V et celui de la source lumineuse L.
Vous devriez obtenir un résultat équivalent à l'éclairement de Phong en multipliant par quatre l'exposant de brillance.
Toon shading
Le Toon shading est un modèle d'éclairage 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).