Diablo Immortal améliore la qualité de l'image grâce au traçage de rayons matériel

Diablo Immortal est un jeu de rôle d'action multijoueur (ARPG) sans frais de jeu développé conjointement par Blizzard Entertainment et NetEase. Diablo Immortal, un nouveau chapitre de la série Diablo, a été lancé en 2022. Le jeu comble le vide narratif entre Diablo 2 et Diablo 3, et déroule une nouvelle aventure autour des fragments de la Pierre du monde, où les joueurs explorent le continent de Sanctuaire pour combattre les démons et les forces corrompues.

Grâce à l'innovation de l'architecture de GPU mobile et aux avancées des fonctionnalités d'accélération matérielle, la technologie de ray tracing passe progressivement des ordinateurs de bureau aux appareils mobiles, devenant l'un des principaux moteurs du rendu graphique haute fidélité. Le calcul des réflexions dynamiques physiquement réalistes est exigeant en termes de calcul, mais une unité matérielle dédiée le rend possible sur les plates-formes mobiles soumises à des contraintes d'alimentation. En traçant le chemin de propagation de la lumière à travers la scène en temps réel, la technologie simule avec précision le comportement réfléchissant de surfaces complexes telles que les miroirs, les métaux et les liquides. Le traçage de rayons surmonte les limites spatiales et les erreurs d'approximation des schémas de rastérisation traditionnels, et prend en charge l'expression cohérente globale des sources lumineuses dynamiques, des objets hors écran et des réflexions à plusieurs niveaux.

Ray tracing matériel sur mobile

La technologie de ray tracing matériel comprend principalement deux paradigmes d'implémentation: le pipeline de ray tracing et la requête de rayons.

