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 :
- cameraDirect : transformation de l'espace du monde dans l'espace lié à la caméra.
- cameraInverse : l'inverse de cette matrice. Passage de l'espace lié à la caméra à l'espace du monde.
- gl_TextureMatrix[0] : matrice de transformation liée à la source lumineuse. Passage de l'espace du monde à l'espace lié à la source lumineuse.
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 à :
- Effectuer la division par w dans les coordonnées de texture calculées (projection)
- lire la distance à la source, stockée dans la texture shadowMap, avec ces coordonnées là.
- Comparer la distance stockée dans la shadow map avec la distance entre la source lumineuse et l'objet (qui correspond au composant en z des coordonnées de texture)
- Vous servir du résultat du test pour mettre à l'ombre les parties à l'ombre.
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).