Post

đŸ–„ïž Unreal Engine 5 : Tout savoir sur Nanite

đŸ–„ïž Unreal Engine 5 : Tout savoir sur Nanite

UNREAL ENGINE 5 : Nanite et l’alternative SSDM

#Dev #3D #Unreal #Analysis


1. Nanite, c’est quoi ?

1.1 Description vulgarisée

Imagine que tu as une boĂźte de Lego magique. Jusqu’ici, pour que ton jeu tourne bien, tu devais construire tes chĂąteaux avec de grosses briques grossiĂšres dĂšs que le joueur s’éloignait, et ne sortir les petites briques dĂ©taillĂ©es que s’il collait son nez au mur. C’est le principe du LOD (Level of Detail).

Avec Nanite, tu jettes la boĂźte par terre, le moteur gĂšre tout tout seul et tu gardes juste ton chĂąteau hyper dĂ©taillĂ© en micro-briques. Tu peux importer un modĂšle avec des millions de polygones (scannĂ© dans la vraie vie ou sculptĂ© en high-poly), et Nanite va adapter la complexitĂ© gĂ©omĂ©trique de l’objet en temps rĂ©el, selon sa distance Ă  la camĂ©ra.


1.2 Pourquoi avoir développé Nanite ?

  • S’imposer au-delĂ  du jeu vidĂ©o (CinĂ©ma et Production Virtuelle) : Epic Games ne vise plus seulement le marchĂ© des gamers. Avec l’UE5, l’objectif est de faire du moteur la plateforme 3D universelle pour le cinĂ©ma, les sĂ©ries (comme les tournages sur Ă©crans LED Volume type The Mandalorian) et l’architecture. Pour sĂ©duire Hollywood, il fallait briser le plafond de verre des concessions graphiques propres au jeu vidĂ©o. Nanite a Ă©tĂ© pensĂ© pour offrir une qualitĂ© “cinĂ©ma en temps rĂ©el”, permettant d’importer des assets bruts sans se soucier des contraintes de performance initiales.
  • Le pivot vers un moteur de production globale : Cette stratĂ©gie engendre une ironie partagĂ©e par beaucoup de dĂ©veloppeurs : l’UE5 est parfois perçu comme un logiciel de production cinĂ©matographique qui, par extension, est capable de sortir des jeux. Ce n’est plus “juste” le moteur 3D de jeu vidĂ©o qu’il Ă©tait. Nanite incarne cette philosophie en privilĂ©giant le “zĂ©ro friction” artistique et rĂ©duction des coĂ»ts plutĂŽt que le souci de la performance et de l’optimisation propre au domaine du jeu vidĂ©o.
  • La promesse d’une facilitĂ© d’accĂšs universelle : L’industrie du JV passait une part immense de son temps et de son budget sur des tĂąches d’optimisation purement techniques (retopologie, crĂ©ation de LODs, baking). On parle de 30% environ. En automatisant tout cela via Nanite, Epic dĂ©mocratise la crĂ©ation d’environnements ultra-rĂ©alistes rapidement et beaucoup moins cher : n’importe quel petit studio ou crĂ©ateur solo peut “jeter” des assets Quixel high-poly ou des scans 3D dans sa scĂšne et obtenir un visuel convaincant instantanĂ©ment, sans avoir besoin d’une armĂ©e de graphistes ou d’ingĂ©nieurs pour le soutenir.
  • Le look “Next-Gen” standardisĂ© : Pour imposer son moteur comme la rĂ©fĂ©rence absolue de la gĂ©nĂ©ration PS5 / Xbox Series / PC modernes, Epic avait besoin d’une vitrine technologique qui marque une rupture visuelle nette avec l’UE4. Nanite s’inscrit avec Lumen dans cette logique de rupture, et force indirectement toute l’industrie Ă  s’aligner sur les standards graphiques d’Epic et in fine Ă  adopter son moteur devant l’énorme travail Ă  fournir pour atteindre ce niveau d’exigence visuelle.

1.3 Description technique - Fonctionnement interne

Techniquement, Nanite est un systĂšme de gĂ©omĂ©trie virtualisĂ©e. Lors de l’import d’un mesh, le systĂšme va analyser le modĂšle et le dĂ©couper en clusters (des petits groupes de triangles, gĂ©nĂ©ralement 128 triangles par cluster).