Le pipeline de traçage de rayons crée un pipeline complet via des étapes de nuanceur dédiées (génération de rayons / intersection / shader de l'intersection la plus proche). Bien qu'il puisse assurer un contrôle précis de l'interaction des rayons, le pipeline de traçage de rayons nécessite une configuration de pipeline indépendante, ce qui augmente la complexité du développement.

En revanche, les requêtes de rayons peuvent être lancées directement à partir de calculs ou de nuanceurs de fragment traditionnels, ce qui en fait une technologie de base pour le traçage de rayons sur mobile. En éliminant le besoin de pipelines distincts, la requête ray non seulement simplifie considérablement le processus de développement, mais présente également trois avantages majeurs:

  1. Fournit une compatibilité avec les environnements de calcul hétérogènes et le matériel de traçage de rayons non complet
  2. Prend en charge l'appel à la demande du traçage de rayons à n'importe quel stade d'ombrage.
  3. En réduisant l'utilisation des ressources, il répond aux contraintes de bande passante et d'alimentation des plates-formes mobiles, et fournit une base viable pour les effets avancés tels que l'éclairage global dynamique et la réflexion en temps réel dans les jeux mobiles.

Diablo Immortal utilise Vulkan pour tirer parti des fonctionnalités de traçage de rayons matériel du GPU. Le jeu calcule le chemin des rayons lumineux à travers la scène en temps réel et tient compte des propriétés des matériaux complexes pour obtenir des effets de réflexion révolutionnaires en temps réel sur les appareils Android.

Figure 1. Scène avec réflexion traçage de rayons activée.
Figure 2 Scène avec la réflexion par lancer de rayons désactivée.

Structure d'accélération

La structure d'accélération est le cœur du traçage de rayons matériel. La structure d'accélération améliore considérablement l'efficacité des tests d'intersection de rayons grâce à une organisation hiérarchique des données.

Le système comporte généralement deux niveaux: la structure d'accélération de premier niveau (TLAS) et la structure d'accélération de bas niveau (BLAS):

  • Le TLAS joue le rôle de gestionnaire de scène. En enregistrant la matrice de transformation spatiale (y compris la position, la rotation et l'échelle) de toutes les instances BLAS, le TLAS réalise l'organisation globale des scènes dynamiques. Par exemple, TLAS permet aux développeurs de distribuer des centaines d'instances du même modèle d'arbre dans différentes positions et poses dans la scène. Ainsi, les développeurs n'ont qu'à mettre à jour la matrice de transformation de l'objet en mouvement à chaque frame au lieu de reconstruire la géométrie.
  • BLAS comme unité de base : responsable de l'encodage efficace des détails géométriques d'un seul objet 3D, BLAS établit une structure d'index spatial via l'algorithme de hiérarchie des volumes englobants (BVH) afin que les zones non pertinentes puissent être rapidement ignorées lors de la détection des rayons.

Cette conception hiérarchique permet au pipeline de traçage de rayons de former une chaîne de détection efficace de rayons ==> TLAS (instance d'objet à tamis grossier) ==> BLAS (intersection exacte).

La séparation des modèles dynamiques et statiques est essentielle pour réduire le coût de la construction de la structure d'accélération:

  • Modèle statique : le BLAS ne doit être compilé qu'une seule fois à l'étape d'initialisation et peut être réutilisé directement lors du chargement de scènes ultérieur. Pour éviter le temps de latence de chargement des scènes à grande échelle, la technologie de préconstruction asynchrone du cadrage peut être utilisée pour répartir la tâche de construction du BLAS sur plusieurs cadres.
  • Modèle dynamique
    • Basé sur l'animation squelettique : les données de vertex skinné doivent être calculées en parallèle par le nuanceur de calcul à chaque frame pour générer un nouveau tampon de vertex, puis déclencher la mise à jour incrémentielle du BLAS correspondant, ce qui évite une reconstruction complète pour améliorer les performances.
    • Transformation de corps rigide : si seules les transformations de translation/rotation/zoom sont impliquées, il n'est pas nécessaire de modifier le BLAS. Il suffit de mettre à jour sa matrice de transformation du monde dans le TLAS, puis de déclencher le processus de mise à jour rapide du TLAS.

La reconstruction périodique est essentielle pour maintenir l'efficacité de la structure d'accélération dans les scènes dynamiques de traçage de rayons. Lorsque des objets dynamiques subissent des modifications importantes de la topologie géométrique, telles que la déformation ou le déplacement de sommets à grande échelle, la division spatiale d'origine peut échouer, ce qui réduit les performances de détection des collisions lors de la traversée des rayons. Par conséquent, une reconstruction complète, plutôt qu'une mise à jour incrémentielle, des BLAS/TLAS hautement dynamiques doit être déclenchée tous les N frames.

Enfin, pour optimiser les performances du rendu par lancer de rayon, adoptez une stratégie de construction de TLAS dynamique basée sur la région visible du personnage: seuls les modèles situés dans le seuil de rayon actif du personnage sont inclus dans le TLAS afin de réduire la surcharge de base du calcul de l'intersection des rayons.

Réflexions traçages par lancer de rayon

Les réflexions par traçage de rayons présentent plusieurs avantages par rapport aux techniques traditionnelles telles que les réflexions dans l'espace d'écran (SSR) et les réflexions planes (surfaces simples qui projettent une scène en une dimension). La réflexion par traçage de rayons simule physiquement le chemin de la lumière, capture avec précision les objets dynamiques à l'intérieur et à l'extérieur de la scène, prend en charge les réflexions naturelles des surfaces incurvées et non planes, et permet d'obtenir plusieurs effets de rebond de lumière tels que les miroirs. En revanche, le SSR est limité aux informations visibles à l'écran, et les réflexions planaires plates sont sujettes à des erreurs visuelles ou à des distorsions dans les scènes complexes.

Figure 3. Reflet des ailes dans la piscine.
Figure 4. Le reflet du monstre.

En principe, la réflexion par traçage de rayons est semblable au SSR traditionnel: elle émet des rayons dans la direction de la réflexion de la ligne de visée sur une base pixel par pixel et calcule l'intersection des rayons avec les objets de la scène. Le point d'intersection renvoyé par l'API de requête de rayons contient des informations géométriques (y compris l'ID d'instance, l'indice de géométrie et l'indice de primitif) et des paramètres de rastérisation (coordonnées barycentriques) au niveau du triangle, mais ne contient pas de données de couleur de pixel. La solution classique utilise la technologie de liaison de ressources sans liaison pour précompiler tous les paramètres de texture et de matériau de la scène dans un tableau d'index global. À l'aide des identifiants géométriques renvoyés par la requête de rayon, les propriétés physiques du matériau correspondant (telles que la carte normale et la rugosité) peuvent être recherchées, puis combinées à l'interpolation des coordonnées barycentriques pour calculer les informations d'ombrage de la surface. La valeur de couleur réelle de l'intersection peut ensuite être reconstruite par tramage.

Toutefois, au cours du processus d'implémentation, l'équipe Diablo Immortal a découvert deux problèmes techniques importants:

  1. Le modèle d'éclairage a été forcé d'être unifié, ce qui était en conflit avec les divers systèmes d'ombrage accumulés au cours de l'histoire du projet et entraînait une incohérence entre le matériau spéculaire et le matériau d'origine.
  2. La variété des formats de sommets entraîne la dégradation de l'efficacité de la branchement d'instructions à l'étape de la rastérisation, ce qui constitue un problème majeur dans le cadre du budget de performances limité de l'appareil mobile.

L'équipe Diablo Immortal a introduit de manière innovante le tampon de visibilité pour séparer le traitement de la géométrie des calculs d'ombrage:

  • Phase de traçage de rayons : les informations sur les rayons qui atteignent le niveau des pixels sont capturées en temps réel via une requête de rayons. L'identifiant spatial 3D (InstanceID avec PrimitiveIndex) du point d'intersection est encodé dans un ID de visibilité compact et écrit dans le tampon d'espace d'écran.
  • Étape de coloration : comme pour les opérations effectuées par les nuanceurs de sommets et de pixels, les identifiants géométriques du tampon de visibilité sont analysés de manière dynamique, les propriétés de sommet (telles que les UV et les normales) et les cartes de matériaux basées sur la physique du modèle d'origine sont récupérées, et les calculs d'ombrage associés au type de matériau sont finalement effectués.

Cette solution permet de connecter les éléments artistiques au système de réflexion par lancer de rayon sans avoir à modifier les formats de sommet ni les nuanceurs.

Étapes de rendu spécifiques

Passage de requête Ray

Correspond à l'étape de traçage de rayons et génère un tampon de visibilité pour les réflexions dans l'espace d'écran:

  • Color0
    • Format : R32G32UInt
    • R = TriangleID,G = Barycentrics
Figure 5 Tampon de visibilité.
  • Profondeur :
    • Format : Depth32F
    • D = EncodeAsFloat(InstanceIdx, GeometryIdx)
    • L'identifiant du matériau de l'intersection est encodé en virgule flottante 32 bits et écrit dans le tampon de profondeur pour l'étape suivante de la technique de détection de correspondance de codage de profondeur du matériau.
Figure 6 Profondeur encodée.

Par rapport au nuanceur de calcul, la requête de rayon dans le nuanceur de pixel présente les avantages suivants:

  • Intégration de pipeline : le pipeline est intégré directement aux pipelines de rendu direct/différé existants, ce qui permet de maintenir la continuité de l'état du pipeline de rendu.
  • Optimisation de la bande passante mobile : pour l'architecture mobile basée sur des tuiles, la compression sans perte sur le chip peut être déclenchée lorsque les données de détection de rayons sont écrites dans RenderTarget, ce qui réduit la consommation de bande passante de mémoire par rapport à la sortie de nuanceur de calcul traditionnelle vers le tampon.
  • Contrôle de la quantité de rayons : les zones non réfléchissantes peuvent être marquées et rejetées à l'aide d'une phase de précalcul combinée à un test de pochoir.

Résoudre le problème de la carte

À l'étape de la coloration (voir Réflexions traçages de rayons), l'équipe Diablo Immortal a obtenu une mise en correspondance rapide de l'identification à l'aide de l'unité matérielle d'analyse de profondeur et de la coloration des matériaux en lots successifs.

Pour chaque matériau, un passage de dessin en plein écran est émis. Le nuanceur de sommet reconstruit dynamiquement l'identifiant encodé du matériau actuel. À l'aide du test d'égalité de la profondeur, l'identifiant est comparé aux valeurs encodées dans le tampon de profondeur, et seuls les pixels dont les valeurs encodées correspondent exactement sont conservés, c'est-à-dire ceux qui appartiennent à l'instance de matériau actuelle. Les pixels conservés exécutent le nuanceur de matériau correspondant.

Ensuite, la reproduction des matériaux haute précision est implémentée dans le nuanceur de pixels:

  • Décodage des données de géométrie : extrait l'identifiant du triangle (MeshID + PrimitiveID) et les coordonnées barycentriques du tampon de visibilité, puis charge dynamiquement les attributs de sommet (position, UV, normale, etc.) du triangle correspondant à partir du tampon de sommet. Étant donné que chaque modèle est ombré en tant que matériau indépendant, les fonctionnalités avancées telles que la liaison ne sont pas nécessaires.
  • Reconstruction des paramètres de surface : calcule les coordonnées UV au point d'intersection à l'aide de l'interpolation des coordonnées barycentriques. Une rastérisation logicielle est effectuée pour échantillonner la carte en fonction des UV interpolés.
  • Réutilisation du calcul d'ombrage : réutilise directement le code de nuanceur existant pour conserver la même logique de matériau que le pipeline de rendu principal.
Figure 7 Résolution de la réflexion.

Enfin, les modèles qui participent réellement au calcul des réflexions ne représentent qu'une très petite partie de la scène. Les données d'identification du modèle de réflexion renvoyées par le GPU peuvent être lues de manière asynchrone pour éliminer les modèles/matériaux qui ne participent pas à la réflexion, ce qui réduit efficacement le nombre d'appels de dessin (un appel de dessin se produit lorsque des matériaux et un maillage sont envoyés au GPU pour le dessin) à l'étape d'ombrage.

Réflexion spéculaire basée sur la physique

Pour obtenir des réflexions haute fidélité, les surfaces réfléchisantes sont classées dans l'un des trois types suivants en fonction de leur rugosité:

  1. Aucune réflexion : les calculs de réflexion pour ces surfaces peuvent être ignorés pour économiser des ressources. Si la surface est très rugueuse, la réflexion devient floue et faible, de sorte que la contribution n'est pas évidente.
  2. Reflet miroir : comme un miroir lisse, l'image réfléchie est claire et non floue. Photographiez la ligne directement dans la direction de la réflexion à partir de la ligne de visée.
  3. Réflexion brillante : la réflexion avec une certaine rugosité de la surface est simulée sur la base de l'échantillonnage par importance GGX, qui peut prendre en compte à la fois l'efficacité de calcul et la précision physique. La réflexion dévie vers la direction principale de la réflexion spéculaire lors de l'émission de la ligne, ce qui améliore l'efficacité de l'échantillonnage de la zone de surbrillance.

Pour obtenir une qualité d'image utilisable avec une consommation d'énergie limitée, l'équipe Diablo Immortal a adopté une solution 1SPP+Denoiser. Autrement dit, l'équipe Diablo Immortal a effectué un échantillonnage par pixel,puis un algorithme de réduction du bruit temporel/spatial a été utilisé pour lisser la grande quantité de bruit introduite par le faible taux d'échantillonnage.

L'équipe Diablo Immortal a choisi le dénoyauteur de réflexions dans le dénoyauteur AMD FidelityFX, un dénoyauteur hautes performances optimisé pour les réflexions traçages de rayons et les réflexions dans l'espace d'écran. L'avantage principal du dénoisier de réflexion est son algorithme de réduction du bruit hybride spatiotemporel: en fusionnant le frame actuel et les données de frame historiques (basées sur la compensation de mouvement), combinées à des techniques de filtrage spatial (telles que le filtrage de rétention des bords guidé par la variance), le dénoisier de réflexion élimine efficacement le bruit et produit des effets de réflexion fluides à très faible échantillonnage.

Pour s'adapter aux caractéristiques des pipelines de rendu développés en interne et répondre aux contraintes de performances strictes des mobiles, l'équipe Diablo Immortal a implémenté une rationalisation ciblée et une adaptation de l'architecture lors de l'intégration du dénoisier de réflexion AMD FidelityFX.

Ray tracing haute fidélité avec Vulkan

Diablo Immortal s'exécute sur une large gamme d'appareils Android compatibles avec Vulkan, où l'équipe Diablo Immortal a exploité les fonctionnalités innovantes de traçage de rayons matériel du GPU. Vulkan a réduit les coûts et les frictions liés au développement, ce qui a facilité la diffusion de contenus et de gameplay de haute qualité Diablo Immortal auprès des utilisateurs Android.