21 octobre 2025

Prise en charge des Mesh Shaders et des meshlets dans l’API bas niveau

Dans la dernière version stable d’Evergine, nous avons étendu la prise en charge des Shader Models dans le moteur. Nous sommes passés du Shader Model 6.3 (dans la version précédente) au Shader Model 6.7, ce qui nous permet de tirer parti d’un jeu d’instructions plus large dans nos shaders.

Mais le plus intéressant dans cette mise à jour, c’est qu’elle ouvre la voie à l’implémentation des Mesh Shaders dans la couche bas niveau d’Evergine, avec une interface unifiée qui fonctionne déjà sous DirectX 12 et Vulkan.

 

Que sont les Mesh Shaders ?

Le concept de Mesh Shaders a été introduit par NVIDIA en 2018, mais il n’a été implémenté qu’en 2020 avec DirectX 12 Ultimate, puis peu après sous forme d’extension dans Vulkan.

Ce nouveau pipeline propose de diviser les maillages à rendre en petits fragments appelés meshlets, ce qui permet des optimisations très intéressantes :

  • Une consommation de mémoire réduite.
  • Des techniques de culling plus efficaces (frustum et occlusion).
  • De meilleures performances dans les scènes complexes, puisque le GPU peut traiter un nombre bien plus important de maillages.

Autrement dit : les Mesh Shaders repensent la manière dont la géométrie est générée et traitée sur le GPU, en remplaçant certaines parties du pipeline de rastérisation traditionnel par un flux plus compact et plus flexible.

Comparaison des pipelines

Le pipeline de rastérisation classique comprend 3 étapes à fonction fixe et 5 étapes programmables, tandis que le nouveau pipeline avec Mesh Shaders se simplifie en 2 étapes à fonction fixe et 3 étapes programmables.

Le Pixel Shader est toujours présent dans les deux pipelines, mais la différence essentielle réside dans la génération de la géométrie, où deux nouvelles étapes apparaissent :

  • Task Shader (également appelé Amplification Shader sous DX12, ou Object Function sous Metal).
  • Mesh Shader (remplace et étend le rôle des Vertex, Geometry et Hull Shaders).

 

Exemple pratique dans Evergine

Pour illustrer son fonctionnement : dans Evergine, il suffit d’un Mesh Shader et d’un Pixel Shader pour dessiner un triangle.

Résultat :

Le Mesh Shader définit les trois sommets avec leur position et leur couleur, et précise les indices pour la triangulation. Contrairement aux Vertex, Geometry et Hull Shaders traditionnels, nous disposons ici d’une bien plus grande liberté, y compris la possibilité de subdiviser automatiquement les maillages en meshlets.

 

Qu’est-ce qu’un meshlet ?

Un meshlet est un petit groupe de sommets et de triangles (idéalement 64 sommets et 126 triangles) que le GPU peut traiter de manière très efficace.

Plusieurs bibliothèques permettent de générer automatiquement ces groupes, mais celle qui s’est imposée comme standard de l’industrie est MeshOptimizer d’Arseny Kapoulkine.

Dans Evergine, nous avons créé un binding C# pour cette bibliothèque, disponible sous forme de package NuGet, qui vous permet de subdiviser facilement vos maillages en meshlets.

Exemple d’utilisation avec notre binding :

Une fois le maillage subdivisé, le shader peut décompresser les données des meshlets et les rendre de manière optimale.

Notre Mesh Shader qui rend un maillage à partir de sa collection de meshlets serait le suivant :

Task Shader : culling efficace

Le Task Shader est facultatif, mais particulièrement intéressant, car il permet de décider quels meshlets seront envoyés à l’étape du Mesh Shader.

Il devient ainsi très facile d’implémenter des techniques d’occlusion culling, en ne rendant que les meshlets visibles. Dans les grandes scènes comportant de nombreux objets, les économies de ressources peuvent être très importantes.

Exemple : un Task Shader qui écarte tous les meshlets situés dans la moitié gauche de l’écran et ne rend que ceux de la moitié droite.

Démo et open source

Le nouveau pipeline avec Mesh Shaders est déjà disponible dans la couche bas niveau d’Evergine, prêt pour que vous commenciez à l’expérimenter sous DX12 et Vulkan.

Vous pouvez télécharger le code source complet de la démo utilisée dans cet article depuis notre dépôt :

Evergine Low-Level API Demo

D’autres exemples de subdivision de maillages en meshlets et de rendu avec ce nouveau pipeline sont également inclus.

 

 

Conclusion

L’arrivée des Mesh Shaders marque une étape très importante pour Evergine, en permettant d’exploiter pleinement les GPU modernes. Grâce à cette technique, vous pouvez rendre plus de géométrie plus efficacement, et vous disposez d’outils comme notre binding MeshOptimizer pour commencer à travailler avec les meshlets dès maintenant.

 

 

Jorge Canton
Auteur
Jorge Cantón
Plain Concepts Research