Végétation Nanite est un ensemble de systèmes intégrés qui utilisent le rendu de géométrie virtualisée de Nanite pour générer une végétation dense et très détaillée à l'échelle. Végétation Nanite associe d'anciennes et de nouvelles techniques pour rendre des mondes ouverts avec de vastes panoramiques de meilleure qualité à un coût nettement inférieur à celui des images d'origine, grâce à l'instanciation, aux maillages surfacés, à la voxélisation, à l'animation et aux caractéristiques du matériau. La combinaison de ces éléments permet d'imaginer des mondes plus complexes avec des végétations animées et réalistes.
Pour appréhender les objectifs de l'outil Végétation Nanite et les perspectives qu'il propose, il est essentiel de comprendre que les méthodes qui ont fonctionné par le passé ne sont plus efficaces pour créer ce type de mondes élaborés.
Voyons pourquoi l'"ancienne méthode" de développement de végétation ne fonctionne pas bien pour Végétation Nanite :
Masquage alpha | Représentation de triangle 100 % Nanite | Matériau de décalage de position dans le monde (WPO) |
Masquage alpha : Nanite ne fonctionne pas correctement avec cette méthode, car celle-ci implique un suraffichage excessif et nécessite l'exécution d'une fonction de masque probablement coûteuse. L'utilisation du masquage alpha implique également un rendu de la végétation sous forme de cartes planes plutôt que de refléter la complexité géométrique dont elle est capable.
Représentation de triangle 100 % Nanite : cette méthode entraîne une élimination sous-optimale des clusters et une simplification insuffisante de la distance. En outre, le stockage de chaque type de végétation implique un espace disque important.
Décalage de position dans le monde (WPO) : l'utilisation de cette méthode dans un matériau pour déplacer les feuilles et les branches de la végétation était un moyen de simuler le vent. Cette méthode ne correspond pas tout à fait à ce que Nanite peut rendre, car elle ajoute des calculs par vertex et impose des limites de cluster sous-optimales ; il n'existe en effet aucun moyen de savoir comment un matériau va déplacer un vertex, ce qui implique des calculs plus conventionnels.
Maintenant que vous connaissez les méthodes qui ne sont pas tout à fait adaptées, voyons comment utiliser le pipeline Végétation Nanite pour rendre des arbres entièrement modélisés, jusqu'aux feuilles et aux aiguilles individuelles. Le pipeline doit pouvoir s'adapter à de vastes mondes ouverts tout en étant efficace en termes de mémoire, performant et hautement dynamique, sans nécessiter de maillages de niveau de détail (LOD).
Pour ce faire, Végétation Nanite repose sur trois systèmes :
Les assemblages Nanite sont les "composants" convertis en instances hautement détaillées sur un élément de végétation. Ils peuvent considérablement réduire la taille du disque et de la mémoire.
Les voxels Nanite sont des voxels agrégés proches de la taille d'un pixel qui conservent les détails des triangles, les animations et les propriétés des matériaux en fonction de la distance de la caméra. Les triangles sont facilement convertis en voxels afin de résoudre le problème du rendu des maillages triangulaires agrégés denses et dynamiques. Ces voxels sont imperceptibles à l'œil nu en raison de leur taille à l'écran.
Le surfaçage Nanite définit le comportement dynamique de la végétation avec des systèmes tels que le vent, où le vent est simulé par le biais d'une hiérarchie d'os. En n'ayant pas recours à WPO pour simuler l'animation du vent, Végétation Nanite peut utiliser des limites de cluster optimales.
L'exemple ci-dessous illustre la façon dont tous ces éléments fonctionnent ensemble. Lorsque la caméra effectue un zoom avant sur les détails, vous observez à quel point l'arbre est dense et détaillé, jusqu'aux aiguilles de pin individuelles. À mesure que la caméra s'éloigne, dès que les clusters Nanite sont suffisamment petits, ils se transforment progressivement en voxels. Cela permet aux arbres de conserver leur aspect volumétrique à distance sans avoir recours à des panneaux d'affichage ou à des niveaux de détail (LOD) au loin.
Cet arbre dispose des éléments suivants :
41 millions de triangles
12 parties d'assemblage uniques
2 160 instances de parties d'assemblage
850 os de squelette
Activer Végétation Nanite
Pour activer Végétation Nanite dans votre projet, accédez à Paramètres du projet > Rendu, puis cochez la case Végétation Nanite. Vous devez redémarrer l'éditeur pour que les modifications prennent effet.
Assemblages Nanite
Les assemblages Nanite sont un composant clé du système Végétation Nanite. Ils sont conçus pour gérer efficacement le rendu de géométries complexes et reproductibles, comme les branches ou les frondes d'un arbre. Les assemblages fonctionnent à la fois avec des ressources statiques et des maillages squelettiques, ce qui permet la "micro-instanciation" de petites parties très détaillées. Ils peuvent contenir jusqu'à 65 000 instances d'autres maillages. Ces instances sont appelées les "parties" de l'assemblage. Cette approche permet de réaliser des économies significatives en termes d'espace disque et d'espace de chargement dynamique, bien qu'une légère dégradation des performances se produise lors de l'élimination des clusters.
Les assemblages Nanite sélectionnent les clusters des maillages des parties et les codent dans la hiérarchie du maillage final sans dupliquer la géométrie des parties au moment de la création. Au moment de l'exécution, Nanite gère les instances de parties en calculant leur transformation finale à la demande pendant l'élimination du cluster à mesure qu'il descend dans la hiérarchie.
Sur les plateformes non-Nanite, les triangles des parties sont transformés et fusionnés en un maillage unique. Celui-ci est alors simplifié pour générer un maillage de rechange qui fonctionne de la même manière que les maillages de rechange Nanite classiques.
Les assemblages sont un élément essentiel du système Végétation Nanite. Sans eux, l'espace disque ou la mémoire de chargement dynamique seraient insuffisants pour rendre une forêt de grande taille, telle que celle présentée dans la démonstration technique Unreal Fest The Witcher 4. Par exemple, l'espace disque UASSET du plus grand arbre de la démonstration est passé de 3,5 gigaoctets (Go) à environ 29 mégaoctets (Mo). La mémoire de chargement dynamique d'un seul arbre dans une vue donnée a été réduite (d'environ 36 Mo à 2,7 Mo). Ce type d'économie permet de rendre 500 000 instances de dizaines de variantes d'arbres dans une scène ; chaque arbre y est très détaillé et comporte entre un et dix millions de polygones chacun.
Pour en savoir plus sur l'utilisation et la création d'assemblages dans l'Unreal Engine, consultez la page Assemblages Nanite.
Voxels Nanite
Les Voxels Nanite sont des voxels de taille proche du pixel qui préservent les détails, les animations et les propriétés de matériau de la géométrie qu'ils représentent, ainsi que l'apparence volumétrique de certains éléments, comme les feuilles sur les arbres. Les techniques Nanite précédentes visant à empêcher les feuilles de perdre leur forme au loin fonctionnaient correctement en rajoutant une surface aux triangles restants lorsque le processus de simplification les éliminait. L'objectif de cette mesure était d'atténuer la raréfaction de la géométrie de la végétation lors du rendu de clusters simplifiés à distance.
Processus de rastérisation
Les voxels Nanite peuvent conserver la silhouette générale de la géométrie agrégée (parties déconnectées) lors de la simplification à distance. Lors de la simplification des clusters de ces maillages voxelisés, le générateur Nanite les voxelise en clusters de 128 blocs voxel 4x4x4 au maximum. L'erreur de simplification de la représentation des voxels est le facteur déterminant pour savoir si la simplification convertit les triangles en voxels (c'est le cas notamment si cette procédure entraîne une erreur inférieure à celle obtenue avec les triangles).
Au moment de l'exécution, les clusters de voxels sont segmentés séparément des clusters de triangles et rastérisés à l'aide d'une permutation de shader spéciale. Les clusters sont classés par compartiments de profondeur et rastérisés de l'avant vers l'arrière afin de bénéficier des avantages du test Z précoce, le résultat final étant généralement plus performant au loin que les triangles rastérisés.
Vous trouverez ci-dessous quelques exemples du processus de voxélisation visualisé sur une ressource autonome et dans la démonstration technique de The Witcher 4.
Processus d'ombrage
De nombreuses surfaces dotées de normales différentes peuvent être contenues dans la région couverte par un seul voxel. Ainsi, au lieu de stocker une seule normale par voxel, c'est une distribution de normales qui est enregistrée. Cette approche est similaire à la manière dont la rugosité du matériau contrôle la distribution des microfacettes utilisées pour l'ombrage.
Lors de l'écriture sur le tampon graphique, une normale est sélectionnée de manière aléatoire pour chaque pixel à partir de cette distribution. Dans une prochaine version, la distribution sera prise en compte directement dans l'ombrage, tout comme la rugosité. Cette fonction, qui permet de réduire le bruit, était déjà utilisée dans la démonstration de Witcher 4.
Ce processus nécessite des données supplémentaires pour stocker les statistiques relatives à la distribution. Actuellement, ces statistiques sont stockées dans le canal alpha de la colorisation des vertex ; autrement dit, elles remplacent toutes les statistiques qui s'y trouvaient auparavant. À l'avenir, elles pourraient être transférées vers des données distinctes, indépendantes de la colorisation des vertex.
Activer les voxels Nanite
Pour activer la voxélisation Nanite :
Dans le panneau Détails d'un maillage statique, accédez à la catégorie Paramètres Nanite.
Recherchez Préservation de forme et utilisez le menu déroulant pour sélectionner Voxéliser.
Certaines des propriétés de ce menu déroulant peuvent être modifiées lorsque vous sélectionnez Voxéliser. Ces propriétés sont réservées à certains projets spécifiques. Certaines sont en cours de développement et ne fonctionnent pas encore comme prévu. Ces paramètres sont susceptibles d'être modifiés ou supprimés dans les prochaines versions de l'Unreal Engine à mesure que le système Végétation Nanite évoluera.
Utiliser le surfaçage Nanite pour l'animation de la végétation Nanite
L'animation de la végétation sous l'action du vent dans les jeux est souvent réalisée en utilisant le décalage de position dans le monde (WPO) dans le matériau, généralement pour les matériaux utilisés pour les branches et les feuilles des arbres. Étant donné que le WPO d'un vertex donné peut être un décalage arbitraire, les artistes doivent définir l'option Déplacement de WPO max. sur n'importe quel matériau pour le pire des cas afin de faciliter le remplissage des limites d'élimination pour une élimination correcte de ces ressources de végétation. Cependant, cela peut entraîner des limites trop prudentes qui contribuent à des coûts de suraffichage élevés.
Dans la mesure où le WPO modifie également la logique du shader de vertex, chaque matériau est segmenté dans des répartitions distinctes, ce qui entraîne des coûts de GPU. Si de nombreux matériaux sont utilisés, ces bacs de rastérisation peuvent entraîner des problèmes de performances.
Le surfaçage Nanite permet de résoudre ce problème, en calculant des limites plus précises à partir des matrices de surfaçage et en appliquant le rastériseur à fonction fixe sur tous les éléments.
Dans l'image ci-dessous, cent mille os sont mis à jour, ce qui prend environ 0,1 milliseconde sur le GPU, rendant le système Végétation Nanite extrêmement rapide et évolutif. L'animation n'est plus appliquée automatiquement aux arbres situés en dessous d'une certaine taille d'écran, le vent pouvant affecter les arbres très éloignés pour une meilleure immersion. Cette remarque est également valable pour l'herbe et les arbustes qui utilisent des maillages squelettiques.
Plug-in Dynamic Wind
Ce plug-in est en phase expérimentale.
Le plug-in Dynamic Wind est conçu pour fonctionner avec Végétation Nanite. Il nécessite une configuration supplémentaire avec une ressource de données squelettiques de vent dynamique pour un maillage squelettique particulier. Les données de cette ressource classent les os du squelette en groupes de simulation, ce qui permet au système d'identifier logiquement les chaînes d'os dans la simulation afin que vous puissiez définir l'influence du vent sur chaque groupe.
Vous pouvez activer ce plug-in à partir du navigateur Plug-ins de la catégorie Rendu.
Le plug-in fournit une action de ressource scénarisée pour importer les données nécessaires à partir d'un fichier .JSON. Il comprend également un schéma USD (Universal Scene Description) que vous pouvez appliquer à un squelette pour fournir ces données, ainsi qu'un exemple de script Python qui permet de créer un fichier JSON à partir du schéma USD.
Données de fournisseur de transformation de vent dynamique
Les maillages squelettiques qui contiennent des données utilisateur issues d'une ressource de données de vent dynamique peuvent utiliser ces données pour piloter une animation de vent dans un composant de maillage surfacé instancié.
Pour activer le vent sur un maillage surfacé, utilisez le menu déroulant Fournisseur de transformation de votre composant pour sélectionner les données de fournisseur de transformation. Une nouvelle ressource de données de vent dynamique est ainsi créée pour le maillage.
Cette ressource est nécessaire pour enregistrer le composant dans le système de gestion du vent. À l'heure actuelle, elle n'a aucun autre objectif.
Les limites actuelles de cette fonction sont les suivantes :
Ajout de simulations basées sur la physique supplémentaires, telles que le champ proche.
Prend uniquement en charge la direction globale du vent.
Pas de collision avec des joueurs ou des objets.
Les données squelettiques de vent dynamique doivent être importées avec un fichier .JSON.
À l'avenir, ces données seront importées lors de l'importation du schéma USD.
Ajustements nécessaires aux données de fournisseur de transformation de vent dynamique.
Conseils pour optimiser les performances de surfaçage Nanite
Bien que le surfaçage Nanite soit plus performant que le décalage de position dans le monde pour assurer le mouvement de la végétation sous l'effet du vent, vous devez rester attentif aux performances.
Gardez à l'esprit les points suivants :
Pour optimiser les performances des textures d'ombre virtuelles, il est nécessaire de désactiver l'animation à distance.
Les maillages instanciés désactivés basculent sur un bac de rastérisation non surfacé et sont rendus comme un maillage statique à fonction fixe (dans la pose de liaison).
Utilisez l'option Taille d'écran minimale d'animation dans le composant pour désactiver le surfaçage lorsque l'objet est petit à l'écran.
Cette option est similaire au paramètre Distance de désactivation du décalage de position dans le monde, à ceci près qu'elle est toujours active. Si vous conservez la valeur 0, la valeur globale par défaut est utilisée, à savoir 1/10e (0,1) de la taille d'écran de l'objet lorsque animation s'arrête. Vous pouvez modifier ce paramètre à l'aide de la commande de console
r.Skinning.DefaultAnimationMinScreenSize.