Aujourd'hui, nous allons examiner plusieurs exemples de cadres du jeu et analyser les techniques graphiques utilisées dans le jeu.
Préface
Il s'agit d'une analyse non officielle du jeu. Je viens d'analyser la capture d' image avec RenderDoc . Si vous souhaitez obtenir des informations auprès des développeurs eux-mêmes, vous pouvez étudier les diapositives de la conférence SIGGRAPH de Fabian Bayer . Diapositives (bas de page), vidéo (à partir de 1:58:00).
Vous pouvez également lire l' analyse des graphiques de GTA5, réalisée par Adrian Corrèze [ traduit en Habré]. Étant donné que RDR2 et GTA5 sont créés par la même société et utilisent le même moteur, certaines des astuces de GTA5 sont également présentes ici.
Un autre point important - je ne suis pas un programmeur graphique expérimenté et je suis encore nouveau dans ce domaine. Par conséquent, beaucoup de choses me sont incompréhensibles. Si vous trouvez des bugs ou des choses qui peuvent être améliorées,écrivez-moi . Allons-y!
Analyser le cadre
Voici notre cadre principal d'analyse:
Le cadre a été capturé sur un PC avec des paramètres moyens.
Dans des jeux comme RDR2, il est presque impossible d'explorer toutes les astuces dans une seule image. Leur travail est reporté entre plusieurs cadres. J'ai donc capturé quelques images, mais celle ci-dessus sera la principale. Il contient de nombreuses propriétés, notamment: des projecteurs et des projecteurs, un éclairage directionnel (il y en a très peu, mais ils le sont), des bâtiments, des PNJ, des chevaux, des arbres, de la végétation, des nuages, etc. Il montre la plupart des techniques de rendu utilisées dans le jeu.
RDR2 est un jeu à monde ouvert, donc le streaming de données est toujours fait. Par conséquent, la construction du cadre commence par un ensemble de tâches telles que la création et la suppression de textures, l'affichage des ressources de shader, les vues à accès aléatoire, la mise à jour des descripteurs, des tampons, etc.
Carte terre / terre
La saleté joue un grand rôle. En plus d'être un mécanicien de jeu, la saleté rend l'environnement plus réaliste. Le jeu rend les textures des traces humaines et équestres dans une carte de déplacement avec les textures des traces de roue de chariot. Cette texture accumulée est utilisée pour le mappage d'occlusion de parallaxe lors du rendu du terrain.
Carte de boue:
R16_UNORM
2048x2048
Ciel et nuages
Après le passage du calcul de saleté, le jeu fait beaucoup de travail de calcul GPU. Ils se réfèrent principalement au ciel et aux nuages. Les nuages, le brouillard et l'éclairage volumétrique font partie des effets les plus marquants du RDR2. Vous pouvez en savoir plus sur cette étape à partir des diapositives de Fabian. Il explique tout cela plus en détail que moi.
Carte de l'environnement
Les cartes d'environnement sont la principale source de réflexions RDR2, ainsi que GTA5.
Comme GTA5 , RDR2 génère une carte de cube d'environnement à partir de la position de la caméra. Le moteur de jeu génère un GBuffer mince pour une carte d'environnement, similaire à celui utilisé dans Far Cry 4 .
Faces d'une carte d'environnement de cube (albédo):
RGBA8_SRGB
Faces d'une carte d'environnement de cube (normales):
RGBA8_UNORM
Arêtes de cube d'environnement (profondeur): La
D32S8
génération de cartes de cube d'environnement dans chaque image peut être une tâche très lourde. RDR2 utilise des optimisations pour réduire les coûts de calcul. Par exemple, le jeu ne rend que les objets statiques et opaques, effectue une élimination des troncs avant de rendre chaque face et rend les versions LOD inférieures des modèles. Cependant, j'ai découvert que le nombre de polygones de terrain est encore très élevé pour les cartes d'environnement.
Après avoir passé G-Buffer, une carte cubique de l'environnement du ciel est générée à l'aide d'une carte paraboloïde du ciel et des textures des nuages. La prochaine étape est la convolution. Pour l'éclairage basé sur l'image, le moteur RDR2 utilise une approximation de somme fractionnée... Cette méthode utilise une carte d'environnement pré-filtrée avec une LUT d'environnement BRDF. Pour le filtrage, le jeu réduit le cube d'environnement et stocke les versions réduites dans les niveaux de texture du mip de cube.
Avant d'effectuer la passe d'éclairage pour une carte d'éclairage cubique, RDR2 convertit une occlusion ambiante à grande échelle cuite dans une autre texture cubique. Le jeu utilise l'occlusion ambiante de l'écran, mais SSAO n'aide qu'à petite échelle. L'occlusion ambiante cuite permet d'effectuer un assombrissement à plus grande échelle, comme l'assombrissement des terrasses et des intérieurs.
Facettes d'une carte d'environnement cubique (AO cuite):
R8_UNORM
le jeu utilise le rendu de tuiles différé pour calculer la couverture des cartes d'environnement . L'élimination de la lumière et l'éclairage sont calculés ensemble en un seul passage du shader de calcul pour chaque face de la carte d'environnement. (Merci pour cette astuce @benoitvimont .) Également pour l'éclairage cuit, le jeu utilise la technique «top-down world lightmap» similaire à celle utilisée dans Assassin's Creed III .
Pour chaque face de la carte de cube, RDR2 rend la couleur finale sur la texture de l'environnement du ciel. Le jeu filtre ensuite le cube environnement de la même manière que le cube environnement ciel.
Facettes de la carte du cube d'environnement (finale):
R11G11B10_FLOAT
De plus, lorsque le joueur est à proximité d'un bâtiment, RDR2 charge les cartes d'environnement situées à l'intérieur des bâtiments. Il existe également des G-Buffers de cartes de cube qui sont diffusées à partir du disque.
Faces cuites d'une carte cubique de l'environnement (albédo):
BC3_SRGB
(l'AO cuit est stocké dans le canal alpha)
Faces cuites d'une carte d'environnement cubique (normales):
BC3_UNORM
Cube environnement bordé (profondeur):
R16_UNORM
le jeu calcule l'éclairage de ces cartes et les filtre comme les précédentes. Il ne calcule qu'une seule carte d'environnement à la fois et ne la recalcule que lorsque l'heure du jour change. Toutes les cartes d'environnement sont stockées dans un tableau de cartes de cubes de texture. Aucune conversion d'une carte de cube en une carte paraboloïde double n'est effectuée.
Pass G-Buffer
Cette étape commence par un passage préliminaire des profondeurs du terrain, puis le jeu rend la scène en G-Buffers.
GBuffer 0 RGB |
GBuffer 0 A |
---|---|
RGBA8_SRGB
- Ce tampon contient l'albédo dans les canaux RVB (couleur de base). Je ne comprends pas très bien à quoi servent les données du canal alpha, mais elles sont utilisées pendant la phase d'anti-aliasing.
GBuffer 1 RGB |
GBuffer 1 A |
---|---|
RGBA8_UNORM
: Les canaux RVB contiennent des normales et le canal alpha contient quelque chose lié au tissu et aux cheveux.
GBuffer 2 RGB |
GBuffer 2 A |
---|---|
RGBA8_UNORM
: Cet objectif est utilisé pour les propriétés des matériaux.
- R: réflectance (f0)
- G: douceur
- B: métallique
- A: contient un ombrage (ce canal sera utilisé comme masque d'ombre dans les étapes suivantes)
GBuffer 3 R |
GBuffer 3 B |
---|---|
RGBA8_UNORM
: le canal rouge contient des cavités. Il y a à nouveau des données mystérieuses dans le canal bleu. Et dans le canal alpha se trouvent des données liées aux cheveux. Je n'ai rien trouvé dans le canal vert.
GBuffer 4 RG |
---|
RG16_FLOAT
: Ce tampon contient la vitesse de l'espace d'écran pour l'implémentation du flou de mouvement.
GBuffer 5 Depth |
GBuffer 5 Stencil |
---|---|
D32S8
: Comme GTA5, RDR2 utilise le z inverse pour la profondeur et le tampon de gabarit pour attribuer des valeurs à un groupe spécifique de maillages.
Une autre cible est générée à partir des données baked:
GBuffer 6 R |
GBuffer 6 G |
---|---|
Ce tampon contient la même occlusion ambiante cuite dans le canal rouge que dans l'étape de cartographie de l'environnement. Mais il existe également d'autres canaux dans cette texture. Le canal vert contient des données qui ressemblent aux données du canal bleu de GBuffer 3. Encore une fois, je ne comprends pas à quoi servent ces données. Je n'ai trouvé aucune donnée dans les images capturées dans le canal bleu et alpha. J'étudierai cela plus en détail.
Génération de cartes d'ombre
Après l'étape G-Buffer, le jeu commence à rendre les shadow maps. Il utilise des tableaux de texture 2D pour les cartes d'ombre de source ponctuelle et des tableaux de texture cubique pour les cartes d'ombre de source de projecteur.
Certains jeux de cartes d'ombres utilisent une grande texture de l'atlas des ombres ( par exemple, dans DOOM ). L'un des avantages de cette méthode est que la taille de l'ombre peut varier considérablement en fonction de la distance. Lorsque vous utilisez des tableaux de textures, cette flexibilité est perdue car toutes les textures du tableau doivent être de la même taille. Il existe trois tableaux de textures différents dans RDR2 pour différents niveaux de qualité. Par exemple, les sources de projecteur ont:
- 512x768 D16 pour les sources distantes
- 1024x1536 D16 ( — )
- 2048x3072 D16 ( / )
Les sources ponctuelles projettent des ombres dans toutes les directions. Pour faire face à cette tâche, les jeux utilisent une technique appelée Omnidirectional Shadow Mapping , dans laquelle la scène est rendue dans une carte de profondeur de cube à partir de la position de la caméra. En utilisant cette technique, les ombres du feu et les ombres de la lanterne d'Arthur sont rendues. Comme les sources de projecteurs, les sources ponctuelles ont trois tableaux différents pour différents paramètres de qualité.
La plupart des sources ponctuelles statiques du jeu ont des cartes d'ombre de cube cuites.
Par conséquent, le jeu utilise des ombres cuites autant que possible et génère une carte d'ombre uniquement lorsque le joueur est proche du volume de lumière. Mais en fait, c'est encore plus intéressant.
La plupart des lumières sur les murs sont des projecteurs, mais le jeu ne génère pas de carte d'ombre omnidirectionnelle pour eux. Au lieu de cela, il génère une shadow map et copie la mémoire de cette shadow map dans un tableau cubique de la shadow map des sources ponctuelles.
Sur la gauche se trouve une carte d'ombre des projecteurs 1024x1536, sur la droite se trouvent les mêmes données d'image dans un format de texture de cube 512x512
Notez que les cartes z linéaires stockent le z linéaire.
Cela explique pourquoi les développeurs n'ont pas utilisé de carte d'ombre carrée pour les projecteurs. Le nombre de pixels dans la carte d'ombre de projecteur et la carte de cube source de points doivent être identiques. Vous pouvez voir que la bonne image est découpée en morceaux. Cela est dû au fait que la largeur de la carte des spots et des ombres ponctuelles est différente.
Notez également que cette texture ne couvre pas 360 degrés. Cependant, heureusement, les sources sur les bâtiments ont généralement un mur à l'arrière et des cartes d'ombre cuites le recouvrent.
Un autre point intéressant est que le processus est inversé. Prenez Saint Denis, par exemple, l'une des plus grandes villes du jeu. Le jeu génère des cartes d'ombre omnidirectionnelles pour les projecteurs et copie ces données dans un tableau de cartes d'ombre de projecteurs. Je ne sais pas pourquoi RDR2 fait un mappage fantôme de cette façon. Je n'ai pas pu trouver de telles astuces sur Internet.
L'ombrage directionnel dans RDR2 est implémenté de la même manière que dans GTA5 . Il s'agit de la cartographie des ombres en cascade avec quatre cascades. Chaque tuile 1024x1024 d'une texture 1024x4096 (avec des paramètres graphiques moyens) est utilisée comme une cascade.
Atlas des ombres des projecteurs:
R16_UNORM
Scène d'éclairage
Enfin, le moment est venu de combiner toutes ces cartes d'environnement, gbuffers, shadow maps et ao buffers.
Cette étape se compose de deux passes: la première pour l'éclairage global (soleil / lune), la seconde pour les sources locales.
Passe d'illumination globale
Le jeu rend un quad plein écran pour calculer l'éclairage directionnel, qui est le clair de lune dans notre cadre. Il utilise également un éclairage cuit provenant de la "carte lumineuse mondiale descendante" susmentionnée.
Pass d'éclairage local
Dans ce passage, le jeu rend une forme sphérique poly faible pour les volumes de source ponctuelle et un octogone pour les volumes de projecteurs. L'éclairage est rendu de l'arrière vers l'avant à l'aide d'un mélange additif.
Pour éviter les appels de shader inutiles, le jeu utilise des tests limités en profondeur - une fonctionnalité supplémentaire d' OpenGL / D3D11, qui est devenu natif dans Vulkan / D3D12. Elle utilise également des tests au pochoir pour supprimer les pixels absorbés par des objets translucides tels que les vitres. Ces objets seront rendus lors de la passe avant.
Rendu et réflexion de l'eau
Dans ce post, je ne parlerai pas du rendu de l'eau, car cela mérite un post à part, mais je dirai un peu sur les reflets:
- Comme mentionné ci-dessus, les cartes d'environnement sont la principale source de réflexions. Pour les réflexions standard. par exemple, pour les reflets de fenêtre, le jeu les utilise.
- Les miroirs sont rendus avec des réflexions planes, qui restituent la scène à partir de la direction de la réflexion. Ce processus est également effectué par rendu différé.
- Les réflexions sur l'eau utilisent les réflexions de l'espace de l'écran en combinaison avec une carte de réflexion générée au début de l'image.
Étape d'ombrage direct
L'un des inconvénients du pipeline de rendu différé est qu'il n'est pas possible de rendre correctement les matériaux translucides avec GBuffers. Pour résoudre ce problème, le jeu rend les matériaux translucides d'arrière en avant en utilisant l'ombrage direct, comme la plupart des rendus différés.
Mais un laissez-passer direct peut être coûteux:
- , .
, , , . ( ), .
- .
, . - . - (, ) .
- , .
Les états du convoyeur doivent être modifiés pour pouvoir basculer entre la coupe des bords avant et arrière. Et de tels changements peuvent être coûteux.
À ce stade, une autre cible de rendu est générée pour l'effet de floraison. Cette cible stocke la luminosité de la floraison. Comme vous pouvez le voir sur l'image, les objets translucides sont plus lumineux.
Floraison de luminance cible:
R8_UNORM
Notez que la floraison est plus brillante sur de longues distances pour rendre les zones brumeuses plus lumineuses.
Post-traitement
À ce stade, l'anti-crénelage temporel, la floraison, le flou de mouvement, l'effet de profondeur de vision et d'autres effets sont effectués. Je prévois de consacrer un poste séparé au post-traitement. Par conséquent, nous n'en discuterons pas trop ici, mais je voudrais dire quelques mots sur la floraison. Grâce à l'éclairage volumétrique, la cible de rendu principale a déjà la lueur des sources lumineuses.
L'implémentation de bloom dans RDR2 est très similaire à l'implémentation décrite dans Post Generation Generation dans Call of Duty: Advanced Warfare .
- La cible sans valeurs de seuil est prise comme entrée,
- Rendre le
R11G11B10_FLOAT
niveau cible 7-mip, - Filtre bilinéaire d'ordre 13 pour le sous-échantillonnage, filtre de tente 3x3 pour la mise à l'échelle.
Le jeu combine ensuite cette cible filtrée de l'effet de floraison avec la cible principale, ainsi qu'avec la luminosité cible de la floraison.
conclusions
Il y a beaucoup plus à dire, mais je ne veux pas que ce post soit trop long. Je voudrais partager mes conclusions sur tout cela, ainsi que certaines des bizarreries que j'ai découvertes au cours de l'analyse.
- , — . , . ( , .) bloom: - , , - , . GPU? ?
- , RDR2 . , (, GBuffers). ? ?
- : ( ) . SSAO, SSR, . target SSAO ?
Ne vous méprenez pas, je ne blâme personne (même si ... je suis un peu frustré par la faible fréquence d'images), j'essaie simplement de comprendre comment de telles décisions ont été prises. Après tout, beaucoup de gens ont travaillé dur sur ce jeu . Ils n'ont probablement pas eu assez de temps pour optimiser davantage le jeu.
Épilogue
C'est tout! RDR2 est un jeu superbe, non seulement à cause des graphismes utilisés, mais aussi à cause de l'art et de l'éclairage; tout semble juste phénoménal. Je suis tombé amoureux de la palette de couleurs de ce jeu. Surtout la nuit, cela me rappelle «Comment un lâche Robert Ford a tué Jesse James», «Old Men Don't Mind Here» et d'autres westerns filmés avec des caméras 35 mm.