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:

  1. Qt, par Trolltech Nokia (Qt4 minimum, pat Qt3).
  2. 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 :

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:

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:

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.

Question pour ceux qui veulent aller plus loin

Dans le vertex shader, la transformation qui agit sur la normale n'est pas la même que la transformation qui agit sur les sommets. Pourquoi ? Quelle est la différence ?