Rendu d'image Resident Evil 2

image

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).

particule sim 0

particule sim 0

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.

table de mesure

prevhdr

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-3

Le tampon de profondeur utilisé est multi-échantillonné quatre fois. Probablement pour compenser la basse résolution.

élimination par occlusion 0

Cela ressemble à des boîtes englobantes orientées par rapport au regard.

élimination par occlusion 0

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.

pré-profondeur

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


Hiz gif

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.

Gid

Gid

Exemples de cartes cubiques de la scène.

Gid

La composante diffuse de l'éclairage global.

Gis

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.

Gid

Diffus + SSS. Les effets SSS ne sont pas visibles dans ce cadre.

Gis

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.

Gis

Le résultat de ce passage.

TAA avec l'image HDR précédente


Gis

TTA est juste magique.

Flou de mouvement


Gis

Sur la base de la carte de vitesse, une carte de flou auxiliaire est calculée.

Gis

Post-traitement


Gis

Ce passage fait d'abord un zoom arrière sur l'image.

Gis

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


Gis

J'ai dû soigneusement rechercher une trame appropriée pour montrer l'impact de SSS.

Comment un monstre avec des tentacules est rendu


Forme définitive de G virus guy

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


Forme définitive de G virus guy

La géométrie a une bonne topologie.

HBAO


Forme définitive de G virus guy

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

Source: https://habr.com/ru/post/fr462443/


All Articles