Le rendu dans l'Unreal Engine

Introduction au rendu dans les moteurs de jeu
Le rendu fait référence au processus de génération d'une image finale sur l'écran à partir d'une collection d'objets dans une scène.
Le logiciel utilisé pour effectuer le rendu d'une image est appelé moteur de rendu, et ces moteurs sont généralement classés comme suit :
-
Rendu hors ligne : Conçu pour un rendu de haute qualité qui privilégie la qualité par rapport au temps de traitement. Ils sont généralement utilisés dans des applications où la qualité de l'image rendue finale prime sur le temps nécessaire au rendu.
-
Rendu en temps réel : Conçu dans un souci de performance, il permet un rendu rapide des images. Les objectifs typiques de fréquence d'images en temps réel sont de 30 (33ms), 60 (16ms) et 120 (8ms) images par seconde (IPS), mais les fréquences d'images réelles peuvent varier dans le temps en fonction d'un certain nombre de facteurs. Les projets développés avec un rendu en temps réel doivent trouver un équilibre entre performance et qualité pour maintenir des fréquences d'images stables. Les moteurs de rendu en temps réel sont généralement utilisés pour les médias interactifs, tels que les jeux vidéo, les simulations et la visualisation architecturale.
L'Unreal Engine est une puissante suite d'outils conçus pour le rendu en temps réel afin de répondre aux besoins d'une variété de plateformes, des ordinateurs mobiles aux puissants ordinateurs de bureau. L'Unreal Engine est capable d'effectuer un rendu en temps réel ou hors ligne de grande qualité. Vous pouvez l'utiliser pour créer une multitude de chosesr : des expériences interactives en 2D ou en 3D sur plateformes mobiles, consoles ou ordinateurs de bureau, ou encore pour effectuer le rendu d'images finales pour des productions cinématographiques et télévisuelles.
Contrairement à d'autres moteurs temps réel sur le marché, l'Unreal Engine propose de nombreuses fonctionnalités exclusives conçues spécifiquement pour le temps réel et les performances. L'objectif est de réduire la complexité du développement et d'obtenir des résultats plus rapidement tout en maintenant un niveau élevé de qualité et de performances.
Les fonctionnalités, telles que le système d'éclairage global et de reflets Lumen, la géométrie virtualisée Nanite, et les textures d'ombres virtuelles sont des étapes importantes dans la réalisation de l'objectif qui consiste à éliminer la complexité au cours du développement grâce à des fonctionnalités qui fonctionnent pour les applications PC et console. Les plateformes mobiles prennent en charge l'éclairage dynamique et les flux de travail d'éclairage précalculés qui vous obligent à précalculer l'éclairage dans les textures.
Introduction au rendu dans l'Unreal Engine
Les moteurs de jeu effectuent une série d'étapes, souvent appelées Pipeline de rendu, pour effectuer le rendu d'une image à l'écran. Cette section décrit comment l'Unreal Engine procède en utilisant son chemin de rendu différé par défaut et compare les étapes avec le chemin de rendu différé de Unity, le cas échéant.
Le moteur Unity est livré avec trois pipelines de rendu distincts : Built-In, Universal, et High Definition. Chaque pipeline est conçu pour des cas d'utilisation spécifiques et est généralement sélectionné avant de commencer un nouveau projet.
L'Unreal Engine est doté d'un pipeline de rendu unifié qui adapte les fonctionnalités individuelles en fonction de la plateforme cible : des appareils portables et mobiles à la génération actuelle de consoles et au PC. Cela signifie que vous pouvez choisir le chemin de rendu et les fonctionnalités prises en charge qui conviennent le mieux à votre projet sans vous enfermer dans un chemin unique.
Le pipeline de rendu de l'Unreal Engine peut être utilisé avec son chemin de rendu différé par défaut ou il peut être configuré pour fonctionner dans un chemin de rendu direct. Vous pouvez en outre activer le chemin de rendu mobile pour vous adapter à des appareils moins puissants, dont le moteur de rendu mobile Vulkan. Pour en savoir plus sur les fonctionnalités de rendu prises en charge pour chaque chemin de rendu, consultez la page Supported Features by Rendering Path: Desktop and Desktop XR (Fonctionnalités prises en charge par les chemins de rendu : bureau et bureau en XR.
L'image ci-dessous montre une visualisation de haut niveau des étapes que l'Unreal Engine exécute à chaque image pour rendre une image finale en utilisant le chemin de rendu différé :

