Remarques générales
Tous les résultats ont été obtenus sur une machine assez ancienne (i7 3770 + GTX 770), le jeu fonctionnait en DirectX 11 de qualité moyenne. Pour l'analyse, RenderDoc et Nsight ont été utilisés.
Le jeu fonctionne sur le moteur Re Engine, qui est devenu l'héritier du MT Framework - le moteur de la R&D Capcom de la génération précédente. En plus de RE2, il est utilisé dans DMC5 et RE7: Biohazard.
Je n'ai pas pu trouver de documents sur le moteur RE sur Internet, donc tout dans l'article est basé sur des suppositions (j'espère que c'est justifié). J'ai examiné environ 90% de la structure du cadre et donné une description générale des algorithmes. Des recherches plus poussées nécessitent plus d'expérience et de temps pour les shaders d'ingénierie inverse.
Structure du cadre
Simulation particules / fluides
Entre autres choses, le jeu génère des textures de vagues (un exemple est tiré d'une autre image).
Les vagues sont utilisées pour restituer de l'eau, qui n'est pas dans le cadre analysé.
Certains résultats sont copiés dans le tampon de transfert, ce qui suggère que les résultats peuvent être utilisés dans le CPU.
Calcul de la liste des sources d'éclairage
Ce passage génère une liste de sources lumineuses visibles, vérifiant l'emplacement des cônes d'éclairage par rapport à la pyramide de visibilité. Son résultat est une liste de sources lumineuses visibles et un certain tableau 3D comparant les positions dans l'espace de visualisation avec les sources lumineuses correspondantes.
Des listes d'instances visibles pour chaque source de lumière, qui sont ensuite utilisées lors de la mise à jour de la carte d'ombre, sont également calculées.
Point blanc
Ce passage construit un histogramme de luminance basé sur l'image HDR précédente et le tableau de mesure. Puis, sur la base de ces données, il détermine le point blanc.
Définition des objets qui se chevauchent
La boîte englobante des objets qui se chevauchent est vérifiée pour l'intersection avec la pyramide de visibilité dans le shader de calcul et le tampon d'arguments indirects est rempli.
Drop Overlapped Geometry
Les objets qui se chevauchent sont rendus dans le tampon de profondeur basse résolution, puis la case de délimitation est vérifiée pour l'entrée de profondeur dans ce tampon.
Échantillons 0-3Le tampon de profondeur utilisé est multi-échantillonné quatre fois. Probablement pour compenser la basse résolution.
Cela ressemble à des boîtes englobantes orientées par rapport au regard.
Un exemple de test de géométrie superposée (à partir d'un autre cadre). Les pixels qui réussissent le test (vert) écrivent un indicateur (par exemple 1) dans le tampon de visibilité pour chaque instance.
store_raw RWDrawIndirectArguments.x, v1.x, l(1)
Accumulation d'arguments indirects
Presque tous les objets de géométrie dans l'espace universel sont rendus à l'aide d'un appel de dessin indirect. Le profileur Nsight affiche les appels à NvAPI_D3D11_MultiDrawIndexedInstancedIndirect. Pour plus d'informations sur son utilisation, voir [
1 ] et [
2 ]. RenderDoc bloque l'extension MultiDraw, donc dans EventBrowser, ils sont développés dans de nombreux DrawIndexedInstancedIndirect et certains d'entre eux sont vides.
Le but de cette passe est de collecter des masques de visibilité de la passe précédente et de générer un tampon d'arguments.
Passage en profondeur
Rien d'extraordinaire. Un sous-ensemble d'une scène avec une géométrie de chevauchement de base.
Géométrie + décalcomanies du passage du tampon G
Données de sortie:
- RT0 - émetteur r11g11b10
- RT1 - rgba8 albedo.rgb + metallness.a
- RT2 - r10g10b10a2 normal.rg + rugosité.b + misc.a
- RT3 - r16g16b16a16 baked_ao.x + velocity.yz + sss.a
Les modèles rendus utilisent l'occlusion ambiante cuite à partir de modèles haute résolution.
Calcul HiZ
Un shader de calcul multi-passes définit chaque niveau dans la hiérarchie des profondeurs.
Ao
Traitement SSAO ou HBAO + selon les paramètres choisis par le joueur. Dans mon cas, SSAO.
L'AO est calculé sur la base de HiZ de la passe précédente.
Global spéculaire + diffus
En utilisant un algorithme non trivial, les sondes lumineuses, les cartes cubiques et AO sont combinées en cartes globales diffuses et spéculaires.
Exemples de cartes cubiques de la scène.La composante diffuse de l'éclairage global.Composante d'éclairage global spéculaire.Mise à jour de la carte fantôme
Les plans d'ombres créés pour chaque source lumineuse sont mis à jour pour les sources affectées par des objets dynamiques. Chaque carte d'ombre est placée dans un large éventail de textures.
Spéculaire local + diffus + SSS
Ensuite, la contribution de chaque source lumineuse aux composants spéculaires et diffus est calculée.
Diffus + SSS. Les effets SSS ne sont pas visibles dans ce cadre.Composant spéculaire.Intégration d'éclairage
Les composants de luminosité spéculaire / diffuse / éclairage local s'intègrent à l'albédo.Ajout de verre transparent
Après avoir ajouté toutes les sources de lumière, le verre transparent est rendu.Éclairage volumétrique / calcul du brouillard / de la fumée
En fait, ce n'est qu'un tas de sprites.Appliquer un éclairage volumétrique / brouillard / fumée
Ce passage calcule une image floue pour améliorer l'éclairage de brouillard.Si vous remplacez le masque de brouillard d'origine par un motif en damier.Le résultat de ce passage.TAA avec l'image HDR précédente
TTA est juste magique.Flou de mouvement
Sur la base de la carte de vitesse, une carte de flou auxiliaire est calculée.Post-traitement
Ce passage fait d'abord un zoom arrière sur l'image.Et puis il applique un filtre de bloom, une correction de tonalité, une distorsion et une aberration chromatique.Conclusion
Le moteur utilise activement des shaders de calcul + rendu indirect. Tous les maillages et textures sont de haute qualité.
Le jeu utilise un rendu différé avec TAA / FXAA et le verre comme post-traitement. Vous pouvez en savoir plus sur les astuces avec rendu différé
ici [un
article basé sur un article sur Habré]. De nombreuses textures sont compressées par BC7. En général, les techniques utilisées sont similaires à celles décrites dans [
4 ].
Bonus
Contribution SSS
J'ai dû soigneusement rechercher une trame appropriée pour montrer l'impact de SSS.Comment un monstre avec des tentacules est rendu
Le monstre est divisé en plusieurs parties.Tripes
Le jeu a de nombreuses textures sanglantes pour divers détails.
Les niveaux de mip pour les textures ne sont pas uniquement filtrés linéairement. À chaque niveau, la netteté est améliorée. De plus, certaines textures ont déjà des reflets spéculaires (on ne sait pas très bien comment cela affecte leur apparence finale).
Géométrie
La géométrie a une bonne topologie.HBAO
HBAO offre une bien meilleure qualité que SSAO.La fumée
La fumée considère les sources lumineuses coniques.De vrais avions sont utilisés pour rendre la fumée.Les références
[1]
Kostas Anagnostou: Expériences de sélection d'occlusion basée sur GPU[2]
Daniel Rákos: Multi-Draw-Indirect est ici[3]
Blog d'Adrian Correger[4]
Extraterrestre: Isolement