octubre 21, 2025

Mesh Shaders y Meshlets support on Low-level API

En la última versión estable de Evergine hemos trabajado en ampliar el soporte de Shader Model dentro del motor. Hemos pasado de Shader Model 6.3 (en la versión previa) a Shader Model 6.7, lo que nos permite aprovechar un set más amplio de instrucciones en nuestros shaders.

Pero lo más interesante de esta actualización es que abre la puerta a la implementación de Mesh Shaders en la capa low-level de Evergine, con una interfaz unificada que ya funciona tanto en DirectX 12 como en Vulkan.

¿Qué son los Mesh Shaders?

El concepto de Mesh Shader fue introducido por NVIDIA en 2018, aunque no se implementó hasta 2020 con DirectX 12 Ultimate, y poco después como extensión en Vulkan.

Este nuevo pipeline propone dividir los meshes a renderizar en pequeños fragmentos llamados meshlets, lo que habilita optimizaciones muy interesantes:

  • Menor consumo de memoria.
  • Técnicas de culling más eficientes (frustum y occlusion).
  • Mayor rendimiento en escenas complejas, al poder procesar un número mucho mayor de meshes.

En otras palabras: los Mesh Shaders replantean cómo generar y procesar la geometría en GPU, reemplazando parte del pipeline tradicional de rasterización por un flujo más compacto y flexible.

Comparando pipelines

El pipeline de rasterización clásico consta de 3 etapas no programables y 5 programables, mientras que el nuevo pipeline con Mesh Shaders se simplifica a 2 etapas no programables y 3 programables.

El Pixel Shader sigue presente en ambos pipelines, pero la gran diferencia está en la generación de geometría, donde aparecen dos nuevos stages:

  • Task Shader (también llamado Amplification Shader en DX12, u Object Function en Metal).
  • Mesh Shader (reemplaza y amplía el rol del Vertex, Geometry Shader, Hull Shader).

 

Ejemplo práctico en Evergine

Para ilustrar cómo funciona, en Evergine basta con un Mesh Shader y un Pixel Shader para dibujar un triángulo.

Resultando en:

El Mesh Shader define los 3 vértices con su posición y color, y especifica los índices para la triangulación. A diferencia de los Vertex Geometry y Hull Shaders tradicionales, aquí tenemos mucha más libertad, incluyendo la posibilidad de subdividir automáticamente los meshes en meshlets.

 

¿Qué es un meshlet?

Un meshlet es un grupo pequeño de vértices y triángulos (idealmente 64 vértices y 126 triángulos) que la GPU puede manejar de forma muy eficiente.

Para generar automáticamente estos grupos existen varias librerías, pero la que se ha convertido en estándar de la industria es MeshOptimizer de Arseny Kapoulkine.

En Evergine hemos creado un binding en C# de esta librería, disponible como paquete NuGet, que permite subdividir tus meshes en meshlets fácilmente.

Ejemplo de uso con nuestro binding:

Una vez dividido el mesh, el shader puede desempaquetar la información del meshlet y renderizarla de forma óptima.

Nuestro MeshShader que dibuja un mesh a partir de su colección de meshlets sería:

Task Shader: culling eficiente

El Task Shader no es obligatorio, pero resulta especialmente interesante porque nos permite decidir qué meshlets pasarán al Mesh Shader stage.

Esto hace que sea muy sencillo implementar técnicas de occlusion culling, pintando solo los meshlets visibles. En escenas grandes y con muchos objetos, el ahorro de recursos puede ser muy significativo.

Ejemplo: un Task Shader que descarta todos los meshlets situados en la parte izquierda de la pantalla, renderizando solo los de la mitad derecha.

Task Shader: culling eficiente

El Task Shader no es obligatorio, pero resulta especialmente interesante porque nos permite decidir qué meshlets pasarán al Mesh Shader stage.

Esto hace que sea muy sencillo implementar técnicas de occlusion culling, pintando solo los meshlets visibles. En escenas grandes y con muchos objetos, el ahorro de recursos puede ser muy significativo.

Ejemplo: un Task Shader que descarta todos los meshlets situados en la parte izquierda de la pantalla, renderizando solo los de la mitad derecha.

 

 

Conclusión

La llegada de los Mesh Shaders marca un paso muy importante para Evergine, permitiendo aprovechar al máximo las GPUs modernas. Con esta técnica puedes renderizar más geometría de forma más eficiente, y además cuentas con herramientas como nuestro binding de MeshOptimizer para empezar a trabajar con meshlets desde ya.

 

 

Jorge Canton
Author
Jorge Cantón
Plain Concepts Research

¿Ya te vas?

Suscríbete a nuestra newsletter para estar al día de las últimas noticias, casos de éxito y mucho más. 

No mandamos spam y puedes darte de baja en cualquier momento.