Skip to main content
Un meshlet es simplemente un subfragmento de una malla: un número fijo de primitivas y vértices. Una malla se puede definir completamente mediante un conjunto de meshlets, y cada uno consta de un conjunto único de primitivas de la malla. Diremos que una malla que se ha convertido en una estructura de meshlets ha sido meshletizada. El número fijo de primitivas y vértices usado para crear la malla meshletizada es coherente en toda la lista de meshlets y define el tamaño máximo de cada meshlet. Idealmente, cada meshlet se aproxima lo máximo posible a este tamaño, pero no necesariamente lo llena. El búfer de índices tradicional se reemplaza por tres nuevas estructuras de datos: una lista de meshlets, una lista de índices de vértices únicos y una lista de primitivas. Figura 1. Representación de una malla meshletizada coloreada por meshlet (un dragón). Observe que los meshlets constan de primitivas con una coherencia espacial razonable. El ejemplo de código siguiente es una implementación en C++ de una estructura de meshlet en tiempo de ejecución. Estos datos describen completamente una malla representable.
Esta estructura de meshlet tiene varias ventajas para la representación con sombreadores de malla. Cada meshlet tiene un tamaño máximo fijo, lo que resulta ideal para asignar un grupo de subprocesos de tamaño fijo a un único meshlet y proporciona una asignación intuitiva de subproceso a vértice/primitiva. Los recuentos de vértices y primitivas se conocen de antemano, lo que elimina la necesidad de calcularlos en el código del sombreador. Los índices de vértices ya están desduplicados, lo que elimina transformaciones y exportaciones de vértices redundantes. Los índices de primitivas están localizados en la lista de vértices del meshlet. Los meshlets también proporcionan una granularidad adicional para la selección con información espacial y de orientación. El ejemplo de código anterior muestra la interrelación entre los nuevos búferes de meshlets. La lista de meshlets es una lista plana de la estructura “meshlet” en tiempo de ejecución, que como mínimo es un desplazamiento y un recuento dentro de las listas de índices de vértices únicos y de primitivas. La lista de índices de vértices únicos es una lista desduplicada de índices dentro del búfer de datos de vértices. La lista de primitivas define las primitivas de la malla y consta de índices dentro de la lista de índices de vértices únicos, localizados con respecto al desplazamiento de vértices del meshlet. Figura 2. Diagrama que muestra la relación entre los búferes de meshlets.

Conversión a meshlets

Meshletizar una malla con búfer de índices tradicional no requiere ningún cambio en el flujo de trabajo de los artistas: es un paso de posprocesamiento procedimental posterior a la creación del modelo. El búfer de índices tradicional también se puede regenerar rápidamente en tiempo de ejecución, lo que elimina la necesidad de distribuir tanto los búferes de índices tradicionales como los búferes de meshlets. La meshletización puede ser computacionalmente no trivial, por lo que se recomienda preprocesarla sin conexión. ATG proporciona un proyecto de conversión de meshlets de ejemplo, tanto una biblioteca de C++ como una herramienta de línea de comandos, para realizar esta conversión, junto con nuestros otros ejemplos, en la página de descargas para desarrolladores de XBOX. Esta herramienta no modifica los datos de vértices en sí, por lo que se recomienda ejecutar un optimizador de caché de vértices, como el algoritmo de Forsyth, sobre los datos de la malla antes de meshletizarla. Los optimizadores tienden a crear mallas con mayor coherencia espacial de lo que se puede esperar de forma universal de las herramientas de creación de contenido. Podrían agregarse heurísticas adicionales para equilibrar la reutilización de vértices con propiedades de selección beneficiosas de la estructura de malla resultante.

Representación con meshlets

La estructura del meshlet hace que la representación sea muy sencilla con sombreadores de malla. Declare el tamaño del grupo de subprocesos como el tamaño máximo del meshlet y distribuya un grupo de subprocesos por cada meshlet de la malla. Cada subproceso es responsable de procesar y exportar un vértice y una primitiva. A continuación se muestra un ejemplo de código sencillo de un sombreador de malla que representa una malla meshletizada. Primero, se carga el meshlet del grupo de subprocesos y los recuentos de salida se pueden declarar de inmediato. Por último, PrimitiveCount subprocesos son responsables de cargar y escribir los datos de índices de primitivas, y VertexCount subprocesos cargan el índice de vértice que se usa para acceder a los datos de vértices, y lo sombrean y escriben en la matriz de salida. El ejemplo completo se puede encontrar en la página de descargas para desarrolladores de XBOX. El ejemplo de código siguiente es una implementación de ejemplo de un sombreador de malla que representa un meshlet.

Consulte también

Información general de la canalización de sombreadores de malla Información general de la API de sombreadores de malla Uso de sombreadores de malla Selección de meshlets
Última modificación el 28 de agosto de 2026