+ All Categories
Home > Documents > IMN638 - Interactions visuelles num...

IMN638 - Interactions visuelles num...

Date post: 28-Jan-2021
Category:
Upload: others
View: 5 times
Download: 0 times
Share this document with a friend
72
IMN638 - Interactions visuelles num´ eriques Chapitre 2.4 - Illumination en temps r´ eel Universit´ e de sherbrooke 30 octobre 2014 1 of 72
Transcript
  • IMN638 - Interactions visuelles numériquesChapitre 2.4 - Illumination en temps réel

    Université de sherbrooke

    30 octobre 2014

    1 of 72

  • Sommaire

    � Ombres� Ombre projetée� Texture d’ombre� Carte d’ombre� Volume d’ombre

    � Réflexion� Réflexion planaire par duplication de géométrie� Réflexion planaire double passes

    � Occultation ambiante

    2 of 72

  • Introduction

    Comme nous l’avons vu au chapitre 1.3, la stéréovision joue une place impor-tante du système visuel dans la perception de la profondeur.

    Ceci étant dit, la stéréovision ne s’applique que rarement dans un contexted’infographie puisque les scènes virtuelles sont habituellement projetées surun plan, sur un seul écran. Pour pallier à cette lacune, le cerveau utilise desindices de profondeur monoculaires, notamment les informations d’illumina-tion (ombres, flou, texture), afin de percevoir la profondeur dans une scènevirtuelle.

    Dans cette optique, une scène rendue en temps réel a tout intérêt à êtreilluminée de façon précise et réaliste, afin de mieux représenter la profondeur etla géométrie d’une surface, et ainsi augmenter le niveau de réalisme global durendu. Dans le cadre de ce chapitre, nous nous pencherons sur des problèmesd’illumination non-triviaux en infographie en temps réel, en l’occurence lerendu des ombres, de la réflexion et de l’occultation ambiante.

    3 of 72

  • Introduction

    Gauche : Scène sans éclairage. Uniquement les textures sont appliquées. Droite : Scène identique à la scène de gauche, avec l’illuminationactivée. On remarque que les détails et la structure générale de la scène sont beaucoup plus faciles à observer dans le cas de l’image de droite,par le simple ajout de l’éclairage. (Epic Games, 2009)

    4 of 72

  • Ombres en temps réel

    5 of 72

  • Ombre projetée

    La première méthode de génération en temps réel des ombres est la méthodedes ombres projetées. Cette méthode s’effectue en 2 temps :

    1. On rend la géométrie qui produira une ombre.

    2. On rend la géométrie une seconde fois, en noir, en transformant chaquevertex de la géométrie de manière à les projeter directement sur le planoù serait projetée l’ombre.

    Représentation de la méthode d’ombre projetée. La géométrie est rendue une première fois normalement. On rend ensuite la géométrie unedeuxième fois mais on projette tous ses vertices sur le plan où l’ombre est projetée.

    6 of 72

  • Ombre projetée

    Le tout revient donc à trouver une matrice de transformation permettant deprendre un vertex v de notre géométrie et le projeter sur un plan π : n·x+d = 0quelconque (l’endroit où apparâıt notre ombre), en ayant comme source deprojection la lumière située au point l .

    (RTR3, p.334)

    L’équation pour trouver le point p projetésur π est l’équation de l’intersection entrele vecteur l − v et le planπ : n · x + d = 0. (x représente ici unpoint 3D quelconque situé sur le plan.)

    L’équation est donnée tel que :

    p = l − d + n · ln · (v − l)

    (v − l) (1)

    7 of 72

  • Ombre projetée

    En développant les produits scalaires de l’équation (1) et en isolant chaquedimension, on obtient un système à 4 équations décrivant notre projection.Ce système se traduit par la matrice de transformation suivante :

    Pπ =

    n · l + d − lxnx −lxny −lxnz −lxd−lynx n · l + d − lyny −lynx −lyd−lznx −lzny n · l + d − lznz lzd−nx −ny −nz n · l

    (2)On effectue donc l’opération suivante sur chacun des vertices de notre géométrieafin de trouver le point correspondant projeté et ainsi former l’ombre :

    p = Pπv (3)

    8 of 72

  • Ombre projetée

    Pour éviter que l’ombre soitprojetée à l’extérieur du plan(par exemple si votre plann’est pas infini), une astuceest de rendre le plan enincrémentant le tamponpochoir où est rendu le plan.

    Lors du rendu de l’ombre, onconfigure le test du tamponpochoir pour réussir là où letampon n’est pas à 0. L’ombresera donc uniquement renduelà où le plan se trouve, letampon pochoir étant à 0partout ailleurs.

    La projection d’ombre s’effectue ici sur le plan vert. On limite l’affichage del’ombre au plan en inscrivant le plan dans le tampon pochoir et en s’assurantque l’ombre n’est pas rendue où le plan n’avait pas été inscrit dans le tamponpochoir.

    9 of 72

  • Ombre projetée

    Pour terminer, si jamais l’ombre estprojetée sur plusieurs plans, il faut faire leprocessus de projection plusieurs fois enboucle pour chaque planindépendemment. La matrice detransformation M doit être recréée pourchaque plan puisque l’équation du planchange.

    On effectue chaque projection d’ombresur un plan séparé, en s’assurant d’utiliserle tampon pochoir pour éviter qu’uneombre ne se retrouve sur le mauvaisplan.(Notons que le processus ici est trèspeu efficace au point de vu desperformances.)

    La projection d’ombre s’effectue ici sur plusieurs plans.On rend en séquence chaque plan et l’ombre leurcorrespondant avant de passer au plan suivant, enutilisant le tampon pochoir pour éviter de rendre l’ombresur un autre plan.

    10 of 72

  • Texture d’ombre

    La méthode de la texture d’ombre est une méthode relativement simple àmettre en pratique et particulièrement efficace dans le cas où les lumières dela scène sont des lumière directionnelles ou des lumières de type ”spot”.

    Elle consiste globalement à rendre la géométrie produisant de l’ombre à partirdu point de vue de la lumière dans une texture, puis aller lire la texture àpartir de la scène pour vérifier si un endroit est dans l’ombre ou non.

    11 of 72

  • Texture d’ombre

    La première étape de l’algorithme consiste à effectuer un rendu de notrescène en plaçant la caméra à la même position et dans la même direc-tion que notre lumière. On conserve en mémoire la matrice Modèle-Vue Met la matrice de Projection P de la scène ainsi rendue.

    Le rendu est effectué dans unetexture, qu’on appelle unetexture d’ombre. Lors de cerendu, on rend uniquement leséléments de la scène quiproduisent une ombre. La textureest initialisée transparente (α = 0)et tous les éléments produisantune ombre sont rendus opaque(α = 1), dans celle-ci.

    On place notre caméra à l’emplacement et dans la direction dela lumière puis on effectue le rendu des éléments produisants del’ombre dans une texture.

    12 of 72

  • Texture d’ombre

    Une fois notre texture d’ombre générée, on replace la caméra à son emplace-ment original puis on rend les éléments produisant une ombre en effectuantle calcul d’illumination standard.

    On rend la géométrie produisant de l’ombre normalement.

    13 of 72

  • Texture d’ombre

    La géométrie produisant l’ombre étant rendue, on doit maintenant rendre lagéométrie sur laquelle l’ombre est projetée. Lors du rendu de cette géométrie,on doit aller vérifier, pour chaque fragment, si le fragment est dans l’ombreou non.

    Pour chaque fragment rendu, on connait saposition en espace monde, position que nousnoterons v . Nous souhaitons vérifier si uneombre est projetée à la position v . Pour cefaire, nous prendrons notre point v , que nousprojetterons sur notre texture d’ombre. Si, àl’emplacement projeté (emplacement t),notre texture est transparente, c’est qu’il n’ya pas d’ombre. Sinon, c’est que le fragmentest dans l’ombre.

    On projette notre point v afin de trouver le pointcorrespondant t dans notre texture d’ombre.

    14 of 72

  • Texture d’ombre

    Reste donc à trouver comment projeter v sur la texture d’ombre afin de trouvert.

    Nous avions précédemment conservé la matrice modèle-vue M et la matrice deprojection P utilisée lors du rendu de notre scène du point de vu de la lumière.On trouve le point projeté sur la texture d’ombre simplement en multipliantnotre point par ces deux matrices, comme on le fait lors d’une transformationde vision habituelle.

    Pour chaque fragment ayant une position v , oneffectue donc :

    t = PMv (4)

    On obtient ainsi notre position t, ce qui nouspermet d’aller lire dans la texture à cetemplacement et ainsi construire notre ombrefragment par fragment.

    15 of 72

  • Texture d’ombre

    Pour terminer, prenons note que si la position t obtenue est à l’extérieur de latexture, c’est que notre point v était à l’extérieur du champ de vision lorsquenous avions rendu la texture d’ombre. Dans un tel cas, on peut dire que lepoint était hors du champ d’éclairage de notre projecteur de lumière. On peutà ce moment obscurcir le fragment, simulant l’éclairage de la lumière du mêmecoup.

    Somme toute, l’avantage de la méthode des textures d’ombre est que l’om-brage est évalué fragment par fragment, indépendemment de la forme de lagéométrie recevant l’ombre. Il n’y a pas de contrainte planaire comme dansle cas d’une ombre projetée.

    16 of 72

  • Carte d’ombre

    La technique de rendu d’ombrage par carte d’ombre (ou shadow map) esten tout point similaire à la méthode des textures d’ombres. La différenceprincipale dans le cas de la carte d’ombre se trouve dans la manière degénérer et consulter la texture.

    Pour une carte d’ombre, la texture générée à partir de la lumière est une cartede profondeur de la totalité de la scène. Il n’y a donc pas de notion d’élément”projetant de l’ombre” et d’élément ”recevant de l’ombre” comme c’était lecas pour la texture d’ombre.

    17 of 72

  • Carte d’ombre

    On commence donc par rendre notre scène à partir de l’emplacement de lalumière, et dans la direction de la lumière.

    Comme pour la texture d’ombre, on effectue le rendu dans une texture (ap-pellée carte d’ombre ici) :

    � La scène au complet doit être rendue dans la texture du point de vu de lalumière. (On conserve les matrices M et P comme pour la textured’ombre.)

    � La texture doit uniquement contenir l’information de profondeur dela scène, donc on doit configurer notre API graphique pour rendre letampon-Z dans une texture.

    � On désactive l’écriture dans le tampon de couleur puisque nous nesommes pas intéressé à avoir la scène en tant que tel, seulement la cartede profondeur donc seulement le tampon-Z.

    18 of 72

  • Carte d’ombre

    On génère une texture de profondeur à partir de l’emplacement de la lumière et dans la même direction que celle-ci. (RTR3, p.349)

    19 of 72

  • Carte d’ombre

    Mini-Annexe : Rendu dans un Tampon-Z sous forme de textureet désactivation de l’écriture dans le tampon de couleurs sousOpenGL

    //On génère un identifiant pour notre tamponZ et on le met//comme tamponZ courant.GLuint TamponZ;glGenRenderbuffers(1,&TamponZ);glBindRenderbuffer(GL_RENDERBUFFER,TamponZ);

    //On crée la texture où sera rendue la profondeur et on la//met comme texture courante.GLuint TextureProfondeur;glGenTextures(1,&TextureProfondeur);glBindTexture(GL_TEXTURE_2D,TextureProfondeur);

    //On défini notre texture pour qu’elle puisse contenir des informations//de profondeur. GL_DEPTH_COMPONENT indique qu’on spécifie le z-buffer.glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,

    largeur,hauteur,0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);[...]

    20 of 72

  • Carte d’ombre

    Mini-Annexe : Rendu dans un Tampon-Z sous forme de textureet désactivation de l’écriture dans le tampon de couleurs sousOpenGL (suite)

    [...]//Au moment du rendu...

    //On configure notre tampon-z comme étant le tampon-z courant.glBindRenderBuffer(GL_RENDERBUFFER,TamponZ);//On attache notre texture pour que la profondeur y soit rendue.glFrameBufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHEMENT,GL_TEXTURE_2D,TextureProfondeur,0);

    //On désactive le rendu des couleursglColorMask(false,false,false,false);

    //On envoie la géométrie ici. (glVertex et cie)

    //On réactive le rendu des couleursglColorMask(true,true,true,true);//On remet les tampons de rendu par défaut.glBindRenderBuffer(GL_RENDERBUFFER,0);

    //Notre profondeur est maintenant rendue dans notre texture.

    21 of 72

  • Carte d’ombre

    Une fois notre carte d’ombre générée, nous connaissons la profondeur du pointle plus près pour tous les points de la scène du point de vu de la lumière. (Doncla distance du point le plus près de la lumière pour un point donné dans lascène.)

    On procède ensuite comme pour la texture d’ombre,afin d’aller lire dans la carte d’ombre, en utilisant lesmatrices M et P pour savoir où se projete un pointvx quelconque de la scène dans la carte d’ombre.

    Connaissant la position de la lumière, on peutcomparer la distance entre le fragment rendu et lalumière à la profondeur lue dans la carte d’ombre. Sila distance est supérieure à la profondeur, c’est qu’unpoint plus près cache la lumière, et donc que notrefragment est dans l’ombre. Sinon, notre point estéclairé.

    On compare la distance entre lepoint vx et la lumière, à laprofondeur lue au point x sur lacarte d’ombre. Si la distancevx → lumiere est plus petite quela profondeur lue à x , nous avonsune ombre (comme c’est le cas iciavec vb ), sinon, le point est éclairé.(comme c’est le cas ici avec va).(RTR3, p.349)

    22 of 72

  • Texture et carte d’ombre - Limitations

    Pour clore les techniques de texture et de carte d’ombre, notons que laprécision de ces méthodes possède certaines limites.

    En effet, la précision de l’ombre se limitée parla résolution de la texture. Lorsque l’angle oula distance d’un point par rapport à la lumièredevient trop prononcé, on observe desartefacts de crénelage dans l’ombre, commeen fait foi l’image ci-contre.

    Il est possible de minimiser ces problèmes,sans toutefois complètement les régler, enutilisant des textures d’ombres ou des cartesd’ombre à plus haute résolution ou eneffectuant un filtrage sur la texture.

    Artefact de crénelage observé dans les points plusdistants de la lumière. Ceci s’explique par laprécision limitée de la texture utilisée pour lavérification de l’ombre.

    23 of 72

  • Volume d’ombre

    La méthode du volume d’ombre est une des méthodes les plus efficace etprécise pour générer une ombre en 3 dimensions.

    Pour introduire la méthode, imaginons un triangle et un point dans l’espace. Sion étend les lignes partant du point vers les vertices du triangle dans l’espace,on se retrouve avec une pyramide infinie ayant le point comme sommet.

    Pyramide infinie créée à partir d’un point dans l’espace et d’un triangle. (RTR3, p.341)

    24 of 72

  • Volume d’ombre

    Imaginons maintenant que le point est en fait une source de lumière. Toutl’espace de la pyramide situé sous le triangle serait dans l’ombre de celui-ci.On appelle cet espace le ”volume d’ombre”.

    Si le point est une lumière, la partie de la pyramide tronquée située sous le triangle devient le volume d’ombre du triangle. Tous les pointscontenus dans ce volume sont automatiquement dans l’ombre. (RTR3, p.341)

    25 of 72

  • Volume d’ombre

    Un point est dans l’ombre s’il est contenu dans le volumed’ombre. Le volume d’ombre est la pyramide tronquéesituée sous le triangle. Une scène étant composée deplusieurs triangles, on génère 1 volume d’ombre partriangle. L’union des volumes d’ombre d’une scènecomplète comprend tout l’espace se trouvant dansl’ombre. (RTR3, p.341)

    Déterminer si un point de la scène estdans l’ombre revient donc à vérifier si lepoint est contenu dans la pyramidetronquée définissant le volume d’ombre.

    Notre volume d’ombre étant défini àpartir d’un triangle, si notre scènepossédait 1 lumière et 150 000 triangles,pour déterminer si un point se trouvedans l’ombre, nous auriosn à vérifier s’ilest dans un des 150 000 volumes d’ombreproduits à partir des triangles.

    Autrement dit, l’emsemble des pointsdans l’ombre dans la scène est le résultatde l’union de tous les volumes d’ombre.

    26 of 72

  • Volume d’ombre

    Bien qu’il soit possible de vérifier géométriquement si un point est contenudans une pyramide tronquée, et donc si un point est dans le volume d’ombre, ilserait extrêmement long d’effectuer cette vérification pour tous les fragmentsrendus de la scène, avec tous les volumes d’ombres formés par les triangles.

    Pour déterminer la géométrie dans l’ombre,nous utilisons une astuce beaucoup plusrapide tirant profit du tampon pochoir.

    Pour expliquer la méthode, voici la scène quenous utiliserons. Dans cette scène, nous avonsune source de lumière ponctuelle éclairant untriangle projettant une ombre sur un plan.

    Scène exemple.

    27 of 72

  • Volume d’ombre

    Étape 1 : La première étape consiste à rendre la totalité de la scène, en nes’occupant que du coefficient ambiant et du coefficient émissif pour le calculde la lumière. Dans cette étape, les tests de profondeur sont activés ainsi quel’écriture dans le tampon-z.

    À cette étape, on en profite pour initialiser le tampon pochoir à 0.

    Coefficients ambiant et émissif utilisés dans le rendu de la scène. Notre tampon pochoir est initialisé à 0.

    28 of 72

  • Volume d’ombre

    Étape 2 : On désactive l’écriture dans le tampon de couleur et l’écriture dansle tampon-z, on garde le test de profondeur activé. On configure le test dutampon pochoir pour toujours réussir et incrémenter de 1 chaque fois qu’unpixel passe le test pochoir et le test de profondeur.

    On envoit ensuite au pipeline les faces avants des volumes d’ombre.

    On envoit uniquement les faces avant du volume d’ombre. (Les faces passent à travers le pipeline et mettent à jour le tampon pochoir mais nesont pas visibles car l’écriture au tampon de couleur est désactivée.) On a donc les dites faces écrites dans le tampon pochoir comme si ellesavaient été rendues dans la scène.

    29 of 72

  • Volume d’ombre

    Étape 3 : On configure le test du tampon pochoir pour toujours passer etdécrémenter de 1 chaque fois qu’un pixel passe le test pochoir et le test deprofondeur. On garde le reste des configurations identiques à celles de l’étapesuivante.

    On envoit ensuite au pipeline les faces arrières des volumes d’ombre.

    On envoit uniquement les faces arrières du volume d’ombre. Chaque fragment qui passe le test de profondeur décrémente de 1 le pixelcorrespondant dans le tampon pochoir. La seule partie du tampon pochoir étant encore à 1 à ce moment est la partie où seulement les facesavant ont été rendues et où les faces arrières ne passaient pas le test de profondeur.

    30 of 72

  • Volume d’ombre

    Étape 4 : On réinitialise le tampon-z mais on conserve le tampon de couleur(où se trouve notre scène avec l’ambiant et l’émissif d’affiché). On réactivel’écriture dans le tampon-z et on configure le tampon pochoir pour que le testpasse seulement où sa valeur est à 0, et qu’il ne modifie pas son contenulorsque le test passe. On configure la fonction de mélange pour faire unmélange additif avec ce qui est déjà contenu dans le tampon de couleur.

    On rend ensuite la totalité de notre scène une seconde fois, cette fois-ci encalculant le coefficient diffus et spéculaire pour chaque point de la scène.

    On rend une seconde fois la scène avec le calcul d’illumination pour le diffus et le spéculaire, seulement où le tampon pochoir est égal à 0. Onobtient ainsi notre ombre.

    31 of 72

  • Volume d’ombre

    Le même principe fonctionne avec n’importe quelle géométrie possédant plu-sieurs triangles. Dans le cas où la géométrie possède plusieurs triangles, il fauts’assurer que le nombre de fois où le tampon pochoir s’incrémente ne dépassepas la capacité de ce dernier.

    Par exemple, si votre volume d’ombreest l’union des volumes d’ombre de300 triangles et que les 300 trianglessont alignés par rapport à la caméra,le tampon pochoir s’incrémentera 300fois lors du rendu des faces avant. Sile tampon pochoir est de 8-bit, savaleur maximale est de 255 par pixelet il y aurait un dépassement decapacité passé 255 incréments.

    Dans le cas de modèles complexes, il faut s’assurer que lesincréments lors de la génération du volume d’ombre nedépasseront pas la capacité des pixels du tampon pochoir.(Microsoft, 2006)

    32 of 72

  • Volume d’ombre

    Nous savons maintenant comment rendre une ombre à partir d’un volumed’ombre. Reste à déterminer comment générer le volume d’ombre en soit.

    La première option est de générer un quadrilatère à partir de chaque segmentdes triangles. Deux points du quadrilatère restent aux points originaux dusegment, les deux autres points sont étendus vers l’infini en fonction de laposition de la lumière. Les trois côtés de notre volume d’ombre sont ainsigénérés et nous avons notre pyramide tronquée.

    Pour chaque segment de notre géométrie, on génère un quadrilatère. Deux points du quadrilatère restent sur le segment et les deux autrespoints sont étendus vers l’infini en fonction de la position de la lumière. (Dans la direction opposée de cette dernière par rapport au triangle.)

    33 of 72

  • Volume d’ombre

    Avec la méthode précédente, nous devons étendre nos points en fonction de laposition de la lumière. Plutôt que de les étendre jusqu’à l’infini, on les étenden pratique sur distance k fixe relativement élevée 1 Pour étendre un vertexvx à sa position étendue vxe , on effectue simplement :

    vxe = vx +vx − l||vx − l ||

    ∗ k (5)

    1. Il est possible de réellement étendre les points jusqu’à l’infini avec certaines astuces de géométrie projectives sortant du cadre de cecours. Pour plus d’information : RTR3, p.345.

    34 of 72

  • Volume d’ombre

    Une méthode encore plus efficace pour générer le volume d’ombre est deseulement générer les plans de de notre volume d’ombre sur la sil-houette de la géométrie par rapport à la lumière. La problématique revientalors à trouver quels segments constituent la silhouette de notre géométrie.

    Un segment faisant partie de la silhouette est un segment pour lequel un destriangles qui lui est associé fait face à la lumière, alors que l’autre triangle luiétant associé fait dos à la lumière.

    La silhouette peut facilement être extraite, en temps réel, à l’aide du nuanceurde vertex et d’une génération intelligente de la géométrie.

    35 of 72

  • Volume d’ombre

    On commence par générer, comme pour la méthode précédente, un quadri-latère pour chaque segment. Le quadrilatère créé, il possède 2 points situéssur chaque extrémité du segment. Pour chaque paire de point situé à uneextrémité, on associe à un des deux points la normale du triangle situé d’unepart du segment, et à l’autre point la normale située de l’autre part du seg-ment.

    À ce stade du processus, les quadrilatères sont dégénérés car ils possèdentdeux paires de points identiques, et donc une aire nulle. (La surface couvre 0fragment donc aucun fragment n’est produit après le nuanceur de vertex.)

    36 of 72

  • Volume d’ombre

    Dans le nuanceur de vertex, on prend le vecteur reliant le vertex à la lumière(l − vx) et on le multiplie (produit scalaire) par la normale précédemmentassociée à celui-ci.

    Si le résultat du produit scalaire est positif, le vertex reste à la même position.S’il est négatif, on étend le vertex tel que vu à l’équation (5).

    Dans le cas où les deux triangles d’un segment font face à la lumière, lesegment ne fait pas partie de la silhouette. Les produits scalaires sont alorstous deux positifs et les vertices du quadrilatère restent au même endroit. Lequadrilatère demeure donc dégénéré et ne sera pas rendu.

    Dans le cas où les deux triangles d’un segment font dos à la lumière, ils ne fontpas non plus partie de la silhouette. Les produits scalaires sont alors négatifset les 4 vertices du quadrilatères sont étendus. Le quadrilatère n’est pas rendupuisqu’il forme un quadrilatère dégénéré.

    37 of 72

  • Volume d’ombre

    Finalement, si un des deux triangles fait face à la lumière et l’autre lui fait dos,deux des vertices du quadrilatère seront étendus et les deux autres resterontau même endroit. Ceci formera un côté de notre volume d’ombre automati-quement.

    En procédant de la même façon pour tous les segments de notre géométrie, ongénère un volume d’ombre correspondant à la silhouette de notre géométrie.Dans ce cas-ci, notre volume d’ombre contient beaucoup moins de géométrieque si des pyramides tronquées étaient générées pour chaque triangle dumodèle. Le processus de rendu de l’ombre est donc accéléré et on diminueles risques de dépasser la capacité du tampon pochoir..

    Génération d’un volume d’ombre à partir des segments formant la silhouette de notre géométrie. (RTR3, p.347)

    38 of 72

  • Volume d’ombre

    Pour clore cette section, notons quelques variations sur la technique de basedes volumes d’ombre :

    � La géométrie utilisée pour générer le volume d’ombre peut être uneversion simplifiée de la vraie géométrie.

    � Plutôt que de directement utiliser le modèle 3D et générer le volumed’ombre en fonction de la position de la lumière, il est possible d’utiliserune approximation très grossière de ce dernier, par exemple un cylindre,qui constitue déjà le volume d’ombre. On l’oriente en fonction de lalumière et on calcule directement le volume d’ombre sans avoir à legénérer à partir de la géométrie.

    � La technique vue avec le tampon pochoir permet de détecter n’importequelle intersection de géométrie avec un volume. Soyez créatif dans votreutilisations de cette technique !

    39 of 72

  • Réflexion en temps réel

    40 of 72

  • Réflexion planaire en temps réel

    Avant d’explorer les diverses méthodes de réflexion de la lumière en tempsréel, notons que ces dernières s’appliquent pour la réflexion de la lumière surdes surfaces planes ou quasi-planes. (Par quasi-plane, on parle par exempled’une géométrie plane avec un effet de texture donnant une apparence non-planaire.) Ce cas particulier de la réflexion de la lumière est appellé réflexionplanaire.

    Réflexion planaire en temps réel dans un jeu vidéo. (Disney’s Magical Mirror Starring Mickey Mouse,Disney, 2002)

    La réflexion de la lumière en temps réel sur une surface quelconque est unproblème encore ouvert en infographie, pour lequel une solution générale suf-fisamment réaliste et performante n’a pas encore été trouvée.

    41 of 72

  • Réflexion planaire par duplication de géométrie

    La réflexion planaire par duplication de géométrie utilise certaines caractéristiquesgéométriques de la réflexion de la lumière.

    Pour la réflexion de la lumière, on saitque l’angle d’incidence de la lumièreest égal à l’angle de réflexion de cettedernière, ces angles étant calculés àpartir de la normale de la surface.

    Étant donné cette propriété, on peutdire que regarder un objet réfléchi parun mirroir revient au même queregarder un objet identique inversé del’autre côté du mirroir, comme en faitfoi l’image ci-contre.

    Regarder un objet réfléchi revient au même que regarder unobjet identique inversé de l’autre côté du mirroir. (RTR3, p.386)

    42 of 72

  • Réflexion planaire par duplication de la géométrie

    La première technique pour le rendu de la réflexion d’une scène exploite cettepropriété :

    1. On rend la scène normalement.

    2. On inverse la scène en lui faisant faire une réflexion par rapport au plande symmétrie. (Il ne faut pas oublier de faire la même chose avec leslumières.)

    3. On rend la scène inversée.

    4. On rend la surface mirroir avec un coefficient de transparence qui simuleici le coefficient de réflexion. (Si la surface est moins transparente, nousaurons l’impression que la surface est moins réfléchissante.)

    43 of 72

  • Réflexion planaire par duplication de la géométrie

    De l’acétate précédente, nous devons trouver comment inverser la scène géométriquement.

    On sait que si le plan de réflexion était situé sur l’origine, avec une normale(0, 1, 0) (soit un plan aligné avec les axes x et z , réfléchissant en y), la réflexionsur ce plan serait donnée par la matrice de transformation :

    R(0,1,0) =

    1 0 0 00 −1 0 00 0 1 00 0 0 1

    (6)Nous devons trouver comment appliquer cette réflexion pour un plan deréflexion quelconque.

    44 of 72

  • Réflexion planaire par duplication de la géométrie

    Nous connaissons notre plan de réflexion, défini par un vecteur normal n etun point p sur le plan. Nous pouvons prendre le repère défini par le plan deréflexion, l’emmener dans un repère de coordonnées canonique, lui appliquerla matrice R(0,1,0) puis ensuite remmener le tout dans le repère défini par leplan de réflexion.

    On commence donc en générant une matrice de changement de repère nouspermettant de passer du repère canonique au repère tangeant au plan, quenous noterons Cnp.

    Cnp =

    t ′x nx t

    ′′x px

    t ′y ny t′′y py

    t ′z nz t′′z pz

    0 0 0 1

    (7)où t ′ et t ′′ sont respectivement des vecteurs tangeants et cotangeants du planformé par n et p.

    45 of 72

  • Réflexion planaire par duplication de la géométrie

    On souhaite ici emmener notre repère plan dans le repère canonique, on ef-fectue donc : C−1np .

    On applique ensuite au repère la réflexion selon la matrice de réflexion R(0,1,0)trouvée à l’équation (6).

    On prend le repère ainsi réfléchi, qu’on remmène sur le repère tangeant au planavec Cnp. Notre réflexion en fonction d’un plan quelconque est à ce momenteffectuée.

    L’opération se résume à la matrice M, définie telle que :

    M = CnpR(0,1,0)C−1np (8)

    La réflexion r d’un vertex v en fonction du plan n, p est donc r = Mv .

    46 of 72

  • Réflexion planaire par duplication de la géométrie

    L’opération une fois effectuée, l’illusion de réflexion est réaliste. En réalité, lascène est simplement rendue deux fois, en utilisant la surface réfléchissantecomme plan pour inverser cette dernière.

    Haut : Scène telle qu’observée avec l’effet de réflexion. Bas : Scène sans l’effet mirroir, on remarque que la géométrie est simplement dupliquéeet inversée sur le plan de réflexion. (Linden Research Inc, 2009)

    47 of 72

  • Réflexion planaire par duplication de la géométrie

    Lors de la réflexion planaire par duplication de la géométrie, il existe cer-tains cas où inverser la scène posera problème, notamment lorsque la surfaceréfléchissante couvre partiellement la scène.

    La surface réfléchissante ne couvre pas totalement la scène, il est donc possible de voir ”sous” elle à certains endroits. Dans le cas représenté ici,l’illusion de réflexion est perdue car on peut apercevoir le cylindre dupliqué et inversé même où il n’y a pas de surface réfléchissante. (RTR3p.388)

    48 of 72

  • Réflexion planaire par duplication de la géométrie

    Pour régler le problème précédent, on modifie notre processus pour générer laréflexion en ajoutant une étape.

    Après avoir rendu la scène originale, et avant de rendre notre scène ”réfléchie”,on rend la surface réfléchissante sans l’inscrire dans le tampon de couleur, maisen incrémentant le tampon pochoir partout où la surface réfléchissante est ren-due. (La surface n’est donc pas réellement rendue, elle ne fait qu’incrémenterle tampon pochoir.)

    Par la suite, lors du rendu de la scène ”réfléchie”, on configure le test du tam-pon pochoir pour ne passer qu’à l’endroit où sa valeur n’est pas de 0. De cettemanière, on rend la scène uniquement où notre surface réfléchissante étaitdéfinie, puisque c’est le seul endroit où le tampon pochoir a été incrémenté.

    49 of 72

  • Réflexion planaire par duplication de la géométrie

    Gauche : Réflexion correcte, effectuée uniquement où sont définies les surfaces réfléchissantes. Droite : Tampon pochoir résultant de l’opérationd’incrément ajoutée au processus permettant de simuler la réflexion. (RTR3, p.388)

    50 of 72

  • Réflexion planaire par duplication de la géométrie

    Pour terminer, notons qu’il est possible que de la géométrie de notre scèneinitiale soit définie de l’autre côté du plan mirroir. (Par exemple, si notre planmirroir est de l’eau, des éléments sont définis sous l’eau.)

    Pour éviter que la partie située de l’autre côté du plan mirroir ne se retrouvedevant celui-ci lors de l’inversion, on peut effectuer le rendu en ajoutant unplan de tronquage via l’API graphique. Le plan doit se trouver au même endroitque la surface réfléchissante. Toute la géométrie située du mauvais côté duplan ne sera pas rendue.

    Mini-annexe : Définir un plan de tronquage personnalisé sousOpenGL.

    glClipPlane(GLenum plane, const GLdouble *equation)

    où plane est l’identifiant du plan et equation est un vecteur contenant les coefficients a, b, c, d de

    l’équation du plan.

    51 of 72

  • Réflexion planaire par duplication de la géométrie

    Correction des artefacts observés dans la réflexion lorsque la géométrie de la scène se trouve des deux côtés du plan réfléchissant. On souhaite iciéviter que la géométrie située derrière le plan se retrouve devant lui lorsqu’elle est inversée pour éviter qu’elle soit rendue.

    52 of 72

  • Réflexion planaire double passes

    La réflexion planaire double passefonctionne sensiblement de la mêmemanière que la réflexion planaire parduplication de géométrie.

    Comme nous l’avions vu plus tôt,effectuer une réflexion revient àprendre toute la scène et l’inverser del’autre côté du mirroir.

    Nous pouvons aussi dire que l’imageréfléchie sur le mirroir est enréalité l’image de la scène si lacaméra était transportée de l’autrecôté du mirroir. C’est le principesous-jacent à la réflexion planairedouble passes.

    L’image réfléchie est identique à l’image prise à travers le mirroiren inversant la caméra.

    53 of 72

  • Réflexion planaire double passes

    La réflexion planaire double passes s’effectue donc en suivant les étapes sui-vantes :

    1. On prend la position courante de la caméra, le vecteur de vision et levecteur ”haut” (la matrice ”vue”) et on multiplie le tout par la matriceM trouvée à l’équation (8). Ceci inverse la caméra de l’autre côté dumirroir.

    2. On rend la scène dans une texture.

    3. On remet la caméra à sa position/direction initiale.

    4. On plaque la texture rendue en 2 sur le mirroir.

    5. On rend la scène normalement.54 of 72

  • Réflexion planaire double passes

    Exemple simple d’utilisation de la réflexion planaire double passes. La réflexion sert ici à reproduire la scène telle qu’aperçue par les rétroviseursd’une voiture de course. (Codemasters, 2008)

    55 of 72

  • Réflexion planaire double passes

    Effectuer le rendu de la scène dans une texture permet aussi de simuler deseffets de texture sur la surface réfléchissante. Par exemple, la normale de lasurface peut être utilisée pour modifier sensiblement la position où est lue latexture de réflexion, afin de simuler des effets de distortion.

    Réflexion double passes sur une surface à laquelle on applique un bump map. La normale donnée par le bump map est utilisée notamment pourmodifier la position lue dans la texture afin d’augmenter le réalisme des vagues. (Valve Corporation, 2003)

    56 of 72

  • Réflexion planaire double passes

    Pour terminer, notons que toutes les techniques et trucs vus pour la réflexionplanaire par duplication de la géométrie restent valides dans le cas de laréflexion planaire double passes. (On parle ici de l’utilisation du tampon po-choir et des plans de tronquage personnalisés.)

    57 of 72

  • Calcul de l’occultation ambiante

    58 of 72

  • Occultation ambiante

    Dans les scènes virtuelles, on utilise souvent unelumière ambiante pour simuler la lumièreinter-réfléchie à travers la scène. La lumière ambianteest appliquée de manière uniforme sur la géométrie etoffre peu d’information sur sa consitution, puisqu’ellene tient pas compte de cette dernière.

    Pour donner plus de profondeur et de détail à unegéométrie, il est possible de calculer son occultationambiante. L’occultation ambiante est la quantité delumière ambiante qui devrait être bloquée par lagéométrie d’un objet. La géométrie située dans descreux ou des trous recevra habituellement moins delumière, créant une zone d’ombre et donnant ainsiplus de profondeur à l’objet éclairé. L’occultationambiante modélise ce phénomène.

    Haut : Objet éclairé uniquementavec une lumière ambianteuniforme. On ne remarque que lecontour de l’objet, les détails seperdent car l’occultation ambianten’est pas calculée. Bas : Objetéclairé avec une lumière ambiantemais tenant aussi compte del’occultation ambiante dans lecalcul d’illumination. Les détails del’objet ressortent mieux carl’occultation ambiante est calculée.(RTR3, p.374)

    59 of 72

  • Occultation ambiante

    En supposant une surface lambertienne (surface répondant aux équationsd’illumination diffuse de Lambert, soit les équations vues en IMN428). Laradiance de la lumière ambiante, pour une direction incidente l de la lumièreest donnée tel que Li (l) = LA, une constante, puisque Li (l) est constant pourtout l . L’irradiance pour l’illumination ambiante à un point p avec une nor-male n évaluée sur l’hémisphère Ω des directions possibles incidentes de lalumière se traduit donc par l’équation :

    E (p, n) =

    ∫Ω

    LAcos(θi )dωi (9)

    En évaluant l’intégrale, et sachant que LA est constant, on obtient :

    E (p, n) = πLA (10)

    En d’autre mots, l’illumination ambiante est constante pour tout p et tout ndans notre modèle, ce qui correspond au modèle d’illumination ambiant deLambert, représenté dans la figure du haut à la page précédente.

    60 of 72

  • Occultation ambiante

    Nous voulons ici tenir compte du fait que la lumière arrivant de certainesdirections sera bloquée par la géométrie. On ajoute donc le terme de Cook etTorrance, v(p, l), à l’équation (9). v(p, l) retourne 1 si la lumière peut arriverau point p dans la direction l , ou 0 si elle est bloquée par la géométrie.

    E (p, n) = LA

    ∫Ω

    v(p, l)cos(θi )dωi (11)

    Représentation schématique de l’évaluation du terme de Cook et Torrance v(p, l).

    61 of 72

  • Occultation ambiante

    On peut transformer (11), pour obtenir :

    E (p, n) = kA(p)πLA (12)

    De cette façon,le terme d’occultation ambiante kA(p) (la quantité de lumièreambiante se rendant au point p entre 0 et 1) peut être calculée séparémentde la constante d’illumination ambiante LA. Pour ce faire, on définit kA(p) telque :

    kA(p) =1

    π

    ∫Ω

    v(p, l)cos(θi )dωi (13)

    62 of 72

  • Occultation ambiante

    En utilisant v(p, l), si la lumière est bloquée, à n’importe quelle distance, lafonction retourne 0. On souhaite éviter un cas où une scène intérieure seraitcomplètement obscurcie par le fait qu’elle est entourée de murs (dans unepièce avec une porte fermée par exemple.) On remplace donc le terme v(p, l)par un terme mieux défini, soit le terme de Zhukov, remplaçant la fonction devisibilité v(p, l) par une fonction de visibilité bornée ρ(p, l , distmax).

    kA(p) =1

    π

    ∫Ω

    ρ(p, l , distmax)cos(θi )dωi (14)

    Lorsqu’un rayon l partant du point p intersecte la géométrie à une distanceinférieure à distmax (une constante), le terme de Zhukov retourne une valeurnormalisée entre 0 et 1 sur l’intervale 0 et distmax . Si le point d’intersectionest à une distance supérieure à distmax , le terme retourne automatiquement1.

    63 of 72

  • Occultation ambiante

    Calculer l’occultation ambiante revient donc à déterminer un coefficient kApour chaque point de la géométrie. Dans le cadre de cette section, nousverrons deux méthodes pour faire ce calcul :

    1. Méthode hors-ligne.

    2. Méthode en espace image (Il existe plusieurs méthodes en espace image,nous ferons un survol des plus intéressantes.)

    64 of 72

  • Occultation ambiante, méthodes hors-ligne

    La méthode hors-ligne, comme son nom l’indique, revient à pré-calculer l’oc-cultation ambiante plutôt que de le faire pendant le rendu.

    L’occultation ambiante ne dépend pas de la position relative de l’objet parrapport aux lumières, il est donc possible de pré-calculer les coefficients d’oc-cultation ambiante pour chaque vertices, puis d’utiliser ces derniers lors ducalcul d’illumination dans le nuanceur de fragment.

    Le coefficient d’occultationambiante devient alors unattribut supplémentaire ànotre vertex, et se voitinterpolé lorsque passé dunuanceur de vertex aunuanceur de fragment.

    On précalcule l’occultation ambiante en évaluant directement l’intégrale vue àl’équation (14) (On discrétise cette dernière en une sommation surl’hémisphère.) (RTR3, p.375)

    65 of 72

  • Occultation ambiante, Méthode hors-ligne

    Pour le précalcul et l’utilisation de l’occultation ambiante :

    Calcul

    1. Pour chaque vertex de la géométrie.1.1 Lancer des rayons de manière à échantilloner l’hémisphère Ω.1.2 Calculer le point d’intersection de chacun des rayons.1.3 À l’aide du point d’intersection, calculer la distance et évaluer le terme de

    Zhukov.1.4 Faire la somme des termes calculés pour tous les rayons, tel que représenté

    à l’équation (14).1.5 Le résultat obtenu, stocker le résultat comme attribut du vertex.

    Rendu

    2. Lors du calcul de l’illumination ambiante, multiplier le coefficientd’illumination ambiante par le coefficient d’occultation ambiante lors ducalcul de l’illumination, afin d’obtenir l’irradiance ambiante, tel quereprésentée à l’équation (12).

    66 of 72

  • Occultation ambiante, méthodes en espace fenêtre

    Il existe différentes méthodes d’occultation ambiante en espace fenêtre. Leurobjectif est d’être performantes plutôt que précises. Les résultat qu’elles re-tournent sont donc habituellement peu réalistes lorsqu’on les compare aurésultat réel, mais fournissent un estimé perceptuellement convaincant.

    Gauche : Occultation ambiante estimée en espace fenêtre. Droite : Occultation évaluée avec une simulation complète d’illumination globale.(RTR3, p.374)

    67 of 72

  • Occultation ambiante, méthodes en espace fenêtre

    Méthode par échantillonnage :

    1. On rend la scène en première passe et on conserve le Tampon-Z.

    2. Dans une deuxième passe, on effectue un échantillonnage aléatoire despoints contenus dans une sphère entourant le point à rendre, dansl’image. On échantillonne n fois.

    3. À l’aide du Tampon-Z, on vérifie combien de points échantillonnés setrouvent devant la géométrie (On compare la distance de l’échantillon àcelle contenu dans le tampon-Z, si la distance de l’échantillon est plusgrande que la valeur correspondante du Tampon-Z, il est situé derrière lagéométrie, sinon, il est situé devant.) On stock ce nombre dans unevariable qu’on notera x .s

    4. On calcule le coefficient d’occultation ambiante tel que kA = x/n.

    5. Lors du rendu, on retourne chercher le coefficient d’occultation ambiantecalculé pour ce pixel, qu’on utilise pour le calcul d’illumination.

    68 of 72

  • Occultation ambiante, méthodes en espace fenêtre

    Représentation de la méthode d’occultation ambiante par échantillonnage (RTR3, p.383)

    Pour rendre la méthode encore plus efficace, notons qu’il est possible d’ef-fectuer un lissage sur les différents coefficients calculés pour chaque pixel del’image. On évite ainsi d’avoir un bruit causé par la variation dans l’échantillonnagealéatoire lors du calcul des coefficients d’occultation ambiante.

    69 of 72

  • Occultation ambiante, méthodes en espace fenêtre

    Méthode avec filtrage du tampon-z :La dernière méthode de calcul de l’occultation ambiante que nous verronseffectue un estimé encore plus grossier de l’occultation ambiante. Ceci étantdit, elle est la méthode de loin la plus performante.

    1. On rend la géométrie de la scène et on conserve le résultat du tampon-zdans une texture.

    2. On crée une copie du tampon-z dans une seconde texture.

    3. On applique un flou gaussien tenant compte de la profondeur à la copiedu tampon-z. (Pour un point du tampon-z, on évalue seulement le flouavec les points l’entourant ayant sensiblement la même profondeur quelui.)

    70 of 72

  • Occultation ambiante, méthodes en espace fenêtre

    4. On soustrait la texture avec le flou à la texture sans le flou. On seretrouve alors avec une texture où les irrégularités dans le tamon-zressortent.

    5. Chaque texel de la texture obtenue à l’étape précédente correspond à1− kA, on a ainsi nos coefficients d’occultation ambiante.

    6. Lors du rendu, on retourne chercher le coefficient d’occultation ambiantecalculé pour ce pixel, qu’on utilise pour le calcul d’illumination.

    Gauche : Scène avec une illumination diffuse et ambiante de base, sans occultation ambiante. Droite : Scène identique, avec l’illuminationdiffuse et ambiante calculée à l’aide d’un filtrage du tampon-z. (Luft et al., 2006)

    71 of 72

  • Références suggérées :

    Livre T. Akenine-Möller, E. Haines et N.Hoffman, ”Real-Time Rendering”, 3rdEdition, A. K.Peters, Ltd., Natick, MA, USA, 2008. (pp. 327 à 391)

    Article T. Luft, C. Colditz, O. Deussen, ”Image Enhancement by UnsharpMasking the Depth Buffer”, ACM Transactions on Graphics, Volume 25,#3, ACM Press, New York, NY, USA, 2006 (pp.1206-1213)

    Article Martin Mittring, ”Finding Next Gen - CryEngine 2”, AdvancedReal-Time Rendering in 3D Graphics and Games Cours - SIGGRAPH2007, ACM Press, New York, NY, USA, 2007 (pp. 97 - 121)

    72 of 72

    IntroductionOmbre projetéeTexture d'ombreCarte d'ombreVolume d'ombreRéflexion planaireRéflexion planaire double passesOccultation ambiante


Recommended