FAQ Programmation 3DConsultez toutes les FAQ

Nombre d'auteurs : 7, nombre de questions : 67, dernière mise à jour : 20 mai 2017 

 
OuvrirSommaireRendu 2D / 3DTechniques et optimisationsTechniques d'illumination

Le modèle d'éclairage utilisé par les API 3D, et qui permet d'obtenir des résultats satisfaisants sans énormément de calculs, est appelé modèle de Phong. Il est défini à base de composantes ambiantes, diffuses, émissives et spéculaires. L'illumination en un point est décrite par la formule suivante :

 
Sélectionnez

Illumination = Ambiante + Diffuse + Spéculaire + Emissive

La composante ambiante est une constante, qui va colorer les pixels d'un objet par la même couleur, quel que soit l'environnement lumineux. C'est très rapide à « calculer », mais ce n'est pas suffisant, car cela va donner aux objets un aspect plat.

La composante diffuse est elle différente pour chaque sommet : elle tient en effet compte du vecteur normal du sommet ainsi que de la direction de la lumière. En pratique, la contribution diffuse d'une lumière est déterminée par l'angle entre les deux vecteurs cités précédemment, ce qui se calcule via un simple produit scalaire. La composante diffuse est la plus importante de toutes : elle permet de donner un effet 3D et lissé aux objets.

La composante spéculaire correspond au léger reflet de la lumière sur les bords des objets. Elle permet de donner un aspect brillant aux objets, et est calculée à partir du vecteur de lumière réfléchi et de la position de la caméra. Elle est généralement élevée à une puissance N, de ce fait elle est plus intense, mais plus petite que la composante diffuse.

La composante émissive est, comme son nom l'indique, une simulation de la lumière émise par un objet. Ainsi, comme la composante ambiante, il ne s'agit que d'une valeur constante pour tous les sommets du modèle.

De gauche à droite : ambiente, diffuse, spéculaire et émissive
De gauche à droite : ambiante, diffuse, spéculaire et émissive
Créé le 12 mai 2006  par Laurent Gomila

Il existe beaucoup de techniques pour simuler l'illumination dans une scène 3D (voir questions ci-dessous), chacune ayant une utilité bien précise.

Il faut commencer par distinguer deux types d'éclairage : l'éclairage par vertex (per-vertex lighting) et l'éclairage par pixel (per-pixel lighting). Certaines techniques d'éclairage peuvent être réalisées indifféremment par vertex ou par pixel, d'autres seulement par vertex, et d'autres uniquement par pixel. L'éclairage par pixel est généralement plus réaliste (puisque plus précis), mais également plus coûteux.

Le modèle de Phong offert par les API 3D permet d'apporter un visuel beaucoup plus 3D et lissé aux objets, mais le résultat est bien insuffisant pour les jeux actuels. D'autant plus que ce serait clairement sous-exploiter les cartes graphiques actuelles.

Les lightmaps ont beaucoup été utilisées, surtout dans les jeux de type first person shooter, mais le sont de moins en moins. Cela s'explique par le fait que les cartes graphiques sont de plus en plus puissantes, et supportent en temps réel de plus en plus d'algorithmes évolués. À l'heure actuelle, les lightmaps tendent à disparaître complètement dans les jeux commerciaux.

En fait, les solutions actuelles utilisent un mix de plusieurs techniques. Par exemple, le calcul de PRT par spherical harmonics par vertex pour tout ce qui est statique (les décors), et les shadow volumes ou les shadow maps pour les entités animées.

Pour ajouter en réalisme, une illumination par pixel peut être ajoutée par-dessus tout ça : du dot3 bump mapping pour les configurations modestes, jusqu'a l'offset bump mapping pour les cartes supportant les shaders 2.0.

Enfin, rien ne vous empêche d'ajouter par dessus un précalcul d'ambient occlusion pour ajouter un peu d'ombrage gratuitement.

Mis à jour le 12 mai 2006  par Laurent Gomila

