Passer au contenu principal
Un meshlet est simplement un sous-bloc d’un maillage : un nombre fixe de primitives et de sommets. Un maillage peut être entièrement défini par un ensemble de meshlets, chacun étant constitué d’un ensemble unique de primitives du maillage. Nous qualifierons de meshletisé un maillage converti en structure de meshlets. Le nombre fixe de primitives et de sommets utilisé pour construire le maillage meshletisé est identique dans toute la liste de meshlets et définit la taille maximale de chaque meshlet. Idéalement, chaque meshlet est aussi proche que possible de cette taille, sans nécessairement l’atteindre. Le tampon d’index traditionnel est remplacé par trois nouvelles structures de données : une liste de meshlets, une liste d’index de sommets uniques et une liste de primitives. Figure 1. Rendu d’un maillage meshletisé coloré par meshlet (un dragon). Notez que les meshlets sont constitués de primitives présentant une cohérence spatiale raisonnable. Dragon L’exemple de code suivant est une implémentation C++ d’une structure de meshlet d’exécution. Ces données décrivent entièrement un maillage pouvant être rendu.
Cette structure de meshlet présente plusieurs avantages pour le rendu avec Mesh Shader. Chaque meshlet a une taille maximale fixe, ce qui est idéal pour associer un groupe de threads de taille fixe à un seul meshlet et offre une correspondance intuitive entre thread et sommet/primitive. Les nombres de sommets et de primitives sont connus à l’avance, ce qui évite d’avoir à les calculer dans le code du shader. Les index de sommets sont déjà dédoublonnés, ce qui élimine les transformations et exportations de sommets redondantes. Les index de primitives sont localisés par rapport à la liste de sommets du meshlet. Les meshlets offrent également une granularité supplémentaire pour l’élimination (culling) grâce à des informations spatiales et d’orientation. L’exemple de code précédent montre les relations entre les nouveaux tampons de meshlets. La liste de meshlets est une liste plate de la structure « meshlet » d’exécution, qui contient au minimum un décalage et un nombre dans les listes d’index de sommets uniques et de primitives. La liste d’index de sommets uniques est une liste dédoublonnée d’index dans le tampon de données de sommets. La liste de primitives définit les primitives du maillage et se compose d’index dans la liste d’index de sommets uniques, localisés par rapport au décalage de sommets du meshlet. Figure 2. Diagramme illustrant la relation entre les tampons de meshlets. Diagramme illustrant la relation entre les tampons de meshlets

Conversion en meshlets

La meshletisation d’un maillage à tampon d’index traditionnel ne nécessite aucune modification du flux de travail des artistes : il s’agit d’une étape procédurale de post-traitement après la création du modèle. Le tampon d’index traditionnel peut également être régénéré rapidement à l’exécution, ce qui évite d’avoir à livrer à la fois des tampons d’index traditionnels et des tampons de meshlets. La meshletisation pouvant être coûteuse en calcul, nous vous recommandons de l’effectuer hors ligne au préalable. Un exemple de projet de convertisseur de meshlets, comprenant une bibliothèque C++ et un outil en ligne de commande, est fourni par ATG pour effectuer cette conversion, avec nos autres exemples, sur la page XBOX Developer Downloads. Cet outil ne modifie pas les données de sommets elles-mêmes ; nous vous recommandons donc d’exécuter un optimiseur de cache de sommets, tel que l’algorithme de Forsyth, sur les données du maillage avant la meshletisation. Les optimiseurs ont tendance à créer des maillages plus cohérents spatialement que ce que l’on peut attendre universellement des outils de création de contenu. Des heuristiques supplémentaires pourraient être ajoutées pour équilibrer la réutilisation des sommets avec les propriétés d’élimination avantageuses de la structure de maillage résultante.

Rendu avec des meshlets

La structure du meshlet rend le rendu très simple avec les Mesh Shaders. Déclarez la taille du groupe de threads comme étant la taille maximale d’un meshlet et distribuez un groupe de threads pour chaque meshlet du maillage. Chaque thread est chargé de traiter et d’exporter un sommet et une primitive. L’exemple suivant présente un code Mesh Shader simple qui effectue le rendu d’un maillage meshletisé. Tout d’abord, le meshlet du groupe de threads est chargé et les nombres de sorties peuvent être déclarés immédiatement. Enfin, PrimitiveCount threads sont chargés de lire et d’écrire les données d’index de primitives, et VertexCount threads chargent l’index de sommet utilisé pour accéder aux données de sommet, puis l’ombrent et l’écrivent dans le tableau de sortie. L’exemple complet est disponible sur la page XBOX Developer Downloads. L’exemple de code suivant est un exemple d’implémentation de rendu d’un meshlet par un Mesh Shader.

Voir aussi

Vue d’ensemble du pipeline Mesh Shader Vue d’ensemble de l’API Mesh Shader Utilisation du Mesh Shader Élimination des meshlets
Dernière modification le 6 octobre 2026