TD 8 : programmation GLSL, fonctions de réflectance
Résumé du TD
Le but du TD est double : une introduction (en douceur !) à la programmation GLSL, et comparer les fonctions de réflectance.Instructions
Démarrage
Le TD repose sur deux librairies annexes:
- Qt, par
TrolltechNokia (Qt4 minimum, pat Qt3). - libQGLviewer (installez la version pour Qt4, pour développeurs, et partez des sources, même sur Windows).
Logiquement, vous avez dû toutes les installer depuis la semaine dernière (j'espère).
Une fois que toutes les librairies sont installées, vous pouvez télécharger le squelette de code fourni.
Le code proprement dit se trouve dans api_graphics/examples/materials/. Pour compiler, deux possibilités au choix :
- Dans un terminal, tapez :
- cd api_graphics/examples/materials/,
- qmake,
- make
- Avec Qt Creator :
- Ouvrir api_graphics/examples/materials/materials.pro
- Faire "Compiler -> exécuter qmake",
- Faire "Compiler -> compiler le projet".
Cette fois-ci, ça doit compiler sans autre problèmes. Si vous rencontrez le moindre problème, tenez moi au courant.
Lorsque le programme tourne, il doit ouvrir une fenêtre et vous permettre de manipuler le point de vue (bouton de gauche), l'object (O puis bouton de droite) ou la source de lumière (L puis bouton de droite).
On peut changer le modèle affiché en le précisant sur la ligne de commande.
Fonction de réflectance de Blinn-Phong
Le programme charge le shader défini dans le dossier shader/blinnPhong. Tout le travail à faire se trouve dans les shaders, mais vous pouvez commencer par regarder le fichier Viewer.cpp.
Pour calculer l'éclairage en utilisant une fonction de réflectance (comme celle de Blinn-Phong ou Torrance), il vous faut en un point:
- Le vecteur qui indique la direction de la lumière (L)
- Le vecteur qui indique la direction du point de vue (V)
- La normale au point considéré
Tous ces vecteurs doivent être dans le même système de coordonnées. Le vertex shader se charge de les définir et de les amener tous dans le système de coordonnées de la caméra.
Votre travail commence dans le fragment shader:
- D'abord, normaliser tous ces vecteurs, puisque l'interpolation linéaire leur a fait perdre leur norme 1.
- Ensuite, calculer le half-vector, H = 0,5*(L+V), et le normaliser à nouveau.
- Enfin, calculer une fonction de réflectance de Blinn-Phong (H scalaire N puissance s).
Je vous conseille d'essayer avec différentes valeurs des paramètres, en particulier la puissance. L'article Experimental Analysis of BRDF Models Supplemental Document contient plusieurs exemples de valeurs correspondant à des matériaux authentiques.
Fonction de réflectance de Torrance
Une fois que vous êtes satisfaits de votre fonction de réflectance de Blinn-Phong, on va essayer la fonction de réflectance de Torrance. Je vous suggère de partir de la formule dans Experimental Analysis of BRDF Models Supplemental Document, en utilisant une approximation de Schlick pour le coefficient de Fresnel: F0 + (1-F0)(1-(V.H))^5.
À nouveau, testez votre programme sur des matériaux réels, en utilisant les valeurs données dans le document. Comparez le même matériau en utilisant le modèle de Blinn-Phong et celui de Torrance. Essayez de trouver les différences et les points communs.
Pour corriger ce TD, je n'ai besoin que des sources de vos shaders (logiquement, vous ne devez rien modifier dans les fichiers C++ et H).
N'hésitez pas à accompagner votre rapport de captures d'écran.