Au lieu de passer par le pipeline graphique traditionnel du GPU (qui galĂšre quand les triangles deviennent plus petits qu’un pixel), Nanite utilise son propre gĂ©nĂ©rateur de rendu logiciel (Software Rasterizer) ultra-rapide via des Compute Shaders, et ne bascule sur le rendu matĂ©riel classique que pour les gros triangles proches. Il construit un arbre hiĂ©rarchique de ces clusters pour charger instantanĂ©ment le niveau de dĂ©tail parfait pour chaque pixel de l’écran.

Pour comprendre la rupture technologique que reprĂ©sente Nanite, il faut d’abord identifier le goulot d’étranglement (bottleneck) du pipeline graphique traditionnel. Classiquement, le processeur (CPU) doit envoyer des ordres de dessin (Draw Calls) Ă  la carte graphique (GPU) pour chaque objet ou variations de l’objet (LOD). Si une scĂšne contient trop d’objets ou des gĂ©omĂ©tries extrĂȘmement denses, le CPU sature et ne suit plus le rythme. De plus, les architectures GPU actuelles gĂšrent trĂšs mal les triangles trop petits et notamment ceux dont la taille est Ă©gale ou infĂ©rieure Ă  celle d’un pixel Ă  l’écran, ce qui engendre un gaspillage massif de ressources de calcul (sub-pixel shading).

Nanite contourne cette limite historique en appliquant Ă  la gĂ©omĂ©trie le concept de virtualisation, une approche philosophiquement proche du fonctionnement des voxels ou des textures virtuelles (MegaTextures), oĂč la gĂ©omĂ©trie est traitĂ©e comme un flux continu de donnĂ©es dynamiques plutĂŽt que comme une liste d’objets statiques.

  • La structure en Clusters : Lors de l’importation d’un mesh, Nanite segmente la gĂ©omĂ©trie en sous-ensembles rigides appelĂ©s clusters, contenant chacun un groupe fixe de 128 triangles. Ces clusters sont ensuite organisĂ©s au sein d’une structure hiĂ©rarchique en arbre (un graphe orientĂ© acyclique, ou DAG). C’est ce cluster, et non plus le triangle individuel ou l’objet complet, qui devient la primitive de base du moteur.
  • Le double pipeline de rendu (Software vs Hardware) : Au lieu d’envoyer ces millions de triangles dans le pipeline de rastĂ©risation classique du GPU, Unreal Engine 5 utilise un systĂšme hybride pilotĂ© par des Compute Shaders :
    • RastĂ©risation Logicielle (Software Rasterizer) : Lorsque les triangles d’un cluster sont plus petits qu’un pixel Ă  l’écran (objets lointains ou micro-dĂ©tails), Nanite court-circuite le pipeline matĂ©riel standard. Un Compute Shader optimisĂ© prend le relais pour dessiner mathĂ©matiquement les clusters directement dans un tampon de visibilitĂ© (Visibility Buffer). Cela permet de traiter des milliers de clusters en un minimum d’appels, sans surcharger le GPU.
    • RastĂ©risation MatĂ©rielle (Hardware Rasterizer) : DĂšs que le joueur s’approche d’un objet et que ses triangles deviennent plus grands, Nanite bascule automatiquement et de maniĂšre transparente vers les unitĂ©s de calcul matĂ©rielles classiques de la carte graphique, qui redeviennent alors plus efficaces.

En rĂ©sumĂ© : Nanite s’affranchit du concept traditionnel de “un objet = un draw call”. Le moteur analyse globalement la scĂšne Ă  l’écran, dĂ©termine prĂ©cisĂ©ment quels clusters de 128 triangles sont visibles Ă  la granularitĂ© du pixel, et les distribue dynamiquement dans le pipeline de rendu le plus adaptĂ©. Le niveau de dĂ©tail s’ajuste ainsi de maniĂšre continue, sans paliers visibles pour l’utilisateur.


