Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parManon Thiebaut Modifié depuis plus de 10 années
1
Ombres en temps-réel Nicolas Holzschuch Cours dOption Majeure 2 Nicolas.Holzschuch@imag.fr
2
Ombres en temps-réel Pourquoi faire ? Les ombres Shadow maps Shadow volumes Ombres douces
3
Les ombres : pourquoi ? Réalisme accru Positionnement spatial Information sur les objets Informations sur le système graphique : –Comment ça marche, pourquoi,… –Nombreuses extensions, additions,…
4
Exemples + Vidéo
5
Ombres dures/ombres douces Vidéos
6
Techniques 2 méthodes : –Shadow mapping Basé image –Shadow volumes Basé objet –Démos
7
Shadow mapping Source lumineuse ponctuelle Principe : –Carte de profondeur de la scène –Vue depuis la source lumineuse Pour chaque pixel de limage –Calculer position par rapport à la source –Calculer profondeur par rapport à la source –Comparer à la profondeur stockée –Égal : lumière, plus grand : ombre
8
Shadow volume Source lumineuse ponctuelle Principe : –Silhouette des objets vus depuis la source –Plans infinis sappuyant sur la source et sur chaque arête –Définit « volume dombre » Pour chaque pixel de limage : –Compter le nombre de plans entrants et sortants –Positif : ombre, nul : lumière
9
Et maintenant, les détails
10
Shadow mapping Source lumineuse ponctuelle Principe : –Carte de profondeur de la scène –Vue depuis la source lumineuse Pour chaque pixel de limage –Calculer position par rapport à la source –Calculer profondeur par rapport à la source –Comparer à la profondeur stockée –Égal : lumière, plus grand : ombre
11
Shadow mapping A < B : ombre light source eye position depth map Z = A fragments light Z = B depth map image plane eye view image plane, aka the frame buffer
12
Shadow mapping AB : lumière light source eye position depth map Z = A fragments light Z = B depth map image plane eye view image plane, aka the frame buffer
13
Carte de profondeur Comment la générer ? –Pourquoi cest compliqué ? –back-buffer –pbuffers Précision/coût –En xy –En z
14
Pourquoi cest compliqué ? CPU Mémoire Disque dur Carte-mère Processeur graphique Mémoire Carte graphique Écran
15
Comment faire ? Le CPU ne peut pas faire le travail : –Trop lent –Transfert trop lent Cest le processeur graphique qui travaille –Comment faire pour dessiner la scène sans lafficher ? –Deux solutions : back-buffer et pbuffers
16
Double-buffering Laffichage peut être lent Lutilisateur voit la scène safficher morceau par morceau –Gênant Idée : double-buffer –Deux buffers –On affiche le front-buffer –On dessine dans le back-buffer –Quand on est prêt : glutSwapBuffers();
17
Double-buffering Suppose que la carte soit équipée : –Coût mémoire supplémentaire (léger) –Automatique de nos jours À demander à la création du contexte OpenGL glutInitDisplayMode(GLUT_DEPTH|GLUT_RGB|GLUT_DOUBLE); Ne pas oublier déchanger les buffers…
18
Application aux ombres On a un endroit pour dessiner ! On dessine la scène une première fois : –Avec la matrice de projection de la lumière –Directement dans le back-buffer –Ensuite, transfert en mémoire On dessine la scène une deuxième fois : –Avec la matrice de projection de la caméra –Toujours dans le back-buffer –Échange des buffers
19
Problème Résolution du back-buffer limitée : –À la résolution de la fenêtre –Problèmes daliasing Si je veux davantage de résolution : –pbuffers –Possibilité de rendu sur la carte, par le processeur, dans une zone mémoire spécifique –Résolution plus grande que celle de la fenêtre –Mais pas illimitée –Pas toujours possible, dépend de la carte
20
Pour chaque pixel Génération de coordonnées de texture –Matrice de projection de la lampe + conversion –Résultat : (r,s,t) coordonnées de texture –r distance à la source –(s,t) coordonnées dans la carte de profondeur –Comparaison r / carteProfondeur (s,t) Extension OpenGL : –GL_ARB_SHADOW ou GL_SGIX_SHADOW
21
Extensions OpenGL OpenGL : –Spécifications (www.opengl.org)www.opengl.org –Liste de fonctionnalités ( glBegin, glEnd …) –Architecture Review Board (ARB) Extensions : –Nouvelles fonctionnalités –Décision par lARB (meetings) –Extensions « officielles » : http://oss.sgi.com/projects/ogl-sample/registry/projects/ogl-sample/registry/ Spécifications approuvées, publiques Nom et prototypes de fonctions publics Différents niveaux dintégration : –GL_ARB_EXTENSION, GL_EXT_EXTENSION, GL_CONSTRUCTEUR_EXTENSION
22
Extensions OpenGL Comment savoir si une extension est présente ? –glxinfo –http://www.delphi3d.net/hardware/index.phphttp://www.delphi3d.net/hardware/index.php (liste cartes+drivers = extensions) –glutExtensionSupported("GL_SGIX_shadow"); On y reviendra au prochain cours
23
GL_SGIX_SHADOW glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_SGIX, GL_TRUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_OPERATOR_SGIX, GL_TEXTURE_LEQUAL_R_SGIX); Implémentation très simple
24
Algorithme Désactiver laffichage des polygones Dessiner la scène Transférer le Z-buffer en mémoire Ré-activer laffichage des polygones Affecter la carte de profondeur comme texture Activer la shadow-map Dessiner la scène Échanger les buffers
25
Algorithme Désactiver laffichage des polygones : –glColorMask(0,0,0,0); –glDisable(GL_LIGHTING); Permet de gagner du temps –La carte graphique travaille moins Dessiner la scène
26
Algorithme Récupérer le Z-buffer : glCopyTexImage2D(GL_TEXTURE_2D,0, GL_DEPTH_COMPONENT16_SGIX, 0,0,width,height,0); Alternative : glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, taille, pointeur); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16_SGIX, width, height, 0, GL_DEPTH_COMPONENT, taille, pointeur); Double transfert CPU/carte graphique !
27
Algorithme Ré-activer laffichage des polygones : glEnable(GL_LIGHTING); glColorMask(1,1,1,1); glViewport(0, 0, winWidth, winHeight); Activer la shadow map Dessiner la scène Échanger les buffers
28
Shadow mapping Avantages : –Très simple à implémenter –Code compact –Marche toujours (scène quelconque) Inconvénients : –Problèmes déchantillonnage (xy et z) –Deux passes de rendu (vitesse divisée par deux) Ne pas regénérer systématiquement la shadow map, seulement si la source se déplace –Besoin dextensions OpenGL (disponibles ?)
29
Échantillonnage Principal inconvénient Système discrétisé Double discrétisation : caméra et source lum. Conflit de précision
30
Précision en xy La plus visible Solution : augmenter la résolution de la carte –Limite liée à la carte Pas toujours suffisant : –Projection de la texture depuis la source –Pixels après projection déformés et agrandis –Cas idéal : source proche de la caméra –Cas le pire : source opposée à la caméra Animal dans les phares (pas bon pour lui)
31
Cas idéal : lampe de spéléo Caméra Source La couleur représente laire projetée dun élément de surface Le fantôme représente lombre de lobjet
32
Cas le pire : source opposée Caméra Source
33
Source opposée
34
Résolution en xy Principale source derreur Solutions : –Augmenter la résolution –Déformer la shadow map pour augmenter sa résolution près de lœil –Résolution adaptative Pas de solution idéale si la source est face à lœil
35
Shadow mapping A < B : ombre light source eye position depth map Z = A fragments light Z = B depth map image plane eye view image plane, aka the frame buffer
36
Shadow mapping A B : lumière light source eye position depth map Z = A fragments light Z = B depth map image plane eye view image plane, aka the frame buffer
37
Problèmes de précision
38
Problème de précision La carte de profondeur est aussi discrétisée en z Besoin de précision : 16 bits, 24 bits… Problèmes avec z voisins : –Auto-ombrage des surfaces Solution : –Déplacer la carte de profondeur (bias) –Trouver la valeur idéale : Trop peu : les surfaces sombrent elles-mêmes Trop : les ombres disparaissent –glPolygonOffset();
39
Variantes : ID-buffer Pour éviter les problèmes dauto-ombrage Une couleur par objet Objet = ? –Quelque chose qui ne peut pas sombrer –Convexes Ombrage si ID objet ID dans buffer Pas de problème de précision –Mais besoin nombreuses ID : 16 bits Problème si objets proches les uns des autres
40
Précision La résolution effective dépend de la pyramide de vue de la lampe –Large cône de vue : résolution gaspillée Plus la pyramide est proche des objets, plus on est précis Rapprocher la pyramide de vue –En xy : faible angle douverture –En z : front plane et far plane rapprochés
41
Shadow Mapping : résumé Avantages : –Très simple à implémenter, code compact –Marche toujours (scène quelconque) –Prix indépendant de la complexité de la scène –Nombreuses variantes pour améliorer la qualité Inconvénients : –Problèmes déchantillonnage (xy et z) –Deux passes de rendu –Artefacts visibles –Sources omni-directionnelles ?
42
Shadow volume Source lumineuse ponctuelle Principe : –Silhouette des objets vus depuis la source –Plans infinis sappuyant sur la source et sur chaque arête –Définit « volume dombre » Pour chaque pixel de limage : –Compter le nombre de plans entrants et sortants –Positif : ombre, nul : lumière
43
Shadow volume
44
Silhouette des objets Travail sur le modèle Pour chaque arête du modèle : –Identifier polygones quelle relie –Produit scalaire normale / vecteur vers la source –Si produits scalaires de signe différent : arête de silhouette –Besoin structure de données sur le maillage Sur-ensemble de la silhouette des objets
45
Volume dombre Plans définis par (arête + source) Définit volume dombre : –En fait, plusieurs volumes imbriqués –On est à lombre si on est à lintérieur dau moins un volume Principe : pour chaque pixel, on compte les plans, de lœil jusquà la surface affichée –Entrée/sortie dans le volume –Nombre total de plans croisés
46
Compter les plans Stencil buffer : –Autre fonctionnalité OpenGL –Buffer auxiliaire, jamais affiché –Opérations possibles : Incrémenter/décrémenter le stencil buffer Conditions sur le stencil buffer, actions sur lécran –Multiples utilisations : Ombres, réflexions, fenêtres… Rendu conditionnel Début de programmation de la carte
47
Utilisation du stencil buffer Premier rendu de la scène –Initialise le Z-buffer Rendu du volume dombre –Pour chaque plan positif : glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); –Pour chaque plan négatif : glStencilOp(GL_KEEP,GL_KEEP,GL_DECR); Deuxième rendu de la scène : –glStencilFunc(GL_EQUAL, 0, ~0); Pour la partie éclairée
48
Algorithme : tracé du volume glDisable(GL_LIGHTING); drawScene(); /* La scène, écl. ambiant */ glDepthMask(0); /* Ne plus écrire ds Z-buffer */ glStencilFunc(GL_ALWAYS, 0, ~0); glEnable(GL_STENCIL_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); glColorMask(0,0,0,0); /* pas modifier framebuffer */ draw_shadow_volume(); /* plans positifs */ glCullFace(GL_FRONT); glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); draw_shadow_volume(); /* plans négatifs */ glColorMask(1,1,1,1); glDepthMask(1); /* On peut écrire ds Z-buffer */
49
Algorithme : rendu de la scène glStencilFunc(GL_EQUAL, 0, ~0); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glEnable(GL_STENCIL_TEST); glDepthFunc(GL_EQUAL); glEnable(GL_LIGHTING); drawScene();
50
Shadow volume Avantages : –Ombres précises –Positions quelconques lumière/caméra Inconvénients : –Calcul de la silhouette (sur CPU, év. long) –Besoin de modèles fermés, formés de convexes –Deux rendus de la scène, plus rendu du volume –fill-rate : tracé de nombreux polygones, qui couvrent lécran. –Carte limitée en nb. pixels/seconde
51
Mauvais cas pour le fill-rate
52
Shadow volume : améliorations Et si la caméra est dans le volume dombre ? –Le compte des plans nest plus bon Système général : –Prendre un point hors du volume dombre –Compter les plans entre ce point et la surface –Exemple de points hors du volume : linfini –Méthode zfail
53
zfail/zpass
54
zfail glDepthMask(0); glStencilFunc(GL_ALWAYS, 0, ~0); glEnable(GL_STENCIL_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glStencilOp(GL_KEEP, GL_INCR, GL_KEEP); glColorMask(0,0,0,0); draw_shadow_volume(); glCullFace(GL_BACK); glStencilOp(GL_KEEP, GL_DECR, GL_KEEP); draw_shadow_volume(); glColorMask(1,1,1,1); glDisable(GL_CULL_FACE); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); glDepthMask(1);
55
Limites du volume dombre Le volume dombre est défini par des plans Les plans vont de larête à linfini Linfini est difficile à gérer –En pratique, on coupe à une certaine distance –Que se passe t-il si on voit le volume dombre à cet endroit ? –Et si la source est proche de la caméra ? Il faut que le volume dombre soit fermé : –Si on coupe, on ajoute des polygones de fermeture
56
Limites du volume dombre Applications : limiter le fill-rate Plus le volume est petit, plus le fill-rate est bas Couper les plans : –far clipping plane –Et fermer le volume : Sur les arêtes, par des plans À linfini, par des plans –Ça marche encore –Pyramide de vue de la source
57
Dark cap/light cap
58
Limitations du volume dombre
59
Extensions OpenGL GL_EXT_stencil_two_side –Pour faire les deux faces du volume dombre en une seule passe GL_NV_depth_clamp –Pour avoir des plans qui vont vraiment à linfini GL_EXT_depth_bounds_test –Pour ne rasteriser que les primitives proches de la source
60
Shadow volume Avantages : –Ombres précises –Positions quelconques lumière/caméra –Si bien programmé, robuste Inconvénients : –Calcul de la silhouette (sur CPU, év. long) –Scènes spécifiques : modèles fermés, formés de convexes –Deux rendus de la scène, plus rendu du volume –fill-rate limité
61
Ombres douces Algorithmiquement plus compliqué Problème de visibilité point-surface –Au lieu de point-point –Silhouette ? Ombre de la somme somme des ombres Plusieurs algorithmes approximatifs
62
Ombre/pénombre
63
Combinaison dombres
64
Problèmes de silhouette
65
Ombres douces Accumulation dombres : –Calculer plusieurs ombres ponctuelles –Additionner les résultats, moyenne –Accumulation buffer –Nombre déchantillons élevés –Temps de calcul multiplié par # échantillons
66
Accumulation 4 échantillons1024 échantillons
67
Ombres douces Recherche de voisins : –Shadow map normale –Pour chaque pixel dans la shadow map Rechercher frontière de lombre la plus proche Donne position + distance (source, récepteur) Coefficient datténuation fonction du rapport des distances –Lent (recherche sur r 2 pixels) –Limiter r : taille de la pénombre limitée
68
Ombres douces Volume dombres douces : –Shadow volume normal –Pour chaque arête de la silhouette : Calculer volume englobant la pénombre Pour chaque pixel dans ce volume –Calculer coefficient datténuation –Beau, réaliste –Problèmes de fill-rate multipliés par 2
70
Résumé : OpenGL OpenGL : –Z-buffer –Double-buffer –Pbuffers –Extensions –Stencil buffer –Accumulation buffer Cartes graphiques : –Rendu en plusieurs passes –Programmables (en un sens) –utilisées pour faire des choses complexes (ombres) –Ce nest que le début
71
Résumé : ombres Shadow maps : –Stable, robuste, facile, rapide, aliasage Shadow volumes : –Beau, difficile, complexité algorithmique Ombres douces –Complexe, lent, beau
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.