introduction
Doom Eternal n'a pas besoin d'être présenté séparément: c'est un successeur direct de Doom 2016, développé grâce à la septième itération d'id Tech, le moteur interne d'id Software. À un moment donné, j'ai été frappé par la haute qualité du composant visuel de Doom 2016, ainsi que par la simplicité et l'élégance des solutions techniques. À cet égard, Doom Eternal surpasse son prédécesseur dans de nombreux domaines, et certains d'entre eux méritent une ventilation détaillée. Dans cet article analytique, je vais essayer de tous les discuter.
Mon analyse s'inspire du dur Adrian Courrèges à propos de Doom 2016 ( traduction). À mon avis, de tels travaux donnent un aperçu des approches pour résoudre certains des problèmes de rendu des projets AAA et deviennent ainsi un excellent matériel pédagogique. Dans cette analyse, je prévois de discuter des caractéristiques générales et de ne pas plonger trop profondément dans les subtilités de chaque méthode de rendu et passe. De plus, certains des passages de Doom Eternal sont presque identiques à leurs homologues de Doom 2016 et ont déjà été démontés dans l'oeuvre d'Adrian Courrèges, donc je peux les sauter.
Je voudrais marquer d'une manière spéciale le strictement pédagogiquela nature de l'article actuel. Je n'approuve en aucun cas la rétro-ingénierie des produits à des fins de vol de propriété intellectuelle ou de toute autre intention malveillante. Si vous n'avez pas encore joué à Doom Eternal, ne vous inquiétez pas: je n'ai couvert que le tout début du jeu, vous n'êtes donc pas en danger de spoilers.
Alors, commençons.
Avec la sortie d'id Tech 7, la transition du moteur d'OpenGL vers l'API Vulkan a permis aux développeurs de travailler plus efficacement avec les fonctionnalités de la génération actuelle de GPU, telles que les ressources sans liaison.
Une image dans Doom Eternal
Ci-dessus, on peut voir une partie du jeu proche du début: un intérieur avec plusieurs adversaires et un éclairage volumétrique. Par analogie avec son prédécesseur, le processus de rendu dans Doom Eternal est en charge du rendu direct , mais si Doom 2016 est obligé de rendre avec le G-buffering des surfaces réfléchissantes, dans notre cas, le tampon n'est pas utilisé et le rendu prend en charge toutes les tâches.
S'éloigner des megatextures
Avec la sortie du jeu Rage, créé sur le moteur id Tech 5, le monde s'est familiarisé avec le concept d'implémentation de textures appelées "méga textures". Cette méthode est utilisée dans Doom 2016 et pour chaque image, elle rend une soi-disant «texture virtuelle» avec des informations sur les textures visibles. La texture virtuelle est analysée dans l'image suivante pour déterminer quelles textures doivent être chargées à partir du disque. Cependant, les mégaxtures ont un problème évident: dès que la texture entre dans le champ de vision, il est trop tard pour la charger, de sorte que la texture semble floue dans les premières images après son apparition. Avec la sortie d'id Tech 7, les développeurs ont abandonné cette méthode.
Écorcher le GPU
Habituellement, même avant le rendu des textures et des ombrages, le vertex shader évalue le skinning. Le skinning id Tech 7 est effectué à l'avance par un shader de calcul avec écriture des sommets résultants dans le tampon. Grâce à cette approche, le vertex shader n'a plus besoin de données de skinning, et comme il n'est plus effectué à chaque passage de géométrie, par conséquent, les swaps de shader se produisent moins souvent.
La principale différence entre le skinning dans un shader de calcul et un vertex shader est l'écriture du résultat dans un tampon intermédiaire. Comme pour le vertex shader, pour chaque sommet, le thread de calcul du shader reçoit une transformation de chaque os affectant le sommet. Ensuite, il change la position du sommet à chaque transformation osseuse et ajoute toutes les nouvelles positions en fonction du poids des peaux stockées dans le sommet. En conséquence, le vertex shader peut utiliser le résultat du tampon pour l'interpréter comme un maillage statique.
Le lien fournit un excellent article sur Compute Shader Skinning par János Turánszki.
Il est également utile de noter que Doom Eternal utilise un type de mise en cache intéressant - Alembic Cachecomparable à une vidéo rétro-lisible hautement compressée. Ces caches stockent les animations créées et développées pendant l'exécution du programme. Citant l'analyse technique de Digital Foundry , Alembic Cache est appliqué à un large éventail d'animations, des scènes cinématiques à grande échelle aux minuscules tentacules sur le sol. Cette approche est particulièrement pratique pour les animations avec des complexités de mise en œuvre à travers l'animation de la peau, par exemple, pour la simulation de matières organiques et de tissus. Si cette technologie vous intéresse, je vous recommande de consulter la présentation d'Axel Gneiting au Siggraph 2014 .
Cartes d'ombre
La prochaine étape est le rendu des ombres, et à première vue, id Tech 7 et son approche précédente pour générer leurs cartes ne sont pas différents.
Comme vous pouvez le voir ci-dessous, les ombres sont rendues dans une grande texture avec une profondeur de 24 bits et une taille de 4096 par 8196 pixels, dont la qualité varie par endroits. La texture ne change pas entre les cadres, et selon la présentation "Le diable est dans les détails" à Siggraph 2016, la géométrie statique est mise en cache dans le shadowmap pour éviter de la redessiner pour chaque image. L'idée elle-même est simple: nous n'avons pas besoin de mettre à jour les ombres jusqu'à ce qu'il y ait un mouvement devant la source de lumière, et ainsi nous pouvons déclarer une shadow map "cachée": une carte régulière avec une géométrie statique, puisque nous supposons que la géométrie ne change pas ... Si un objet dynamique se déplace dans le cône de vue, la carte d'ombre "mise en cache" est copiée sur la carte principale et la géométrie dynamique est redessinée par-dessus. Cette approche permet de ne pas redessiner la scène entière dans le cône de vue à chaque mise à jour. Naturellement, si la lumière est décalée, la scène entière devra être redessinée à partir de zéro.
Pour lisser les bords des ombres lors de l'échantillonnage de la carte, un échantillonnage PCF 3x3 est utilisé. Étant donné que la lumière du soleil couvre généralement une partie importante de l'environnement, les cartes d'ombre en cascade sont utilisées pour mieux répartir la qualité.
Par exemple, jetez un œil à l'atlas des shadow maps. Plus la lumière est importante, plus la zone sur l'écran est grande ou plus l'objet est proche de la caméra, plus le segment sélectionné de l'atlas sera grand - cela est nécessaire pour plus de détails. Ces heuristiques sont évaluées dynamiquement.
Vitesse de profondeur et pré-passe
En commençant par l'arme du joueur, les géométries opaques, statiques et dynamiques sont rendues séquentiellement à la profondeur cible. Habituellement, afin de ne pas effectuer de calculs inutiles de shaders de pixels à une intersection potentielle de géométries, une passe préliminaire de traitement de profondeur est effectuée avec l'ajout du résultat au tampon. Étant donné que le fait de redessiner les pixels à mesure qu'ils se croisent crée des recalculs inutiles et affecte finalement négativement les performances, l'importance de cette approche devient inestimable. Avec le pré-passage en profondeur, un shader de pixels à éclairage direct peut éliminer les pixels supplémentaires en les comparant à un tampon de profondeur avant le calcul réel, économisant ainsi des ressources précieuses.
Armes du joueur
Objets statiques Objets
dynamiques
Dans le pré-passe, non seulement la profondeur est rendue, mais également la couleur cible. En géométrie dynamique, la vitesse est rendue via des vecteurs de mouvement, c'est-à-dire la position de la position actuelle soustraite de la position du pixel dans l'image précédente. Étant donné que le mouvement est stocké dans les canaux rouge et vert d'une cible de rendu à virgule flottante 16 bits, nous avons seulement besoin de connaître le mouvement X et Y. Ces informations sont ensuite utilisées en post-traitement pour appliquer le flou et la re-projection de l'anti-crénelage temporel. La géométrie statique n'a pas besoin de vecteurs de mouvement, car elle "se déplace" uniquement par rapport à la caméra et son mouvement peut être calculé à partir du mouvement de la caméra elle-même. Comme vous pouvez le voir dans la capture d'écran ci-dessous, il n'y a pas beaucoup de mouvement dans notre scène.
Profondeur hiérarchique Z
L'étape suivante consiste à générer une mip-chain de tampon de profondeur hiérarchique: cette chaîne est similaire à une mip-map, mais au lieu de faire la moyenne de quatre pixels adjacents, elle prend leur valeur maximale. Cette approche est souvent utilisée dans les graphiques pour une variété de tâches, telles que l'accélération des réflexions et l'élimination de la géométrie obstruée. Dans notre cas, la chaîne mip supprime l'éclairage et les décalcomanies, dont nous parlerons plus tard. Récemment, la génération mip a été réalisée en un seul passage, avec un enregistrement en plusieurs mip-s à la fois, mais dans Doom Eternal, l'enregistrement est toujours effectué séparément pour chaque mip.
Stickers en maille
Jusqu'à présent, nous n'avons pas eu le temps de nous familiariser avec les différences majeures entre les processus de Doom Eternal par rapport à Doom 2016, mais les décalcomanies de grille entrent dans cette catégorie. Ce sont de petits décalcomanies (boulons, grilles, bosses) qui, comme les décalcomanies ordinaires, peuvent affecter toutes les propriétés de surface (normale, rugosité, couleur). Cependant, un décalque de grille typique est attribué par les artistes lors du développement de la grille et, contrairement au placement standard des décalcomanies dans l'environnement, appartient à sa propre grille. Doom s'est fortement appuyé sur les décalcomanies dans le passé, et le passage actuel aux décalcomanies maillées n'a fait qu'augmenter les détails et la flexibilité des graphiques.
Pour obtenir cet avantage, la prochaine passe de géométrie restitue les ID de chaque décalcomanie dans une texture de huit bits. De plus, lors de l'application des ombres, nous échantillonnons la texture et grâce aux identificateurs, nous obtenons la matrice de projection associée à chaque appel à dessiner. La matrice projette les coordonnées de pixels de l'espace monde vers l'espace de texture, puis ces coordonnées sont utilisées pour échantillonner le décalque et le fusionner avec le matériau de surface. Cette technique est incroyablement rapide dans son exécution et ouvre un large champ aux artistes pour travailler avec une variété de décalcomanies. Étant donné que les ID sont rendus dans une texture 8 bits, il peut potentiellement y avoir jusqu'à 255 décalcomanies sur un seul maillage.
La seule condition pour tout cela est que toutes les textures de décalcomanie soient liées aux processus lors du rendu des maillages. Avec un processus de rendu totalement indépendant, les développeurs peuvent lier toutes les textures de décalcomanie à la fois et les indexer dynamiquement dans le shader. Étant donné que les développeurs utilisent cette méthode pour implémenter plusieurs autres astuces dans le jeu, nous parlerons plus en détail du processus de rendu sans rapport plus tard.
Ci-dessous, nous pouvons voir le maillage de la texture de la décalcomanie. Pour faciliter la visualisation, les identifiants sont colorés de différentes couleurs.
Jeter de la lumière et des décalcomanies
La lumière dans Doom Eternal est entièrement dynamique et jusqu'à plusieurs centaines de sources peuvent atteindre le champ de vision en même temps. De plus, comme nous l'avons noté précédemment, les décalcomanies dans le jeu sont d'une grande importance, par exemple, dans le même Doom 2016, le nombre de décalcomanies a dépassé des milliers. Tout cela nécessite une approche spéciale pour éliminer les excès, sinon les performances ne résisteront pas à la gravité des pixel shaders.
Doom 2016 a utilisé une version basée sur le processeur du rejet de lumière de cluster: la lumière et les décalcomanies ont été collectées dans des «froxels» en forme de cône, qui ont ensuite été lus pendant l'ombrage en déterminant l'indice de cluster à partir de la position du pixel. La taille de chaque cluster était de 256 pixels et était divisée de manière logarithmique en 24 segments pour conserver une forme carrée. Cette technique a été rapidement adoptée par de nombreux autres développeurs, et des méthodes similaires se retrouvent, par exemple, à Detroit: Become Human and Just Cause.
Compte tenu du nombre croissant de sources d'éclairage dynamiques (centaines) et de décalcomanies (milliers), le regroupement du processeur de la baisse d'éclairage dans Doom Eternal n'était plus suffisant, car les voxels devenaient trop grossiers. En conséquence, les développeurs ont proposé une approche différente pour id Tech 7 et, grâce à des shaders informatiques exécutés à différentes étapes, ils ont créé un rastériseur logiciel. Tout d'abord, les décalcomanies et la lumière sont liées dans un hexaèdre (hexagone) et transférées vers un rastériseur de calcul, à partir duquel les sommets sont projetés dans l'espace de l'écran. Ensuite, un second shader de calcul ajuste les triangles aux bords de l'écran et les assemble en carreaux de 256 par 256 pixels. Dans le même temps, par analogie avec l'élimination des grappes, les éléments individuels des sources lumineuses et des décalcomanies sont enregistrés dans des froxels,après quoi le shader de calcul suivant exécute une procédure similaire pour les tuiles de 32 par 32 pixels. Dans chaque vignette, les éléments qui réussissent le test de profondeur sont marqués dans un champ de bits. Le shader de calcul final traduit les champs de bits en une liste de lumières qui sont finalement utilisées dans le passage de la lumière. Fait intéressant, les indices d'élément sont toujours enregistrés dans des froxels tridimensionnels de 256 x 256 pixels, similaire à l'approche de cluster. Dans les endroits avec une interruption significative en profondeur, la valeur minimale de la nouvelle liste de lumières et de l'ancienne liste de sources groupées est comparée pour déterminer le nombre de lumières dans chaque tuile.qui sont finalement utilisés dans la passe d'éclairage. Fait intéressant, les indices d'élément sont toujours enregistrés dans des froxels tridimensionnels de 256 par 256 pixels, similaire à l'approche de cluster. Dans les endroits avec une interruption de profondeur significative, la valeur minimale de la nouvelle liste de lumières et de l'ancienne liste de sources groupées est comparée pour déterminer le nombre de lumières dans chaque tuile.qui sont finalement utilisés dans la passe d'éclairage. Fait intéressant, les indices d'élément sont toujours enregistrés dans des froxels tridimensionnels de 256 x 256 pixels, similaire à l'approche de cluster. Dans les endroits avec une interruption significative en profondeur, la valeur minimale de la nouvelle liste de lumières et de l'ancienne liste de sources groupées est comparée pour déterminer le nombre de lumières dans chaque tuile.
Si vous n'avez pas traité de la pixellisation traditionnelle, une description aussi riche peut ne pas être claire pour vous. Si vous souhaitez approfondir la question, je vous recommande de rechercher les principes généraux du fonctionnement de ces processus, par exemple Scratchapixel a une très bonne analyse du sujet .
Les soi-disant «étendues» utilisées pour interroger la visibilité du jeu sont également ignorées par ce système. Étant donné que la rastérisation logicielle pour les threads de calcul est un processus long, le taux d'occupation est très probablement faible et, par conséquent, l'ajout de quelques images supplémentaires n'a pratiquement aucun effet sur les performances. Dans cet esprit, la lumière est susceptible d'être projetée de manière asynchrone, et donc l'impact net sur les performances est minime.
Bloquer la lumière ambiante dans l'espace de l'écran
L'occlusion ambiante est calculée à demi-résolution de manière assez standard: d'abord, 16 rayons aléatoires émanent de la position de chaque pixel dans l'hémisphère, puis les rayons intersectant la géométrie sont déterminés à l'aide du tampon de profondeur. Plus les rayons traversent la géométrie, plus l'obstruction sera grande. Cette technique s'appelle Screen Space Directional Occlusion, ou SSDO, et une description détaillée par Yuriy O'Donnell peut être trouvée ici . Au lieu du stockage traditionnel des valeurs d'occlusion dans une texture à canal unique, l'occlusion directionnelle est stockée dans une texture à trois composants et l'occlusion résultante est définie par le produit scalaire sur la normale du pixel.
Le calcul étant effectué à demi-résolution, le résultat est assez bruyant. Pour améliorer la qualité avec un tampon de profondeur, un flou double face est appliqué. Le blocage de la lumière ambiante se produit généralement aux basses fréquences, de sorte que le flou n'est généralement pas perceptible.
Passage droit opaque
Dans ce passage, de nombreux éléments se mettent enfin en place. Contrairement à Doom 2016, tout ici est rendu directement via plusieurs méga-shaders massifs. Il y aurait environ 500 états de processeur et une douzaine de dispositions de descripteurs tout au long du jeu. Les armes du joueur sont d'abord rendues, puis les objets dynamiques, puis les statiques. Veuillez noter que l'ordre n'est pas particulièrement important, car grâce au pré-pass de profondeur, nous avons déjà reçu un tampon de profondeur, et il peut exclure les pixels qui ne correspondent pas à la profondeur à l'avance.
Armes du joueur
Objets dynamiques
Premier jeu d'objets statiques
Deuxième jeu d'objets statiques
Pour la plupart des moteurs de jeu AAA, les graphiques de shader et les fonctionnalités de shader statiques permettent aux développeurs d'être créatifs avec toutes sortes de matériaux et de surfaces, et chaque matériau, chaque surface, conduit à son propre shader unique. En conséquence, nous sommes confrontés à une incroyable variété de permutations de shaders pour toutes les combinaisons possibles de fonctionnalités du moteur. Cependant, id Tech est très différent des autres projets AAA: il combine presque tous les matériaux et fonctionnalités dans quelques méga-shaders massifs. Cette approche permet aux GPU de combiner plus étroitement la géométrie, ce qui à son tour a un effet positif sur les performances. Nous en discuterons plus tard.
Ressources non liées
Il est à noter que l'ensemble du processus de formation des graphiques contient l'idée de «ressources non liées». Cela signifie qu'au lieu de lier le flou, les reflets, la rugosité de la texture avant chaque appel de dessin, la liste entière des textures de la scène est liée en même temps. Les textures de la liste sont accessibles de manière dynamique dans le shader via les indices passés au shader par des constantes. Ainsi, à travers n'importe quel appel à dessiner, vous pouvez obtenir n'importe quelle texture, ce qui ouvre la voie à de nombreuses optimisations, dont nous allons maintenant parler.
Fusion dynamique des appels de tirage
En plus d'une architecture de ressources complètement découplée, toutes les données géométriques sont allouées à partir d'une grande mémoire tampon . Ce tampon stocke simplement le décalage de la géométrie entière.
C'est là que la technologie la plus intéressante d'idTech 7 entre en jeu: la fusion dynamique des appels de tirage.... Il repose sur une architecture de ressources découplée et une mémoire de sommets généralisée et, par conséquent, réduit considérablement le nombre d'appels de dessin et le temps de traitement. Avant le début de tout rendu, le shader de calcul crée dynamiquement un tampon d'index «indirect» pour fusionner efficacement les géométries de maillages non liés en un seul appel de dessin indirect. Sans ressources non liées, la fusion d'appels ne fonctionnerait pas car elle fonctionne avec des géométries dont les propriétés de matériau ne correspondent pas. À l'avenir, il sera possible d'utiliser à nouveau le tampon d'index dynamique, à la fois pour le pré-pass de profondeur et pour le pré-passe d'éclairage.
Réflexions
Le shader de calcul le plus courant utilise l'algorithme de raymarching pour créer des réflexions dans l'espace de l'écran. L'algorithme émet un rayon du pixel dans l'espace du monde vers la réflexion, qui dépend de la rugosité de la surface réfléchissante. La même chose était le cas dans Doom 2016, où un petit G-buffer a été enregistré dans le cadre de la passe avant. Cependant, dans Doom Eternal, il n'y a plus de tampon G, et même les réflexions de l'espace d'écran ne sont pas calculées séparément dans le shader de calcul, mais immédiatement dans le shader direct . Il est intéressant de savoir comment un tel écart dans le pixel shader affecte les performances, car il semble qu'au détriment de la charge accrue sur le registre, les développeurs essayaient de réduire le nombre de cibles de rendu et, par conséquent, de réduire la charge sur la bande passante mémoire.
Souvent, lorsque la texture de l'espace d'écran ne contient pas les informations nécessaires, des artefacts de rendu apparaissent dans les effets correspondants. Ceci est le plus souvent observé dans les réflexions écran-espace dans les cas où des objets réfléchissants invisibles ne peuvent pas être réfléchis. Le problème est généralement résolu avec l'approche traditionnelle, en utilisant des cartes de cube de réflexion statique comme sauvegarde.
Mais comme les méga-textures ne sont plus utilisées dans Doom Eternal, il n'y a pas non plus besoin de textures de secours.
Particules
Simulation
Dans Doom Eternal, une partie de la simulation du processeur de particules tombe sur les épaules des shaders de calcul, car certains systèmes de particules ont des dépendances sur les informations d'espace d'écran, comme un tampon de profondeur pour simuler les collisions. Alors que d'autres systèmes de particules peuvent être exécutés dans le cadre à la fois et calculés de manière asynchrone, de telles simulations nécessitent des données préliminaires de pré-passe de profondeur. Ce qui est caractéristique, contrairement à la simulation de shader traditionnelle de particules, ici la simulation est réalisée par l'exécution d'une séquence de "commandes" à partir du tampon stocké dans le shader de calcul. Chaque thread de shader exécute toutes les commandes, parmi lesquelles il peut y avoir plusieurs modifications de paramètres kill, emit ou particule. Tout cela ressemble à une machine virtuelle écrite dans un shader. Je ne comprends pas grand-chose aux subtilités d'une telle simulation, mais l'approche est baséelors de la présentation "The Destiny Particle Architecture" de Brandon Whitney au Siggraph 2017 . La méthode de la présentation est très similaire à celle que j'ai décrite ci-dessus et est utilisée dans de nombreux autres jeux. Par exemple, je suis à peu près sûr que le système de simulation de particules Niagara fonctionne de la même manière dans Unreal Engine 4.
Éclairage
Semblable à Doom 2016 et à la méthode décrite dans Siggraph 2016, la résolution des particules d'éclairage est découplée de la résolution réelle de l'écran , permettant aux développeurs de contrôler la résolution de chaque système de particules en fonction de la qualité, de la taille de l'écran et du contrôle direct. Pour les effets à basse fréquence, l'éclairage peut être fourni à une résolution beaucoup plus faible avec pratiquement aucune perte de qualité par rapport, par exemple, aux étincelles qui nécessitent une résolution élevée. L'éclairage et la direction dominante de la lumière sont stockés dans deux atlas de 2048 par 2048 pixels, tous deux disponibles pour chaque passage à travers des ressources non liées, comme toute autre texture. En outre, pour le rendu des particules, une géométrie simple est dessinée par échantillonnage de ces atlas.
Un fragment agrandi d'un atlas d'éclairage.
Ciel et dispersion
Nous allons maintenant parler de l' éclairage volumétrique . Sa génération se compose de quatre passes et commence par créer une texture 3D LUT pour l'atmosphère du ciel en traversant le ciel lui-même en direction de la source de lumière.
Dès la première fois, vous ne comprenez peut-être pas exactement ce que la texture affiche dans l'image, mais si nous la faisons pivoter de 90 degrés et l'étirons horizontalement, tout devient clair: nous avons une dispersion de l'atmosphère. Puisqu'elle est plus variable verticalement qu'horizontalement, la résolution verticale est plus grande. L'atmosphère est représentée par une sphère, donc la rotation horizontale est généralement appelée longitude et la rotation verticale est généralement appelée latitude. La diffusion atmosphérique est calculée par l'hémisphère et couvre 360 degrés de longitude et 180 degrés de latitude pour le sommet de la sphère. Pour couvrir différentes distances de l'observateur, la texture LUT contient 32 segments de profondeur, et au lieu de recalculer les données du ciel dans chaque image, le processus est réparti sur 32 images.
Grâce à la texture LUT, la passe suivante calcule la diffusion de la lumière par le "froxel" observé par analogie avec l'obstruction de l'amas de lumière à plus petite échelle. Vous pouvez observer plusieurs segments, de près à loin, en dessous.
Dans la troisième passe, les données de diffusion pour chaque cellule sont multipliées dans chaque cellule suivante vers la vue et écrites dans une nouvelle texture 3D.
En conséquence, un éclairage volumétrique est placé au-dessus de l'image rendue par échantillonnage de la texture 3D nouvellement générée en fonction de la profondeur de pixel.
Avant
Après
Le ciel "visible" final est rendu dans un hémisphère s'il est dans la vue. Dans cette scène, le ciel n'était pas inclus dans la revue, mais ci-dessous, vous pouvez jeter un coup d'œil à un exemple de rendu du ciel dans une scène extérieure.
Transparence
Semblable à Doom 2016, la transparence est rendue par une passe avant après une géométrie opaque lorsque des données de diffusion de la lumière sont présentes. En même temps, la texture de la scène perd en résolution (sous-échantillons), et un niveau de mip approprié est sélectionné pour "simuler" la transparence en fonction de la douceur de la surface. Les données de diffusion de la lumière contribuent à créer une bonne diffusion visuelle de l'intérieur de la surface.
Ci-dessous, vous pouvez voir un exemple de mip-chain de texture de la scène, où des surfaces plus transparentes tombent dans la fenêtre.
Pour la transparence, seuls les pixels qui lui sont liés sont perdus en résolution.
Interface utilisateur
En règle générale, le dernier passage dans un cadre est l'interface utilisateur. Comme c'est généralement le cas, l'interface est rendue dans une cible de rendu secondaire LDR (huit bits) pleine résolution et la couleur est pré-multipliée par le canal alpha. Pendant le mappage de tons, l'interface est superposée à la texture HDR. Faire fonctionner l'interface avec le reste du contenu HDR dans le cadre est généralement délicat, mais dans Doom Eternal, le mappage de tons redimensionne magiquement l'interface et semble naturel par rapport à d'autres contenus 3D.
Post-traitement
La première chose dans le post-traitement est le flou : cet effet à deux passes lit les données de la texture de couleur et d'un tampon de vitesse personnalisé. Le premier passage recueille quatre échantillons sur l'axe vertical, le second - quatre le long de l'horizontale. Ensuite, les échantillons de couleur sont mélangés en fonction du mouvement des pixels. Pour éviter le flou, le tampon de vitesse personnalisé doit garantir qu'il n'y a pas de fantômes et que l'arme du joueur est exclue du processus.
Vient ensuite l' impact ciblé: Cette texture RG (bicolore) 1 par 1 contient l'illumination moyenne de toute la scène et est calculée en diminuant successivement la résolution de la texture couleur et en obtenant l'illumination moyenne d'un groupe de pixels. Le plus souvent, cette technique est utilisée pour simuler l'accoutumance de l'œil humain à un changement brusque de la luminosité ambiante. En outre, l'éclairage moyen est utilisé lors du calcul de l'impact pendant le mappage des tons.
Après tout cela, Bloom est calculé . Cet effet n'est pas suffisant dans notre exemple et il ne sera pas possible de le rendre largement, mais il suffit de savoir que le calcul est effectué en obtenant des données de couleur au-dessus d'une certaine limite et en diminuant successivement la résolution de la texture pour la brouiller.
Puis ton mappingcombine tous les effets. Un shader de calcul unique effectue les opérations suivantes:
- Applique une distorsion
- Rend sur la texture Bloom
- Calcule le vignettage, la saleté sur l'appareil photo, l'aberration chromatique, la lumière parasite et de nombreux autres effets
- Obtient la valeur d'exposition en fonction de l'éclairage moyen
- Permet au mappage de tonalité de distribuer les couleurs HDR dans les plages correctes pour LDR et HDR via un opérateur de mappage de ton personnalisé.
Enfin, l'interface est superposée sur le dessus.
La texture de distorsion est rendue avant même la passe de post-traitement: la géométrie comme une brume de feu à partir d'effets de particules est rendue dans une nouvelle cible de rendu dans un format avec un quart de la résolution d'origine. Dans ce rendu, les données de distorsion sont stockées dans les canaux rouge et vert et l'occlusion dans le bleu. Les données obtenues sont appliquées lorsque l'image est déformée à l'étape de mappage de tons.
Conclusion
Notre analyse superficielle d'un coup de Doom Eternal est terminée, même si je suis sûr que je n'ai pas abordé certaines choses qui affectent l'apparence du jeu. À mon avis, Doom Eternal est un succès technique incroyable, et id Software sera en mesure de relever la barre encore plus à l'avenir. L'équipe de développement nous a démontré avec succès comment une réflexion intelligente et une planification efficace ont contribué à créer un jeu de haute qualité, et je pense que c'est un excellent modèle, ainsi que du matériel éducatif. J'attends avec impatience les développements futurs d'id Software.
Déchirez et déchirez, jusqu'à ce que ce soit fait.