1.4 Avantages pour le jeu, les graphistes et les devs

  • Pour les graphistes (Artistes 3D) : C’est la libertĂ© absolue. Plus besoin de passer des heures Ă  faire de la “retopologie” (allĂ©ger un modĂšle lourd), plus besoin de gĂ©nĂ©rer 5 versions LOD diffĂ©rentes d’un mĂȘme arbre, et fini le baking complexe de Normal Maps pour feinter le dĂ©tail. Tu balances ton modĂšle High-Poly de ZBrush ou Quixel directement dans le moteur.
  • Pour les devs : Gain de temps colossal sur l’optimisation de la gĂ©omĂ©trie et la gestion de la mĂ©moire streaming. Fini les budgets de polygones stricts par scĂšne.
  • Pour le jeu : Une fidĂ©litĂ© visuelle inĂ©galĂ©e et une distance d’affichage thĂ©oriquement infinie. Nanite supprime par nature le phĂ©nomĂšne de “pop-in” (qui, sur les systĂšmes classiques, dĂ©coule souvent d’une mauvaise implĂ©mentation ou d’une machine Ă  la peine) ou de clipping sur la distance puisque la gĂ©omĂ©trie s’adapte dĂ©sormais de maniĂšre totalement continue et invisible au pixel prĂšs.

1.5 Inconvénients pour le jeu et les performances

  • Un gouffre Ă  calcul : Nanite n’est absolument pas gratuit. Faire tourner des Compute Shaders en continu pour trier et rastĂ©riser des millions de clusters Ă  la volĂ©e est bien plus lourd pour le GPU qu’un systĂšme de LOD classique (oĂč la carte graphique se contente de dessiner des meshes dĂ©jĂ  simplifiĂ©s).
  • L’overdraw gĂ©nĂ©ralisĂ© : L’overdraw, c’est quand le GPU doit calculer plusieurs fois le mĂȘme pixel Ă  l’écran parce que des couches de gĂ©omĂ©trie se superposent. Avec des clusters de triangles trĂšs petits imbriquĂ©s, l’overdraw explose et le GPU sature complĂštement Ă  essayer de deviner ce qui est visible ou non et doit Ă©crire plusieurs fois le mĂȘme pixel.
  • L’effet domino des dĂ©pendances : Activer Nanite t’oblige Ă  utiliser les autres technos “Next-Gen” de l’UE5. Le meilleur exemple, c’est les VSM (Virtual Shadow Maps). Les ombres classiques ne fonctionnent pas avec la gĂ©omĂ©trie Nanite. ProblĂšme : les VSM coĂ»tent une blinde en performance et viennent plomber encore le framerate, simplement parce que tu as activĂ© Nanite. De mĂȘme, Epic conseille fortement d’utiliser Lumen avec Nanite, ce qui ajoute encore une dĂ©pendance trĂšs coĂ»teuse en ressources.
  • L’explosion du stockage et de la VRAM : MĂȘme compressĂ©s, des modĂšles Ă  plusieurs millions de polygones pĂšsent lourd sur le disque dur (les jeux dĂ©passent vite les 100 Go) et demandent un streaming ultra-rapide depuis un SSD NVMe.
  • Pas adaptĂ© Ă  tout le monde : Nanite tolĂšre encore assez mal la transparence, le feuillage dense (Ă  cause de l’overdraw) et la dĂ©formation de gĂ©omĂ©trie (les personnages qui bougent). L’utiliser sur ce type d’assets demande des concessions ou des bidouilles d’optimisation complexes.
  • Des plateformes restreintes : Nanite est gourmand, que ce soit intrinsĂšquement ou via ses dĂ©pendances. Utiliser Nanite sur son projet UE5, c’est limiter les plateformes supportĂ©es. Seuls le PC, la PlayStation 5 et les Xbox Series X/S sont supportĂ©s de maniĂšre stable. Les consoles de la gĂ©nĂ©ration prĂ©cĂ©dente (comme la PS4) ont un support expĂ©rimental peu convaincant. Pour toutes les autres plateformes (mobiles, Android, casques VR, etc.), l’export est impossible et elles ne peuvent pas en profiter.

2. Plus en détails

2.1 La “maladie” de Nanite : l’overdraw

L’overdraw (la surimpression), c’est le fait que le GPU doive calculer et Ă©crire plusieurs fois les donnĂ©es pour un mĂȘme pixel Ă  l’écran parce que plusieurs Ă©lĂ©ments se superposent dans l’espace 3D (par exemple, dix feuilles d’arbre transparentes ou des couches de feuillage les unes derriĂšre les autres).