Le processus se déroule de gauche à droite et les étapes 2 à 5 se déroulent en parallèle.
Ci-dessous, vous en apprendrez davantage sur chacune de ces étapes du pipeline de rendu et sur ce qu'il faut pour effectuer le rendu de chaque image.
Préparation de la scène et occlusion

L'Unreal Engine dispose de trois threads principaux : les threads de jeu (CPU), d'affichage et GPU.
Avant de lancer le processus de rendu, le thread de jeu (ou CPU) rassemble les transformations de tous les objets dans la scène. Il s'agit notamment de traiter toutes les animations, les simulations physiques et l'intelligence artificielle (IA) avant de rassembler les transformations finales pour chaque objet.
Les informations relatives à la transformation sont ensuite transmises au thread d'affichage du CPU. Le thread d'affichage exécute le processus d'élimination, qui établit une liste des objets visibles dans la vue actuelle de la caméra et supprime tous ceux qui ne sont pas visibles par la caméra. Ces objets n'ont pas besoin d'être affichés et le fait de ne pas effectuer leur rendu améliore les performances.
Ce processus comporte les étapes suivantes (dans l'ordre) :
- Élimination par la distance : Supprime tous les objets situés à plus d'une distance précise de la caméra.
- Élimination par le champ de vision : Supprime les objets qui ne figurent pas dans le champ de vision de la caméra.
- Élimination par occlusion : Vérifie avec précision l'état de visibilité de tous les objets restants dans la scène. Cette méthode est coûteuse et est donc appliquée à la fin du processus d'occlusion, lorsque le test des objets visibles restants se poursuit pour voir s'ils sont occultés (masqués) par d'autres objets.
La liste finale des objets visibles est transmise au thread GPU pour commencer le processus de rendu.
Équivalent Unity
Unity effectue une élimination par le champ de vision et une élimination par occlusion pendant son pipeline de rendu. En outre, il peut effectuer un culling par la distance grâce à son API CullingGroup. Une combinaison de ces techniques permet d'établir la liste finale des objets visibles dans la scène.
Rendu de géométrie

Au cours de cette étape, l'Unreal Engine passe en revue la liste des objets visibles dans la scène et les prépare pour l'étape suivante, au cours de laquelle il convertit les données de vertex 3D en données de pixels affichées à l'écran.
Shaders de vertex
Un shader est un morceau de code qui s'exécute directement sur le GPU et qui est utilisé pour effectuer un ensemble de calculs. Ils sont efficaces et le GPU peut exécuter de nombreux calculs de shaders en parallèle.
Le shader de vertex effectue les étapes suivantes.
- Il convertit les positions locales des vertex en position dans le monde : les données relatives aux vertex des objets sont stockées dans l'espace local, mais une fois l'objet placé dans le monde, les informations relatives aux vertex doivent être converties en coordonnées d'espace du monde.
- Il gère l'ombrage et la coloration des vertex : le shader de vertex gère le lissage des vertex ainsi que les données de colorisation des vertex dans l'objet lui-même.
- Il peut appliquer des décalages supplémentaires aux positions des vertex : Le shader de vertex permet de décaler la position de n'importe quel vertex à l'écran afin d'obtenir des effets précis. Cela s'effectue via le matériau de l'objet et s'appelle décalage de position dans le monde.
Passe de profondeur
Avant d'effectuer le rendu des objets individuels, l'Unreal Engine effectue une passe de profondeur, ou passe Z anticipée, pour déterminer l'emplacement des objets les uns par rapport aux autres. Cela permet d'éviter que l'Unreal Engine effectue plusieurs fois le rendu des mêmes pixels à l'écran. Ce phénomène est appelé suraffichage et peut avoir un impact significatif sur les performances. Le moteur tente de l'éviter autant que possible.
Appels de rendu
Après la passe de profondeur, le GPU effectue le rendu de chaque objet en générant tous les polygones qui partagent les mêmes propriétés en même temps, comme les maillages et les matériaux. Ce processus est un appel de rendu.
Tous les polygones d'un objet auxquels est attribué le même matériau sont considérés comme le même appel de rendu. Cependant, chaque matériau nécessite son propre appel de rendu. Par exemple, chaque objet à l'écran nécessite au minimum un appel de rendu, mais il peut y en avoir davantage en fonction du nombre de matériaux assignés à un objet.
La géométrie virtualisée Nanite de l'Unreal Engine effectue simultanément le rendu de tous les polygones de tous les objets avec un matériau donné. Les budgets d'images ne sont plus limités par les polycounts, les appels de rendu ou l'utilisation de la mémoire du maillage.
Équivalent Unity
Le pipeline de rendu de Unity exécute des étapes similaires en effectuant une passe de profondeur et en utilisant des appels de rendu pour générer les objets de la scène.
Rastérisation et tampon de géométrie

Le processus de rastérisation convertit les données de vertex 3D en données de pixel 2D affichées à l'écran. Ce processus commence après que le shader de vertex a traité toutes ses données.
Le tampon de géométrie (GBuffer) de l'Unreal Engine comprend une série d'images qui stockent des informations sur la géométrie de la scène. Ces images comprennent généralement des données comme des informations d'éclairage pour :couleur de base, normale du monde, métallique, rugosité et spéculaire dans la scène. Ces images, dans le tampon de géométrie, sont composées pour former l'image finale que vous voyez à l'écran.
Le processus de conversion de ces images composées se produit pour chaque image rendue et pour chaque appel de rendu où les données de vertex sont converties en données de pixel et génèrent les parties correctes des images dans le tampon de géométrie.
Équivalent Unity
Le chemin de rendu différé de Unity utilise également un tampon de géométrie pour stocker des informations critiques sur la scène. Dans le cas de Unity, le tampon de géométrie stocke des informations semblables sur la scène (référencées par des noms différents) : albédo, spéculaire, normale, et informations d'émission/éclairage pour les objets.
Rendu des textures

L'Unreal Engine effectue le rendu des textures en utilisant le [chargement dynamique de textures] (designing-visuals-rendering-and-graphics/rendering-optimization/textures-streaming/Overview) afin d'optimiser le chargement des textures dans la scène. Le système de chargement dynamique des textures fait appel à des mipmaps de texture, c'est-à-dire une séquence précalculée d'images de la même texture à différentes résolutions. Il s'agit en quelque sorte de niveaux de détail (LOD) pour les textures au lieu des maillages. Le moteur crée automatiquement ces mipmaps dans lesquelles la résolution de chaque image est égale à la moitié de la précédente.
L'Unreal Engine charge la mipmap de la texture pendant le jeu en fonction de la distance par rapport à la caméra. Cette opération s'effectue automatiquement pour optimiser la bande passante et la consommation de mémoire, ainsi que pour réduire le bruit à distance de la caméra.
La taille des textures doit être une puissance de 2 pour recevoir des mipmaps. Les tailles de texture les plus courantes sont 3840 x 2160 pixels (4K) et 1920 x 1080 pixels (HD). Notez que les textures ne sont pas tenues d'avoir un ratio spécifique, une texture de 1920 x 480 pixels recevra également des mipmaps.
Équivalent Unity
Le système de chargement dynamique des mipmaps de Unity utilise les mipmaps de texture pour charger ses textures au moment de l'exécution. Comme dans l'Unreal Engine, ce système charge automatiquement la mipmap de texture appropriée en fonction de la distance et de l'angle par rapport à la caméra.
Shaders de pixels et matériaux

Une fois les objets entièrement rendus dans le tampon de géométrie, l'Unreal Engine commence l'ombrage de chaque objet à l'écran en utilisant les propriétés matérielles de chaque objet avec le shader de pixels.
Un shader de pixels effectue une série de calculs pour modifier la couleur d'un pixel à l'écran. Les shaders de pixels s'exécutent sur le GPU et sont extrêmement efficaces. Ils gèrent le système de matériau de l'Unreal Engine et sont utilisés pour calculer l'éclairage, le brouillard, les reflets et les effets de post-traitement.
Le système de matériau utilise des modèles de shaders en langage de shaders de haut niveau (HLSL), ainsi que l'éditeur de matériau pour créer les matériaux finaux appliqués aux objets à l'écran. Ces matériaux peuvent utiliser des paramètres, tels que des textures, pour définir l'aspect de chaque objet.
Équivalent Unity
Unity est livré avec plusieurs shaders intégrés (équivalents des matériaux dans l'Unreal Engine) ainsi qu'avec son Shader Graph pour créer des shaders dans votre projet. L'éditeur de matériau de l'Unreal Engine est l'équivalent du Shader Graph de Unity.
Reflets

Après avoir fait l'ombrage de tous les objets de la scène, l'Unreal Engine commence à effectuer le rendu des reflets des objets en fonction de leurs propriétés de matériau.
L'Unreal Engine utilise quatre systèmes pour effectuer le rendu des reflets de la scène. Ces systèmes sont exécutés dans l'ordre suivant :
- Captures de reflets : précalculés et stockés dans une texture cubique statique, à un endroit précis.
- Reflets planaires : capture les reflets depuis et vers un plan.
- Reflets espace écran (SSR) : utilise les informations disponibles à l'écran pour générer des reflets précis d'objets en temps réel.
- Reflets Lumen : résoudre les reflets pour l'ensemble des valeurs de rugosité de la scène. Ces reflets prennent en charge la lumière naturelle, les matériaux de couche transparente, la translucidité et même les matériaux d'eau à couche unique.
L'Unreal Engine mélange les trois méthodes, en donnant la priorité aux reflets espace écran, puis en revenant aux réflexions planaires, et enfin en revenant aux captures de reflets. Le résultat final est combiné avec les images de rugosité, spéculaires et métalliques dans le tampon de géométrie.
Si vous utilisez l'éclairage-global Lumen, les reflets Lumen seront utilisés automatiquement. Cependant, vous pouvez également utiliser les reflets Lumen sans Lumen GI, auquel cas l'Unreal Engine utilisera l'éclairage précalculé avec les reflets Lumen.
Équivalent Unity
Les Reflection Probes de Unity offrent une fonctionnalité similaire et sont utilisées pour précalculer les données de reflets de votre scène.
Éclairage statique et ombres

Après le rendu des reflets, l'Unreal Engine effectue le rendu de l'éclairage statique et des ombres pour tous les objets de la scène.
L'Unreal Engine utilise son système d'éclairage-global Lightmass pour précalculer les informations relatives à l'éclairage de la scène. Les informations relatives à l'éclairage et aux ombres sont stockées dans une [texture de lumière UV] (working-with-content/static-meshes/lightmapping) et cette texture est mélangée à la couleur de base de l'objet lors du rendu de l'objet dans la scène.
Ce système est très rapide, mais il nécessite plus de mémoire et doit être précalculé à chaque modification de la scène.
Le système d'éclairage global Lightmass est une bonne solution pour les projets pour appareils mobiles et de faible puissance.
Équivalent Unity
Le Progressive Lightmapper et les systèmes Enlighten Baked Global Illumination de Unity offrent des fonctionnalités semblables lors du précalcul de l'éclairage de votre scène.
Éclairage et ombres dynamiques

Après le rendu de l'éclairage statique, l'Unreal Engine effectue le rendu dynamique de l'éclairage et des ombres (en temps réel) avec Lumen, son système d'éclairage global dynamique.
Lumen est un système d'éclairage et de reflet entièrement dynamique, conçu pour les consoles de nouvelle génération et les PC haut de gamme. Le système utilise plusieurs méthodes de ray tracing pour résoudre l'éclairage global et les reflets à l'échelle.
Lumen offre des rebonds diffus infinis et fonctionne de concert avec la [géométrie virtualisée Nanite] (designing-visuals-rendering-and-graphics/rendering-optimization/nanite). En outre, le système fonctionne conjointement avec les [textures d'ombres virtuelles] (building-virtual-worlds/lighting-and-shadows/shadows/virtual-shadow-maps) pour créer des ombres douces en haute résolution et en temps réel.
Lumen propose des reflets Lumen qui calculent les reflets pour l'ensemble des valeurs de rugosité de la scène. Ces reflets prennent en charge la lumière naturelle, les matériaux de couche transparente, la translucidité et même les matériaux d'eau à couche unique.
Lumen remplace les reflets espace écran lorsqu'ils sont utilisés dans la scène.
Équivalent Unity
Unity utilise Enlighten Realtime Global Illumination pour assurer un éclairage dynamique de la scène. Ce système fournit un éclairage global en temps réel en utilisant des informations de visibilité précalculées ainsi que des textures de lumière pour calculer le rebond de la lumière indirecte au moment de l'exécution.
Cela diffère de Lumen, car Lumen n'a pas besoin de données précalculées pour fournir des rebonds lumineux indirects.
Brouillard et transparence

Après le rendu de l'éclairage dynamique et des ombres, l'Unreal Engine effectue le rendu des effets de brouillard et de transparence.
L'Unreal Engine effectue le rendu des effets de brouillard avec son système de brouillard de hauteur exponentielle, qui effectue le rendu de la densité du brouillard en fonction de la hauteur et de la distance par rapport à la caméra. En outre, le système peut générer du brouillard volumétrique.
Les objets transparents utilisent un matériau translucide et sont rendus à ce stade du processus. Lors de l'utilisation du chemin de rendu différé, l'Unreal Engine utilise les informations disponibles dans le tampon de géométrie pour effectuer le rendu de la transparence. Vous pouvez également configurer le matériau pour qu'il utilise le chemin de rendu direct afin de produire un effet de transparence plus précis.
Équivalent Unity
Unity prend en charge le brouillard linéaire, exponentiel, et à carré exponentiel dans la scène.
Effets de post-traitement

Une fois le brouillard et la transparence rendus, l'Unreal Engine peut appliquer des effets supplémentaires à l'image. Ces effets sont les effets de post-traitement, car ils sont appliqués après le traitement de l'image finale. Les effets s'appuient sur le shader de pixels et utilisent les informations disponibles dans le tampon de géométrie.
Parmi les effets de post-traitement les plus courants figurent le flou lumineux, la profondeur de champ, les puits de lumière, le mappage de ton et le flou de mouvement.
Dans le cadre de cette étape de post-traitement, l'Unreal Engine peut appliquer la super résolution temporelle (TSR). La TSR est un upscaler temporel multi-plateforme utilisé par l'Unreal Engine pour le rendu de superbes images 4K. Les images sont fournies à une fraction du coût en amortissant certains des calculs de rendu coûteux sur plusieurs images.
Dans la chaîne de rendu, la super résolution temporelle intervient après la profondeur de champ, et tout ce qui suit est upscalé : le flou de mouvement, le flou lumineux, etc.

Une fois ces effets appliqués au tampon de géométrie, l'Unreal Engine effectue le rendu de l'image finale à l'écran.
Les étapes décrites ci-dessus génèrent une image unique à l'écran. Ces étapes sont souvent répétées entre 30 et 60 fois par seconde, en fonction de la fréquence d'images cibles du jeu.
Équivalent Unity
Unity propose des solutions de post-traitement basées sur le pipeline de rendu choisi. La plupart des effets disponibles sont similaires à ceux de l'Unreal Engine.
Unity 6 est également doté du Spatial-Temporal Post-processing (STP), un logiciel natif de modification d'échelle qui utilise des techniques de suréchantillonnage spatial et temporel pour produire une image anticrénelée de haute qualité.
Vue d'ensemble des fonctionnalités de rendu dans l'Unreal Engine
Maintenant que vous comprenez les étapes que suit l'Unreal Engine pour effectuer le rendu d'une image à l'écran, vous êtes en mesure d'en apprendre davantage sur les fonctionnalités de rendu spécifiques fournies avec le moteur.
Pour en savoir plus sur les fonctionnalités de rendu de l'Unreal Engine, lisez le document Éclairer l'environnement.