Le lightmapping n'est pas une technique temps réel : tout est précalculé. En effet, on utilise une technique précise comme le raytracing ou encore la radiosité (très lentes, mais peu importe puisque c'est du précalcul) pour calculer tout l'éclairage de la scène, puis on stocke celui-ci dans des textures (les lightmaps) que l'on n'a plus qu'à appliquer ensuite aux différents polygones de la scène.

Il s'agit donc d'une technique réaliste et performante, mais très limitée, puisqu'entièrement statique. De plus, il ne faut pas négliger la consommation mémoire supplémentaire due aux lightmaps.

Cette technique était très utilisée par beaucoup de jeux, par exemple les vieux Quake et Doom, mais tend à disparaître avec la montée en puissance des cartes graphiques et la quantité de nouveaux algorithmes plus élaborés qu'elles sont maintenant capables d'appliquer en temps réel.

De gauche à droite : scène sans éclairage, lightmaps, et rendu combiné
De gauche à droite : scène sans éclairage, lightmaps, et rendu combiné
Créé le 12 mai 2006  par Laurent Gomila

Le précalcul du transfert de luminance (en anglais : PRT - Precomputed Radiance Transfert) est une technique qui consiste à précalculer (dans une certaine mesure) l'éclairage global d'une scène, et de restituer celui-ci en temps réel. Les possibilités sont nombreuses : on peut simplement précalculer un éclairage diffus, mais aussi l'ombrage, l'interréflexion, la réfraction, etc. Et comme il s'agit de stocker des fonctions et non plus directement des couleurs, tout ceci peut être, dans une certaine mesure, dynamique.

Une technique à la mode pour stocker des fonctions de transfert de luminance est l'utilisation de spherical harmonics. Les spherical harmonics sont un outil mathématique très pratique, puisque permettant de compresser des fonctions en quelques coefficients. Son nom vient du fait que les fonctions traitées sont définies sur une sphère, et que la technique consiste à travailler dans un espace de fréquence. Nous ne détaillerons pas ici les mathématiques (plutôt complexes pour les non-initiés) qui se cachent derrière tout ceci, mais beaucoup d'articles de recherche sont disponibles sur le Net pour qui voudrait approfondir.

À noter aussi que DirectX inclut depuis quelque temps dans sa bibliothèque D3DX des fonctions facilitant les calculs de PRT par spherical harmonics.

Effets obtenus en temps réel via PRT
Effets obtenus en temps réel via PRT
Créé le 12 mai 2006  par Laurent Gomila

Lien : Page de Peter Pike Sloan
Lien : Spherical harmonic lighting : the gritty details

L'ambient occlusion est une technique de précalcul, qui peut ou non être utilisée en temps réel. Son principe est relativement simple : l'illumination en un point est principalement fonction de la géométrie voisine. Ainsi on peut précalculer pour chaque sommet de la scène un facteur d'éclairage, qui sera fonction des autres sommets de la scène, sans tenir compte de l'éventuel futur éclairage dynamique qui lui sera appliqué.

Cette technique ne donne pas toujours des résultats physiquement corrects, mais permet d'ajouter à peu de frais beaucoup de réalisme aux éléments statiques des scènes 3D.

[ALT-PASTOUCHE]
Exemple de précalcul d'ambient occlusion
Créé le 12 mai 2006  par Laurent Gomila

Lien : Tutoriel et liens sur l'ambient occlusion

Le bump mapping est une technique générale de rendu 3D pouvant prendre plusieurs formes. Le principe est d'appliquer aux objets un texturage de sorte qu'on ait l'impression qu'ils possèdent du relief.

Pour effectuer un éclairage par pixel et donner une impression fine de relief aux objets, il est nécessaire d'avoir la normale en chaque pixel ; ce qui n'est possible que via une normal map. La normal map est donc simplement une texture qui décrit la normale en chaque point de la texture diffuse.

À noter que les techniques récentes de bump mapping (offset bump mapping, parallax occlusion mapping) ne concernent plus l'illumination, mais permettent réellement de mettre en relief les textures, de manière assez impressionnante d'ailleurs.

Dot3 bump mapping
Dot3 bump mapping
Créé le 12 mai 2006  par Laurent Gomila