Avec Nanite, le problĂšme change d’échelle et devient une vraie maladie Ă  cause de la nature mĂȘme du systĂšme :

  • La surmultiplication des micro-triangles : Comme Nanite dĂ©coupe tout en micro-clusters, tu te retrouves avec une grosse densitĂ© gĂ©omĂ©trique. Des micro-triangles s’imbriquent et se superposent, et le GPU passe un temps fou Ă  recalculer et réécrire sans arrĂȘt “par-dessus” les mĂȘmes pixels.
  • Le cauchemar des masques d’opacitĂ© (Feuillage et Herbe) : Quand tu utilises des masques d’opacitĂ© (des textures avec de la transparence pour dĂ©couper la forme d’une feuille ou d’un brin d’herbe), Nanite perd son efficacitĂ© Ă  partitionner l’espace. Le moteur doit tester la transparence pixel par pixel Ă  travers des dizaines de couches de micro-gĂ©omĂ©trie.
  • Le verdict du Quad Overdraw : Cette surcharge met instantanĂ©ment Ă  genoux le pipeline. Dans les outils de debug de l’UE5, la vue Quad Overdraw (qui colore la scĂšne du bleu au rouge/blanc selon la gravitĂ© du problĂšme) vire direct au rouge Ă©carlate. Le coĂ»t de calcul explose, le framerate s’effondre, et cela ruine complĂštement les performances de tout le systĂšme.

OĂč est-ce que ça coince ?

À l’échelle des blocs de 128 triangles, Nanite est ultra-efficace. Avant mĂȘme de dessiner quoi que ce soit, le moteur fait un Two-Pass Occlusion Culling (en gros, un double tri) sur le GPU. Il utilise les donnĂ©es de la frame prĂ©cĂ©dente pour construire un Z-Buffer Ă  basse rĂ©solution. Si un cluster est entiĂšrement cachĂ© derriĂšre un mur, il est Ă©jectĂ© direct. À ce niveau-lĂ , le Z-Buffer fait parfaitement son boulot d’exclusion.

Le vrai problÚme se situe au niveau du sub-pixel et des quads de pixels. Une carte graphique ne calcule jamais les pixels un par un. Elle les traite par blocs de 2x2 pixels (un Quad). Pourquoi ? Pour pouvoir calculer les variations de textures (les dérivés) entre les pixels voisins.

C’est de lĂ  que vient le drame du micro-triangle : avec Nanite, si c’est loin et gĂ©omĂ©triquement dense, un triangle va ĂȘtre tellement minuscule qu’il ne va faire qu’un seul pixel Ă  l’écran. Pour dessiner ce pauvre triangle d’un seul pixel, le GPU est obligĂ© d’activer et de calculer le quad entier de 4 pixels contenant ce fameux pixel. Les 3 autres pixels du bloc de calcul sont calculĂ©s puis, purement et simplement, jetĂ©s Ă  la poubelle (Helper Pixels). Et bis repetita pour le pixel Ă  cĂŽtĂ©. Pour calculer le quad complet (si on a des triangles de 1 pixel), on aura calculĂ© 16 pixels en tout, soit 4 fois plus de pixels.

En plus, si on a par exemple 5 couches de feuilles transparentes ou des brins d’herbe les uns derriĂšre les autres sur une zone dense, le Z-Buffer classique ne peut pas exclure les couches de derriĂšre, car la zone est transparente (masques d’opacitĂ©). Le GPU est obligĂ© de lire la texture pour savoir si c’est transparent ou non et ne peut pas trier en amont. Chaque couche va forcer le GPU Ă  lancer des calculs sur des Quads entiers (2x2) pour de simples micro-triangles sur des zones de jeu entiĂšres. Le GPU passe alors son temps Ă  mettre Ă  la poubelle 3 pixels calculĂ©s sur 4 et Ă  devoir calculer 4 fois le mĂȘme quad pour avoir les 4 pixels le composant correctement affichĂ©s.


2.2 Comment faire sans Nanite sans perdre en qualité visuelle ? Le Screen Space Displacement Mapping (SSDM) comme alternative

