TD 9 : programmation GLSL, shadow maps

Résumé du TD

Le but du TD est d'implémenter l'algorithme de shadow maps en GLSL.

On repart du résultat du TD 8. Maintenant, la question est d'arriver à avoir l'ombre portée de l'objet sur le sol.

Instructions

Le programme contient déjà le calcul de la shadow map (dans Viewer.cpp) et son transfert au vertex shader. Il contient aussi le passage des différentes matrices de transformation :

Votre travail est simple : Pour chaque sommet (dans le vertex shader), il faut calculer sa position dans l'espace lié à la source lumineuse, ce qui donne les coordonnées de texture pour savoir à quel pixel il correspond dans la shadow map.

Il y a quand même un piège : toutes les matrices travaillent dans un espace de coordonnées [-1,1]x[-1,1]. Les coordonnées de texture, elles, sont sur [0,1]x[0,1]. Il vous faut donc appliquer une dernière transformation pour tout transformer de [-1,1]x[-1,1] à [0,1]x[0,1].

Dans le fragment shader, vous récupérez les coordonnées de texture calculées pour chaque sommet, et interpolées. Il vous reste à :

Votre première tentative a sans doute du z-fighting. Vous pouvez l'enlever en ajoutant un léger biais à la distance calculée.

Vérifiez que votre programme fait bien ce qu'il faut en faisant bouger l'objet et la source lumineuse. Normalement l'ombre doit bouger quand l'objet bouge.

Testez avec différentes valeurs de la résolution de la shadow Map (petit, moyen, gros).

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).