Les volumes d'ombres (shadow volumes) permettent d'effectuer le rendu des ombres. C'est une technique basée sur la géométrie (contrairement aux shadow maps), dont le principe est de construire un volume fermé représentant les zones d'ombre. Puis, à l'aide d'un test de stencil buffer, on peut déterminer quelles zones de l'écran se trouvent dans ces volumes, et les obscurcir pour obtenir l'effet souhaité.

Il existe une multitude d'optimisations pour les shadow volumes : Z-Fail, projection infinie, scissor test, double-sided stencil, triangles externes, silhouette tracking, algorithme multipasses, vertex shader, vertex blending, Z-Pass +, etc.

De par leur nature, les shadow volumes consomment énormément de fillrate et peuvent donc dégrader rapidement les performances sur des scènes lourdes en polygones. De plus, elles ne permettent pas d'obtenir des ombres douces. Il existe certains algorithmes pour pallier ce manque, mais ceux-ci sont très coûteux.

Les shadow volumes dans Doom 3 (copyright Id Software)
Les shadow volumes dans Doom 3 (copyright Id Software)
Créé le 12 mai 2006  par Laurent Gomila

Lien : The mechanics of robust stencil shadows
Lien : The theory of stencil shadow volumes
Lien : Practical and Robust Shadow Volumes
Lien : Fast, Practical, and Robust Shadow Volumes

Le shadow mapping est la seconde méthode de génération d'ombres en temps réel, avec les shadow volumes. Toutefois son approche est complètement différente, puisque basée sur l'image et non sur la géométrie. Le principe est le suivant : on effectue un rendu de la profondeur de la scène du point de vue de la source lumineuse, puis on utilise ce rendu pour déterminer si un point vu de la caméra est dans la zone d'ombre ou non.

Les avantages de cette méthode sont de pouvoir facilement générer des ombres douces, et de tenir compte de l'alpha des textures (exemple typique : le grillage, impossible à ombrer avec les shadow volumes).

Elle gère par contre moins bien les lumières ponctuelles (nécessité de rendre la scène dans une cubemap, donc six fois), et nécessite d'utiliser des textures de taille élevée pour éviter les problèmes d'aliasing (crénelage).

Des techniques ont été développées pour réduire l'effet d'aliasing sans augmenter la taille de la texture, par exemple les perspective shadow maps, ou encore les trapezoidal shadow maps.

Exemple de shadow mapping
Exemple de shadow mapping
Créé le 12 mai 2006  par Laurent Gomila

Lien : Shadow mapping : casting curved shadows on curved surfaces
Lien : Hardware shadow mapping
Lien : Shadow mapping with today's OpenGL hardware
Lien : Anti-aliasing and continuity with trapezoidal shadow maps
Lien : Perspective shadow maps

Le raytracing est une technique de rendu exact de scène à base de lancer de rayons. Pour chaque pixel de l'écran, un rayon est « lancé » dans la direction de la vue, et les intersections entre ce rayon et les objets 3D permettent de calculer avec exactitude la couleur du pixel correspondant. On peut de cette manière calculer les ombres, les reflets, l'interréflexion, la réfraction, etc. De plus les objets sont représentés par leur définition mathématique exacte et non plus par des triangles, ce qui permet d'avoir un rendu parfait (ce qui fait que 95 % des objets utilisés pour le raytracing sont des sphères : leur définition mathématique est la plus simple de toutes).

Le raytracing est toutefois une technique très lente : il est aujourd'hui encore impossible d'utiliser cette solution en temps réel, bien que de plus en plus de projets visant ce but se développent. Actuellement il existe des moteurs de raytracing temps réel capables d'afficher des scènes à quelques dizaines d'images par seconde, mais dans des résolutions très faibles et avec des calculs simplifiés.

Le raytracing est donc principalement utilisé pour effectuer des rendus statiques exacts de scènes 3D, notamment dans les modeleurs 3D.

Scène rendue en raytracing
Scène rendue en raytracing
Créé le 12 mai 2006  par Laurent Gomila

Lien : Définition wikipedia
Lien : POV-ray, logiciel de rendu en raytracing

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009-2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.