Fonctionnement du rendu de jeu 3D: éclairage et ombres

La mise en œuvre de la grande majorité des effets visuels dans les jeux modernes dépend de l'utilisation judicieuse de l'éclairage et des ombres. Sans eux, les jeux seraient ennuyeux et sans vie. Dans la quatrième partie de l'analyse du rendu des jeux 3D, nous nous concentrerons sur ce qui se passe dans le monde 3D avec le traitement des sommets et la cartographie des textures. Nous aurons encore besoin de beaucoup de mathématiques, ainsi que d'une solide compréhension des bases de l'optique.

Partie 1: traitement des sommets

Partie 2: tramage et lancer de rayons

Partie 3: texturation et filtrage des textures

Rappeler le passé


Plus tôt, nous avons examiné les aspects clés du déplacement et du traitement des objets dans les scènes, leur conversion d'un espace tridimensionnel en une grille plate de pixels, ainsi que les moyens de superposer des textures sur ces objets. Pendant de nombreuses années, de telles opérations ont été une partie essentielle du processus de rendu, et nous pouvons le voir en revenant en 1993 et ​​en lançant id Software's Doom.


Selon les normes modernes, l'utilisation de la lumière et de l'ombre dans ce jeu était très primitive: les sources de lumière n'étaient pas prises en compte, chaque surface en fonction de ses sommets recevait une valeur de couleur générale ou la valeur de la lumière ambiante . Tous les signes d'ombres ont été créés grâce à l'utilisation astucieuse des textures et au choix de la couleur de l'environnement.

Il n'y avait pas d'ombres car ce n'était pas la tâche des programmeurs: le PC de l'époque était un processeur à 66 MHz (soit 0,066 GHz!), Un disque dur de 40 Mo et une carte graphique de 512 kilo-octets avec des capacités 3D minimales. Avance rapide 23: dans le célèbre redémarrage de la série, nous voyons une histoire complètement différente.


De nombreuses technologies ont été utilisées pour rendre ce cadre , il dispose d'étapes telles que l'occlusion ambiante de l'écran, la cartographie de la profondeur avant le passage, les filtres de flou bokeh, les opérateurs de correction de tonalité, etc. Le calcul de l'éclairage et de l'ombrage de chaque surface est effectué de manière dynamique: ils changent constamment en fonction des conditions environnementales et des actions du joueur.

Étant donné que toute opération de rendu 3D nécessite des mathématiques (tout un tas de calculs!), Nous ferions mieux de commencer par ce qui se passe dans les coulisses de tout jeu moderne.

Éclairage mathématique


Pour tout mettre en œuvre correctement, nous devons simuler avec précision le comportement de la lumière lors de l'interaction avec différentes surfaces. Il est curieux que, pour la première fois, ce problème ait commencé à être résolu au XVIIIe siècle par un homme du nom de Johann Heinrich Lambert.

En 1760, un scientifique suisse a publié un livre intitulé Photometria . Il y décrit les règles fondamentales du comportement de la lumière; le plus remarquable d'entre eux était le suivant - la surface émet de la lumière (par réflexion ou comme source de lumière) de telle sorte que la luminosité de la lumière émise varie en fonction du cosinus de l'angle entre la surface normale et l'observateur.


Cette règle simple a jeté les bases d'un éclairage dit diffus . Il s'agit d'un modèle mathématique utilisé pour calculer la couleur d'une surface en fonction de ses propriétés physiques (par exemple, sa couleur et son degré de réflexion lumineuse) et l'emplacement de la source lumineuse.

En rendu 3D, cela nécessite beaucoup d'informations, ce qui est plus facile à imaginer sous la forme d'un tel schéma:


Nous voyons beaucoup de flèches dans l'image, ce sont des vecteurs et les vecteurs suivants sont nécessaires pour calculer la couleur:

  • 3 vecteurs pour la position du sommet, la source de lumière et la caméra regardant la scène
  • 2 vecteurs pour les directions de la source lumineuse et de la caméra du point de vue du sommet
  • 1 vecteur normal
  • 1 demi-vecteur (il est toujours au milieu entre les vecteurs de direction de l'éclairage et de la caméra)

Ils sont calculés au stade du traitement des sommets du processus de rendu, et l'équation les unissant tous (appelée le modèle de Lambert) a la forme:


C'est-à-dire que la couleur du sommet sous un éclairage diffus est calculée en multipliant la couleur de la surface, la couleur de la source lumineuse et le produit scalaire des vecteurs normaux du sommet et la direction de la lumière avec les coefficients d'éclairage d'atténuation et de projection. Cette opération est effectuée pour chaque source lumineuse de la scène, d'où le symbole somme au début de l'équation.

Les vecteurs de cette équation (et tout ce que nous voyons ci-dessous) sont normalisés (comme le montrent les icônes au-dessus de chaque vecteur). Le vecteur normalisé conserve sa direction d'origine et sa longueur diminue jusqu'à une valeur unitaire (c'est-à-dire égale à 1 unité de mesure).

Les valeurs de couleur de la surface et de la source lumineuse sont des nombres RGBA standard (transparence rouge, verte, bleue et alpha). Ils peuvent être des nombres entiers (par exemple, INT8 pour chaque canal de couleur), mais sont presque toujours des nombres à virgule flottante (par exemple, FP32). Le coefficient d'atténuation détermine la façon dont le niveau d'éclairement diminue en s'éloignant de la source, et est calculé par une autre équation:


Les termes A C , A L et A Q sont des coefficients différents (constants, linéaires, quadratiques) qui décrivent comment la distance affecte le niveau d'éclairage. Tous sont définis par les programmeurs lors de la création d'un moteur de rendu. Dans chaque API graphique, cela est implémenté à sa manière, mais des coefficients sont introduits lors du codage du type de source lumineuse.

Avant de considérer le dernier coefficient (projecteur), il convient de noter que dans le rendu 3D, il existe essentiellement trois types de sources de lumière: ponctuelle, directionnelle et spot.


Les sources ponctuelles émettent uniformément de la lumière dans toutes les directions et les sources directionnelles n'émettent de la lumière que dans une seule direction (du point de vue des mathématiques, il ne s'agit que d'une source ponctuelle, distante à une distance infinie). Les projecteurs sont des sources directionnelles complexes car ils émettent de la lumière sous la forme d'un cône. La façon dont la lumière varie dans le corps du cône détermine la taille des parties intérieure et extérieure du cône.

Et oui, pour le coefficient du projecteur, il y a une autre équation:


La valeur du coefficient du projecteur est soit 1 (c'est-à-dire que la source n'est pas un projecteur), soit 0 (si le sommet est en dehors de la direction du cône), soit une valeur calculée entre les deux. Les angles φ (phi) et θ (thêta) spécifient les dimensions de la partie intérieure / extérieure du cône du projecteur.

Deux vecteurs: L dcs et L dir (inverse à la direction de la caméra et à la direction du projecteur) sont utilisés pour déterminer si le cône du sommet se touche.

Maintenant, nous devons nous rappeler que tout cela est nécessaire pour calculer la valeur de l'éclairage diffus, et toutes ces opérations doivent être effectuées pour chaquela source d'éclairage dans la scène, ou au moins pour chaque source que le programmeur voulait considérer. Beaucoup de ces équations sont exécutées par des API graphiques, mais elles peuvent également être effectuées manuellement si les encodeurs ont besoin de plus de contrôle sur l'image.

Cependant, dans le monde réel, en fait, il existe un nombre infini de sources de lumière: chaque surface reflète l'éclairage, de sorte qu'elles affectent toutes l'éclairage général de la scène. Même la nuit, il y a un éclairage de fond, qu'il s'agisse d'étoiles et de planètes ou de lumière dispersée dans l'atmosphère.

Pour simuler cela, une autre valeur d'éclairage est calculée: l' éclairage ambiant .


Cette équation est plus simple que pour un éclairage diffus car les directions ne sont pas nécessaires. Ici, une simple multiplication de différents coefficients est effectuée:

  • C SA - couleur d'éclairage de surface
  • C GA - mettre en évidence la couleur de la scène 3D globale
  • C LA - couleur d'éclairage de toutes les sources lumineuses de la scène

Il convient de noter que l'atténuation et les coefficients du projecteur sont à nouveau utilisés, ainsi que la somme de toutes les sources de lumière.

Nous avons donc un éclairage de fond et nous avons pris en compte l'éclairage diffus des sources lumineuses de différentes surfaces du monde 3D. Mais le modèle Lambert ne fonctionne que pour les matériaux qui reflètent l'éclairage de sa surface dans toutes les directions; les objets en verre ou en métal créent un autre type de réflexion appelé spéculaire ; Naturellement, il y a aussi une équation pour lui!


Les différentes parties de cette formule devraient déjà vous être familières: nous avons deux valeurs de la couleur du miroir (une pour la surface - C S , l'autre pour la lumière - C LS ), ainsi que les facteurs d'atténuation et d'inondation habituels.

La réflexion spéculaire étant très focalisée et dirigée, deux vecteurs sont utilisés pour déterminer la luminosité de l'illumination spéculaire: le sommet normal et le semi-vecteur. Le coefficient p est appelé la puissance de réflexion spéculaire , c'est un nombre qui détermine la luminosité de la réflexion en fonction des propriétés du matériau de surface. Lorsque p augmente, l'effet miroir devient plus brillant, mais plus concentré et plus petit.

Le dernier élément à considérer est le plus simple car il ne s'agit que d'un nombre. Il est appelé éclairage émissif et est appliqué aux objets qui sont une source directe d'éclairage, c'est-à-dire à une flamme, une lampe de poche ou le soleil.

Cela signifie que nous avons maintenant un nombre et trois séries d'équations pour calculer la couleur du sommet de la surface, en tenant compte de l'éclairage de fond (environnement), ainsi que de l'interaction entre différentes sources de lumière et des propriétés du matériau de surface (diffus et spéculaire). Les programmeurs peuvent choisir un seul ou combiner les quatre en les pliant simplement.


Visuellement, la combinaison ressemble à ceci:


Les équations que nous considérons sont appliquées par des API graphiques (par exemple, Direct3D et OpenGL) en utilisant leurs fonctions standard, mais pour chaque type d'éclairage, il existe des algorithmes alternatifs. Par exemple, un éclairage diffus peut être mis en œuvre en utilisant le modèle Oren-Nayyar , qui est mieux adapté aux surfaces très rugueuses que le modèle Lambert.

L'équation de réflexion du miroir peut être remplacée par des modèles qui tiennent compte du fait que les surfaces très lisses comme le verre ou le métal sont encore rugueuses, mais à un niveau microscopique. De tels modèles, appelés algorithmes à micro-facettes , au prix d'une complexité mathématique, fournissent des images plus réalistes.

Quel que soit le modèle utilisé, ils sont tous considérablement améliorés en augmentant la fréquence de leur application à la scène 3D.

Calculs de sommet ou pixel par pixel


Lorsque nous avons examiné le traitement et la pixellisation des sommets , nous avons vu que les résultats de tous les calculs d'éclairage délicats effectués pour chaque sommet devaient être interpolés sur la surface entre les sommets. En effet, les propriétés associées au matériau de surface sont stockées à l'intérieur des sommets; lorsque le monde 3D est compressé en une grille de pixels 2D, les pixels restent uniquement là où se trouvait le sommet.


Les autres pixels doivent transmettre des informations sur la couleur des sommets pour que les couleurs se mélangent correctement à la surface. En 1971, Henri Gouraud , alors étudiant diplômé à l'Université de l'Utah, proposa une méthode désormais appelée Gouraud Shading .

Sa méthode était rapide sur le plan informatique et est devenue pendant de nombreuses années la norme de facto , mais il a également eu des problèmes. Il ne pouvait pas interpoler correctement l'éclairage du miroir, et si l'objet était composé d'un petit nombre de primitives, alors le mélange entre les primitives semblait erroné.

Une solution à ce problème a été proposée en 1973 par Bui Tyong Fong, qui travaillait également à l'Université de l'Utah. Dans son article de recherche, Fong a démontré une technique pour interpoler les normales des sommets sur les surfaces tramées. Cela signifiait que les modèles de réflexion dispersée et spéculaire fonctionneraient correctement pour chaque pixel, et nous pouvons le voir clairement dans l'infographie en ligne de David Eck et le didacticiel WebGL.

Les sphères de carbone illustrées ci-dessous sont colorées avec le même modèle d'éclairage, mais pour les calculs gauchers sont effectuées verticalement, suivies de l'ombrage Gouraud pour les interpoler sur toute la surface. Pour la sphère de droite, les calculs se font pixel par pixel, et la différence est évidente.


Les images fixes ne transmettent pas toutes les améliorations apportées par l' ombrage sur Phong , mais vous pouvez exécuter indépendamment la démo en ligne d' Ek et regarder l'animation.

Cependant, Fong ne s'est pas arrêté là, et quelques années plus tard, il a publié un autre article de recherche dans lequel il a montré comment des calculs séparés pour la réflexion ambiante, diffuse et spéculaire peuvent être effectués avec une équation simple:


Ici, nous devons comprendre sérieusement! Les valeurs indiquées par la lettre k sont les constantes de réflexion pour les réflexions ambiantes, diffuses et spéculaires. Chacun d'eux est une fraction du type correspondant de lumière réfléchie de l'ampleur de la lumière incidente; Valeurs C que nous avons vues dans les équations ci-dessus (valeurs de couleur du matériau de surface pour chaque type d'éclairage).

Le vecteur R est le vecteur de «réflexion parfaite» - la direction dans laquelle la lumière réfléchie se déplacerait si la surface était parfaitement lisse; il est calculé en utilisant la normale de surface et le vecteur de lumière incidente. Le vecteur C est le vecteur de direction de la caméra; et R et C sont normalisés.

Enfin, il y a la dernière constante de l'équation: la valeur de α détermine le degré de brillant de la surface. Plus le matériau est lisse (c'est-à-dire plus il ressemble au verre ou au métal), plus le nombre est élevé.

Cette équation est généralement appelée le modèle de réflexion de Phong . Au moment de ses recherches, une telle proposition était radicale, car elle nécessitait de sérieuses ressources informatiques. Une version simplifiée du modèle a été créée par Jim Blinn , remplaçant la partie de la formule de R et C à H et N (vecteur à mi-distance et normale de surface). La valeur de R doit être calculée pour chaque source lumineuse et pour chaque pixel du cadre, etH suffit pour calculer une fois pour chaque source et pour toute la scène.

Le modèle de réflexion Blinn-Fong est aujourd'hui le système d'éclairage standard et est utilisé par défaut dans Direct3D, OpenGL, Vulkan, etc.

Il existe de nombreux autres modèles mathématiques, surtout maintenant que les GPU peuvent traiter les pixels dans des shaders longs et complexes; ensemble, ces formules sont appelées fonctions de distribution de réflectance / transmission bidirectionnelles (BRDF / BTFD); ils sont le fondement de la coloration de chaque pixel sur le moniteur lorsque nous jouons à des jeux 3D modernes.

Cependant, jusqu'à présent, nous n'avons considéré que les surfaces réfléchissant la lumière: les matériaux translucides transmettent la lumière, tandis que les rayons lumineux sont réfractés. Et certaines surfaces. par exemple, l'eau réfléchit et transmet la lumière à des degrés divers.

Nous prenons l'éclairage à un nouveau niveau


Jetons un coup d'œil au jeu Ubisoft Assassin's Creed: Odyssey 2018 , dans lequel le joueur navigue souvent sur l'eau, à la fois dans les rivières peu profondes et en haute mer.


Bois peint, métal, cordes, tissu et eau - tout cela réfléchit et réfracte la lumière à l'aide d'un tas de calculs.

Pour le rendu le plus réaliste de l'eau tout en maintenant une vitesse suffisante du jeu, les programmeurs Ubisoft ont utilisé tout un ensemble d'astuces. La surface de l'eau est illuminée par le trio familier de lumière ambiante, diffuse et spéculaire, mais elles sont complétées par des caractéristiques intéressantes.

Le premier d'entre eux est souvent utilisé pour générer les propriétés réfléchissantes de l'eau - ce sont les réflexions de l'espace d'écran (SSR). Cette technique rend la scène, mais les couleurs des pixels dépendent de la profondeur de chaque pixel, c'est-à-dire de sa distance à la caméra. La profondeur est stockée dans le soi-disant tampon de profondeur. Ensuite, l'image est à nouveau rendue avec tous les éclairages et textures habituels, mais la scène est enregistrée en tant que texture de rendu , et non en tant que tampon prêt qui est transmis au moniteur.

Après cela, la marche des rayons est effectuée . Pour ce faire, des rayons sont émis par la caméra et des distances sont définies le long du faisceau. Le code vérifie la profondeur du faisceau par rapport aux pixels dans le tampon de profondeur. S'ils ont la même valeur, le code vérifie le pixel normal pour voir s'il est dirigé vers la caméra, et si c'est le cas, le moteur recherche le pixel correspondant dans la texture de rendu. Ensuite, un autre ensemble d'instructions inverse la position du pixel afin qu'il soit correctement reflété dans la scène.


L'ordre SSR utilisé dans le moteur Frostbite d'EA.

De plus, la lumière est diffusée pendant le mouvement à l'intérieur des matériaux, et pour les matériaux comme l'eau ou le cuir, une autre astuce appelée diffusion sous la surface (SSS) est utilisée. Nous ne l'expliquerons pas en détail, mais vous pouvez lire comment il est utilisé pour créer des résultats aussi étonnants dans la présentation Nvidia 2014 .


Démo FaceWorks 2013 de Nvidia ( lien )

Revenons à Assassin's Creed water: la mise en œuvre de SSS est à peine perceptible ici, et en raison de considérations de vitesse, elle n'est pas si activement utilisée. Dans les jeux précédents de la série AC, Ubisoft utilisait de faux SSS , mais dans le dernier jeu, son utilisation est plus compliquée, mais toujours pas aussi importante que celle que nous avons vue dans la démo de Nvidia.

Pour modifier les valeurs d'éclairage à la surface de l'eau, des procédures supplémentaires sont effectuées qui simulent correctement les effets de la profondeur en raison d'un changement de transparence en fonction de la distance à la côte. Et lorsque la caméra regarde l'eau près de la côte, encore plus d'algorithmes sont utilisés pour prendre en compte les caustiques et la réfraction.

Les résultats sont impressionnants:


Assassin's Creed: Odyssey - rendre l'eau dans toute sa splendeur.

Nous avons regardé l'eau, mais qu'en est-il du mouvement de la lumière dans l'air? Les particules de poussière, l'humidité et d'autres éléments entraînent également une diffusion de la lumière. En conséquence, les rayons de lumière reçoivent du volume et ne restent pas simplement un ensemble de rayons directs.

Le sujet de l'éclairage volumétrique peut être étendu à une douzaine d'articles, nous allons donc parler de la façon dont le jeu Rise of the Tomb Raider le traite . Dans la vidéo ci-dessous, il n'y a qu'une seule source d'éclairage principale: le soleil qui brille à travers l'ouverture du bâtiment.


Pour créer un volume de lumière, le moteur de jeu prend la pyramide de visibilité de la caméra (voir ci-dessous) et la décompose de manière exponentielle en 64 parties. Ensuite, chaque tranche est pixellisée en grilles d'une taille de 160 x 94 éléments, et toutes ces données sont enregistrées dans une texture de rendu tridimensionnelle au format FP32. Comme les textures sont généralement bidimensionnelles, les «pixels» du volume de la pyramide sont appelés voxels .


Pour un bloc de voxels 4 x 4 x 4, les shaders de calcul déterminent quelles sources de lumière actives affectent ce volume, puis écrivent ces informations dans une autre texture de rendu en trois dimensions. Ensuite, pour estimer la «densité» totale de la lumière à l'intérieur du bloc de voxels, une formule complexe appelée fonction de diffusion Hengy-Greenstein est utilisée .

Ensuite, le moteur effectue plusieurs autres shaders pour affiner les données, après quoi la marche des rayons est effectuée le long des tranches de la pyramide avec l'accumulation de valeurs de densité lumineuse. Eidos-Montréal prétend que sur Xbox One toutes ces opérations prennent environ 0,8 millisecondes!

Bien que cette technique ne soit pas utilisée dans tous les jeux, les joueurs s'attendent à voir une couverture volumétrique dans presque tous les jeux 3D populaires sortis aujourd'hui, en particulier dans les jeux de tir à la première personne et les jeux d'action-aventure.


L'éclairage volumétrique utilisé dans la suite de Rise of the Tomb Raider de 2018.

Initialement, cette technique d'éclairage était appelée "rayons divins", ou, comme on les appelle en termes scientifiques, "rayons crépusculaires" . L'un des premiers jeux dans lesquels il a été utilisé était le premier Crysis de Crytek, sorti en 2007.

Cependant, ce n'était pas un véritable éclairage volumétrique - le processus comprenait le rendu initial de la scène sous la forme d'un tampon de profondeur, qui était utilisé comme masque - un autre tampon dans lequel les couleurs des pixels devenaient plus sombres plus elles étaient proches de la caméra.

Ce tampon de masque a été échantillonné plusieurs fois, et le shader a prélevé des échantillons et les a mélangés en brouillant ensemble. Le résultat de cette opération a été mélangé avec la scène terminée:


Les progrès des cartes graphiques au cours des 12 dernières années ont été énormes. Les GPU les plus puissants au moment de la sortie de Crysis étaient le Nvidia GeForce 8800 Ultra . Le GPU moderne le plus rapide - le GeForce RTX 2080 Ti a plus de 30 fois plus de puissance de calcul, 14 fois plus de mémoire et 6 fois plus de bande passante.

Avec toute cette puissance de calcul, les jeux modernes peuvent fournir une précision graphique et une vitesse globale beaucoup plus grandes, malgré la complexité accrue du rendu.


«Divine Rays» dans The Division 2 d'Ubisoft

Mais en fait, cet effet démontre que malgré l'importance d'un éclairage correct pour la précision visuelle, l' absence de lumière est en fait encore plus importante .

Essence de l'ombre


Commençons une nouvelle section de l'article avec le jeu Shadow of the Tomb Raider . Dans l'image ci-dessous, toutes les options graphiques liées aux ombres sont désactivées; à droite, ils sont inclus. La différence est énorme, non?


Étant donné que les ombres se forment naturellement dans le monde réel, les jeux dans lesquels elles sont incorrectement implémentées n'auront jamais l'air correct. Nos cerveaux sont habitués à utiliser les ombres comme support visuel pour créer une sensation de profondeur relative, d'emplacement et de mouvement. Mais le faire dans un jeu 3D est étonnamment difficile, ou du moins difficile à faire correctement.

Commençons par le canard. Ici, elle se déplace dans le champ, et les rayons du soleil lui parviennent et sont correctement bloqués.


L'une des premières façons d'implémenter l'ombre dans la scène a été d'ajouter un «point» d'ombre sous le modèle. Ceci est totalement irréaliste, car la forme de l'ombre ne correspond pas à la forme de l'objet projetant l'ombre; cependant, cette approche est rapide et facile à créer.

Les premiers jeux 3D, par exemple, le premier Tomb Raider de 1996, utilisaient cette méthode car le matériel de l'époque, par exemple, Sega Saturn et Sony PlayStation, ne pouvait rien offrir de mieux. Cette méthode a peint un simple ensemble de primitives juste au-dessus de la surface sur laquelle le modèle se déplace, puis les a ombrées; le dessin au bas d'une texture simple a également été utilisé.


Une autre des premières méthodes consistait à projeter des ombres . Dans ce cas, la primitive émettant une ombre a été projetée sur un plan contenant le sol. Une partie des calculs mathématiques nécessaires a été créée par Jim Blinn à la fin des années 80. Selon les normes modernes, il s'agit d'un processus simple, et il fonctionne mieux pour les objets statiques simples.


Mais grâce à l'optimisation, la projection d'ombres a fourni la création des premiers exemples dignes d'ombres dynamiques, par exemple, dans le jeu Kingpin: Life of Crime de 1999 par Interplay. Comme nous le voyons dans l'image ci-dessous, seuls les personnages animés (même les rats!) Ont des ombres, mais c'est mieux que de simples spots.


Les problèmes les plus graves de cette approche sont: (a) l'opacité parfaite de l'ombre, et (b) la méthode de projection émet l'ombre sur une surface plane (par exemple, au sol).

Ces problèmes peuvent être résolus en appliquant une fraction de transparence lors de la coloration de la primitive projetée et en effectuant plusieurs projections pour chaque personnage, mais les capacités matérielles du PC de la fin des années 90 ne pouvaient pas faire face au rendu supplémentaire.

Une technologie moderne pour créer des ombres


Un moyen plus précis de mettre en œuvre les ombres a été proposé beaucoup plus tôt, déjà en 1977. Alors qu'il travaillait à l'Université d'Austin (Texas), Franklin Crowe a écrit un article de recherche dans lequel il proposait plusieurs techniques utilisant des volumes d' ombre.

En termes généraux, ils peuvent être décrits comme suit: le processus détermine quelles primitives sont dirigées vers la source de lumière; leurs côtes sont tendues sur un plan. Bien que cela soit très similaire à la projection d'ombres, la différence importante est que le volume d'ombres créé est ensuite utilisé pour vérifier si le pixel est à l'intérieur / à l'extérieur du volume. Grâce à ces informations, des ombres peuvent être émises sur toutes les surfaces, pas seulement sur le sol.

Cette technique a été améliorée en 1991 par Tim Heidmann, qui a travaillé surGraphiques en silicone . Mark Kilgard a été engagé dans son développement en 1999 , et la méthode que nous considérerons a été créée en 2000 par John Carmack d'id Software (bien que la méthode de Carmack ait été ouverte indépendamment deux ans plus tôt par Bilodo et Songa de Creative Labs; cela a conduit à que Carmack a été contraint de changer son code pour éviter des problèmes juridiques).

Cette approche nécessite un rendu d'images multiples (appelé rendu multipasse - un processus très coûteux au début des années 90 qui est utilisé partout aujourd'hui) et un concept appelé tampon de gabarit .

Contrairement aux tampons d'images et aux profondeurs, il n'est pas créé par la scène 3D elle-même - ce tampon est un tableau de valeurs égales dans toutes les dimensions (c'est-à-dire la résolution en x et y ) sous la forme d'un raster. Les valeurs qui y sont stockées sont utilisées pour indiquer au moteur de rendu ce qu'il faut faire avec chaque pixel dans le tampon d'image.

L'exemple le plus simple d'utilisation de ce tampon est d'utiliser comme masque:


La méthode avec le volume d'ombres est exécutée approximativement comme ceci:

  • Nous rendons la scène dans le tampon d'image, mais utilisons uniquement l'éclairage ambiant (nous incluons également toutes les valeurs d'émission si le pixel contient une source de lumière)
  • , , ( (back-face culling)). (, ) . (.. «») - .
  • , (front-face culling) -, .
  • , , -.

Ces tampons de stencil et volumes d'ombre (communément appelés ombres de pochoir) ont été utilisés dans le jeu de logiciel Doom 3 id 2004 :


Remarquez que la surface sur laquelle le personnage marche est toujours visible à travers l'ombre? C'est le premier avantage par rapport à la projection d'ombres. De plus, cette approche vous permet de prendre en compte la distance de la source lumineuse (par conséquent, des ombres plus faibles sont obtenues) et de projeter des ombres sur n'importe quelle surface (y compris le personnage lui-même).

Mais cette technique présente de sérieux inconvénients, dont le plus notable est que les bords de l'ombre dépendent complètement du nombre de primitives utilisées pour créer l'objet projetant l'ombre. De plus, le multipassing est associé à de nombreuses opérations de lecture / écriture dans la mémoire locale, c'est pourquoi l'utilisation des ombres de gabarit est assez coûteuse en termes de performances.

De plus, le nombre de volumes fantômes est limité, ce qui peut être vérifié à l'aide du tampon de gabarit, car toutes les API graphiques y allouent un nombre assez petit de bits (généralement 8 seulement). Cependant, en raison du coût de calcul des ombres au pochoir, ce problème ne se pose généralement pas.

Il y a un autre problème - les ombres elles-mêmes sont loin d'être réalistes. Pourquoi? Parce que toutes les sources de lumière - lampes, flammes nues, lanternes et soleil - ne sont pas des points uniques dans l'espace, c'est-à-dire ils émettent de la lumière d'une certaine zone. Même dans le cas le plus simple illustré ci-dessous, les ombres réelles ont rarement des bords bien définis.


La région la plus sombre des ombres s'appelle l'ombre complète (ombra); la pénombre est toujours une ombre plus claire, et la frontière entre les deux est souvent floue (car il existe généralement de nombreuses sources de lumière). Il est difficile de modéliser cela avec des tampons et des volumes de gabarit, car les ombres créées sont stockées sous une forme incorrecte afin de pouvoir être traitées. La cartographie des ombres vient à la rescousse !

La procédure de base a été développée en 1978 par Lance Williams . C'est assez simple:

  • Pour chaque source de lumière, nous rendons la scène du point de vue de cette source, créant une texture spéciale des profondeurs (c'est-à-dire sans couleur, éclairage, texturation, etc.). La résolution de ce tampon ne doit pas nécessairement être égale à la taille de l'image finie, mais plus elle est élevée, mieux c'est.
  • , ( x,y z) , .
  • : , .

De toute évidence, il s'agit d'une autre procédure à passages multiples, mais la dernière étape peut être effectuée à l'aide de pixels shaders afin que la vérification de la profondeur et les calculs d'éclairage ultérieurs soient combinés en un seul passage. Et comme tout le processus de création d'ombres ne dépend pas du nombre de primitives utilisées, il est beaucoup plus rapide que d'utiliser le tampon de gabarit et le volume d'ombres.

Malheureusement, la technique de base décrite ci-dessus génère toutes sortes d'artefacts visuels (par exemple, aliasing en perspective , «acné ombré» , «peter panning»), dont la plupart sont liés à la résolution et à la taille en bits de la texture de profondeur. Tous les GPU et API graphiques ont des limitations similaires aux textures, donc un ensemble complet de techniques supplémentaires a été créé pour résoudre ces problèmes.

L'un des avantages de l'utilisation de textures pour les informations détaillées est que les GPU peuvent les échantillonner et les filtrer très rapidement et de différentes manières. En 2005, Nvidia a démontré une méthode d'échantillonnage de texture qui pourrait résoudre certains des problèmes visuels causés par l'ombrage standard. De plus, il a fourni un certain degré de douceur des bords des ombres; cette technique est appelée filtrage plus proche en pourcentage .


À peu près à la même époque, Futuremark a démontré l'utilisation de cartes ombrées en cascade (CSM) dans 3DMark06 . Il s'agit d'une technique dans laquelle pour chaque source lumineuse plusieurs textures de profondeur sont créées avec différentes résolutions. Des textures haute résolution sont utilisées près de la source et plus basses - à distance de la source. Le résultat est des transitions d'ombres plus fluides dans la scène sans distorsion.

Cette technique a été améliorée par Donnelly et Loritzen en 2006 dans leur procédure de mappage d'ombre de variance (VSM), ainsi qu'Intel en 2010 dans son algorithme de distribution d'échantillons (SDSM).


Utilisation de SDSM dans Shadow of the Tomb Raider

Pour améliorer l'image, les développeurs de jeux utilisent souvent tout un arsenal de techniques d'ombrage, mais la principale reste la cartographie des ombres. Cependant, il ne peut être appliqué qu'à un petit nombre de sources de lumière actives, car si vous essayez de le modéliser pour chaque surface réfléchissant ou émettant de la lumière, la fréquence d'images chutera de manière catastrophique.

Heureusement, il existe une technique pratique qui fonctionne avec n'importe quel objet. Il donne l'impression d'une diminution de la luminosité de l'éclairage atteignant l'objet (du fait que lui ou d'autres objets bloquent un peu la lumière). Cette fonction est appelée occlusion ambiante.et elle a de nombreuses versions. Certains d'entre eux sont spécialement conçus par les fabricants de matériel, par exemple, AMD a créé HDAO ( occlusion ambiante haute définition ), et Nvidia a HBAO + ( occlusion ambiante basée sur l'horizon ).

Quelle que soit la version utilisée, elle est appliquée après le rendu complet de la scène, elle est donc classée comme effet de post-traitement . En fait, pour chaque pixel, il est calculé combien nous le voyons dans la scène (plus à ce sujet ici et ici ) en comparant la valeur de la profondeur de pixel avec les pixels qui l'entourent au point correspondant dans le tampon de profondeur (qui, encore une fois, est stocké sous forme de texture).

L'échantillonnage du tampon de profondeur, puis le calcul de la couleur finale des pixels jouent un rôle important pour garantir la qualité de l'occlusion ambiante; comme dans le cas de l'observation, toutes les versions d'occlusion ambiante pour leur bon fonctionnement nécessitent que le programmeur configure et ajuste soigneusement le code en fonction de la situation.


Shadow of the Tomb Raider sans AO (à gauche) et avec HBAO + (à droite)

Cependant, lorsqu'il est correctement mis en œuvre, cet effet visuel laisse une impression profonde. Dans l'image ci-dessus, faites attention aux mains, aux ananas et aux bananes de la personne, ainsi qu'à l'herbe et à la végétation environnantes. Les changements de couleur des pixels introduits par HBAO + sont assez mineurs, mais tous les objets semblent maintenant mieux intégrés à l'environnement (à gauche, il semble qu'une personne soit suspendue au-dessus du sol).

Si vous sélectionnez l'un des derniers jeux abordés dans cet article, la liste des techniques de rendu utilisées lors du traitement de l'éclairage et des ombres correspondra à la longueur de l'article lui-même. Et bien que tous les nouveaux jeux 3D ne disposent pas de toutes ces technologies, des moteurs de jeu universels comme Unreal vous permettent de les activer en option, et des boîtes à outils (par exemple, les sociétés Nvidia) fournissent un code prêt à être inséré dans le jeu. Cela prouve qu'il ne s'agit pas de méthodes ultramodernes hautement spécialisées - qui étaient autrefois la propriété des meilleurs programmeurs, elles sont désormais accessibles à tous.

Nous ne pouvons pas compléter cet article sur l'éclairage et les ombres sans mentionner le lancer de rayons. Nous avons déjà parlé de ce processus dans cette série d'articles, mais le niveau actuel de développement technologiquenécessite de supporter une faible fréquence d'images et de sérieuses dépenses en espèces.

Cependant, la technologie est prise en charge par les consoles de nouvelle génération Microsoft et Sony, ce qui signifie qu'au cours des prochaines années, son utilisation deviendra un autre outil standard pour les développeurs du monde entier qui cherchent à améliorer la qualité visuelle des jeux. Jetez un œil à ce que Remedy a réussi à réaliser dans son dernier jeu Control :


Nous avons parcouru un long chemin de fausses ombres dans les textures et un simple éclairage ambiant!

Ce n'est pas tout


Dans l'article, nous avons essayé de parler des calculs mathématiques fondamentaux et des techniques utilisées dans les jeux 3D, qui les rendent aussi réalistes que possible. Nous avons également examiné les technologies sous-jacentes à la modélisation de l'interaction de la lumière avec les objets et les matériaux. Mais tout cela n'était que la pointe de l'iceberg.

Par exemple, nous avons ignoré des sujets tels que l'éclairage à économie d'énergie, la lumière parasite, la floraison, le rendu hautement dynamique, le transfert de rayonnement, la correction de tonalité, le brouillard, l'aberration chromatique, la cartographie des photons, les caustiques, la radiosité - cette liste est longue. Une brève étude nécessiterait 3 à 4 articles supplémentaires.

All Articles