Pour les studios qui refusent de s’enfermer dans l’écosystĂšme Unreal ou de subir les lourdes contreparties de Nanite (poids des jeux, surconsommation de VRAM, surcoĂ»t des Compute Shaders), il existe une autre voie. L’alternative moderne la plus crĂ©dible pour obtenir une fidĂ©litĂ© graphique “Next-Gen” sans gĂ©omĂ©trie virtualisĂ©e, c’est le SSDM.

  • L’exemple Crimson Desert : Le jeu de Pearl Abyss est une “masterclass” en la matiĂšre. PlutĂŽt que de charger le moteur avec des milliards de polygones, les dĂ©veloppeurs utilisent un pipeline de LODs classique mais appliquent du SSDM sur quasiment tous les objets et surfaces du monde (les rochers, les murs, les sols boueux, les troncs d’arbres). Le rĂ©sultat visuel rivalise avec Nanite, tout en gardant une structure de mesh traditionnelle bien plus lĂ©gĂšre.
  • Le principe technique : Contrairement Ă  l’ancienne tessellation (qui subdivisait de vrais polygones dans le moteur et cassait les performances), le SSDM est une technique de rendu de surface basĂ©e sur l’écran (Screen Space). Le moteur utilise des textures de hauteur (Heightmaps) et calcule le relief et l’éclairage directement au moment du rendu des pixels.

Les limites et points négatifs du SSDM :

Malgré ses avantages en termes de stockage et de streaming, le SSDM traßne plusieurs casseroles techniques importantes :

  • La dĂ©pendance Ă  l’espace Ă©cran (Screen Space) : Comme son nom l’indique, le calcul se fait uniquement sur ce qui est visible Ă  l’écran. Si une surface texturĂ©e sort du cadre ou est masquĂ©e par un premier plan, le moteur n’a plus les donnĂ©es nĂ©cessaires. Cela peut provoquer des coupures nettes du relief ou des dĂ©formations invisibles hors champ. De mĂȘme, le relief a tendance Ă  “baver” ou Ă  s’étirer bizarrement sur les bords extrĂȘmes de l’écran Ă  cause de la distorsion de la camĂ©ra (perspective).
  • Contraintes artistiques et aspect “dĂ©lavĂ©â€ : Le systĂšme demande des Heightmaps ultra-dĂ©taillĂ©es pour fonctionner proprement. En contrepartie, les artistes sont obligĂ©s d’utiliser des textures d’Albedo (la couleur de base) relativement neutres et peu contrastĂ©es. Si l’Albedo contient trop de fausses ombres ou de contrastes forts, cela court-circuite l’effet de relief calculĂ© par le SSDM. C’est exactement ce qui donne cet aspect un peu “dĂ©lavĂ©â€ ou “terne” aux surfaces de Crimson Desert sous certains angles.
  • Une illusion purement visuelle : Physiquement, la surface reste dĂ©sespĂ©rĂ©ment plate. Si un personnage marche sur un sol en pavĂ©s magnifiquement bombĂ© en SSDM, ses pieds vont flotter ou s’enfoncer de maniĂšre linĂ©aire. La physique du jeu (collisions, dĂ©bris, interactions) traite l’objet comme un cube ou un plan lisse, ce qui peut briser l’immersion.
  • Le problĂšme des silhouettes : C’est le talon d’Achille de la technique. Si tu regardes un mur ou un rocher de face, le relief est bluffant. Si tu te dĂ©cales pour aligner le bord de l’objet avec l’arriĂšre-plan (vue de silhouette), le contour redevient parfaitement rectiligne et plat, trahissant immĂ©diatement l’illusion.
  • Artefacts de mouvement (Ghosting) : Lors des mouvements de camĂ©ra ultra-rapides, le calcul du Screen Space peut accuser un lĂ©ger retard d’une image Ă  l’autre, ce qui crĂ©e parfois du flou, du scintillement ou des traĂźnĂ©es visuelles indĂ©sirables sur les micro-reliefs.

Ce qui conclut cet article, en espĂ©rant que vous en savez un peu plus sur le sujet, je vous dis Ă  la prochaine ! 😉

This post is licensed under CC BY 4.0 by the author.