Shadows gael.guennebaud@inria.fr
Simulation de l'éclairage Simule la façon dont un objet reflète la lumière Propriétés de la surface Propriétés des sources lumineuses Propriétés de l'environnement Problématique Quelle est l'intensité lumineuse reçu par chaque pixel de la caméra? lumière i.e. Quelle est l'intensité lumineuse réfléchie par chaque point de la scène en direction de la caméra? ent em n n o r vi n e?? surface
Éclairage local & Visibilité Équation l ρ l s,s o G l s, n Ll s Que faire si la source n'est pas visible Terme de Visibilité 0 si la source est cachée 1 si visible o l n s l ρ l s,s o G l s, n V l, s Ll s Notion d'ombre Zone de l'espace où la source de lumière est invisible (vidéos)
Définition : cas ponctuel Visibilité par rapport à la source de lumière Visible (= pas d'objet occultant) => dans la lumière Invisible (= au moins un objet occultant) => dans l'ombre light source Is the light source visible?
Ombres projetées Simple mais limité aux receveurs plans
Volume d'ombre (Shadow Volume) Principe de base Une lumière ponctuelle divise l'espace en deux : les régions dans l'ombre les régions éclairé le volume d'ombre correspond à la frontière entre les deux régions occluder surface en dehors du volume d'ombre (éclairée) Volume d'ombre (infini) surface dans le volume d'ombre
Comptage des entrées sorties occluders zero +1 zero +1 +2 +2 +3 front faces (+1) back faces (-1)
Problème du near plane Manque une intersection avec le volume d ombre à cause du near clip plane Far clip plane zero +1 +1 +2 zero +3 +2 Near clip plane
Problème du near plane Résolution du problème, en bouchant le volume d ombre par le near clip plane zero +1 +1 +2 zero +3 +2 La version en 3D de ce problème est beaucoup plus complexe que le cas 2D!
Approche zfail : compter après le receveur zfail + front face : -1 zfail + back face : +1 stencil = +1 dans l'ombre :OK zfail + back face : +1
Approche zfail On se ramène à un problème de far plane, solution : mettre le plan far à l'infini (très loin!) nécessite de boucher le volume d'ombre : volume d'ombre += faces éclairées + faces éclairées à l'infini plus coûteux que l'approche zpass => choisir selon l'objet l'approche zpass ou zfail
Algorithme (z-fail) Initialiser le z-buffer (tracer la scène lumière éteinte) Construction du Volume d'ombre Détection de la silhouette vue de la lumière Compter les entrées et sorties du volume d ombre Configurer le stencil: back faces : incrémenter le stencil si le test de profondeur échou front faces : décrémenter le stencil si le test de profondeur échou Tracer les volumes d'ombres Tracer la scène lumière activée stencil!= 0 dans l'ombre!
Calcul du shadow volume Calcul de la silhouette Considérer toutes les arêtes potentiellement silhouette: une face éclairée et une face non-éclairée un bord (arête partagée par une seule face) Structure d'arêtes (pré-calculée) struct Edge { int facesid[2];// index des 2 faces int verticesid[2]; // index des 2 extrémités } Face éclairée ou non? tester la position de la source lumineuse % au plan de la face (via l'équation du plan) non-éclairée éclairée arête silhouette
Rendu du shadow volume Tracer un quad par arête potentiellement silhouette délimité par les 2 extrémités de l'arête : v0,v1 les 2 extrémités de l'arête projetées à l'infini par rapport à la source lumineuse L : (v0-l) et (v1-l) avec w=0 (infini) v1 L {v1-l, 0} vers l'infini {v0-l, 0} v0
Shadow volumes: conclusion Précision au pixel Sources ponctuelles /directionnelles Calcul de la silhouette Nécessite des objets manifold représentés par un maillage La complexité de la géométrie des volumes d'ombre est supérieur à celle de la scène!
Shadow Mapping Dans l'ombre? Comparer la profondeur du point courant avec la profondeur stockée dans la shadow map Source lumineuse (spot) Shadow Map (=texture de profondeur) contient la profondeur de tous les points visible à partir du spot Point courant doit être projeté dans le repère de la caméra & dans le repère du spot calculée par OpenGL en traçant la scène à partir du spot
Algorithme Algorithme Tracer la scène depuis la source de lumière en utilisant les FBO Sauvegarder la profondeur dans une texture Plaquer cette texture sur la scène Texture projective Pour chaque fragment/pixel depuis le point de vue Comparer la distance à la source avec la profondeur issue de la texture Texture projetées
Shadow mapping repère caméra repère lumière ML-1 texture pr pe ojec rs tio pe n ct ive Mc repère scène PL repère local mise à l'échelle S t Mo repère texture s
Shadow Mapping: aliasing image des profondeurs = discrétisation de la scène => aliasing Image courante + Z
Shadow Mapping Limitations Pixelisation : approximation par morceau Solutions : Augmenter la résolution «Cascade shadow maps» Texture d'ombre projective Résolution dépendante de la distance à la caméra
Perspective Shadow Map standard shadow map perspective shadow map shadow map image shadow map image
Perspective Shadow Map
Filtrage de la shadow map Filtrage bilinéaire standard Mélange pondéré des 4 texels voisins Inadapté aux textures de profondeurs Crée des valeurs de profondeur! Profondeur du fragment 0.25 0.25 0.63 0.63 : 0.57 0.44 0.57 > 0.44 Le fragment est totalement dans l'ombre Shadow map filtrée bilinéairement Percentage Closer Filtering (PCF) Filtrage bilinéaire du résultat de la comparaison avec la shadow map 4 échantillons supportés en hardware Profondeur du fragment 0.25 0.25 0.63 0.63 PCF 0.57 > x? 0 : 1 : 0.57 0 0 1 1 Le fragment est 50% dans l'ombre
Pré-filtrage : Variance Shadow Map Idée : «Linéariser» le problème => approximation du test par un fonction Filtrage sur la fonction Variance Shadow Map Trouver la probabilité d'être dans l'ombre : P(x t) Si on connait la moyenne et la variance de la fonction de profondeur μ = E(x) σ2 = E(x2) E(x)2 On peut calculer Algorithme Caculer un texture de profondeur Filtrer pour calculer la moyenne et la moyenne des carrés E(x) et E(x²)
Variance Shadow Map Shadow Mapping Limitation : fuites de lumières VSM
Pré-filtrage: Exponential Shadow Map Exponential Shadow Map Test de Visibilité : V(z,d) = 0 ou 1 (invisible ou visible) Approximation V(z,d) = exp(-c(d-z)) si d>=z Quand c tend vers l'infini, on converge vers la fonction initiale Remarque V(z,d) = exp(-cd)exp(cz) Précalcul : texture de profondeur, puis calculer l'exponentiel Préfiltrer cette texture Rendu : calculer l'approximation de la visibilité Limitations Valide si d>=z : besoin encore de décaler la texture Meilleur qualité, mais garde les paramètres d'une texture map
Exponential Shadow Map ESM Trilinear SM resolution: 2Kx2K ESM Trilinear
Exponential Shadow Map Shadow Mapping ESM
Exponential Shadow Map Shadow Mapping ESM
Sources étendues Soft shadows ombres «franches» ombres «douces»
Catégorie de sources de lumières Étendues (surface/volume) Uniforme Ensemble infinie de sources ponctuelles ρ l s, s o G l s, n Ll s L L ρ l s, s o G l s, n dl Source lumineuse Conséquences Notion de champ proche et champ lointain Notion de pénombre et d'ombres douces En général, calcul beaucoup plus coûteux Pénombre Ombre Pénombre