đ„ïž 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 ! đ
