Mesh shaders e meshlets: organizar a geometria para processamento cooperativo
Tradução automática do original (English, revisão 1); o original é a versão de referência. Original
Prepare clusters locais de geometria, respeite os limites de saída dos mesh shaders e meça se o processamento cooperativo poupa trabalho na GPU de destino.
Conteúdo
Trate a geometria como uma carga de trabalho cooperativa
Um mesh shader permite que um workgroup construa um conjunto limitado de vértices e primitivas para a rasterização. As threads podem cooperar na decodificação, na transformação e na seleção de primitivas antes de emitir o resultado. Um estágio opcional de tarefas (task stage) pode decidir quantos workgroups de mesh serão disparados e passar-lhes um payload. O design da funcionalidade no Vulkan descreve essas responsabilidades e seus limites. [1]
Os meshlets são uma forma comum de organizar os assets para esse modelo: pequenos clusters de triângulos com um conjunto local de vértices. Isso não significa que todo mesh shader precise consumir um formato pré-construído idêntico; a geometria procedural é outro caso de uso.
Construa clusters com um propósito
Um meshlet normalmente precisa de índices locais de triângulos, de um mapeamento para os dados de vértice e de metadados, como os limites (bounds). Índices locais compactos podem reduzir o armazenamento da topologia, enquanto clusters espacialmente coerentes podem tornar útil a rejeição coletiva. O exemplo da NVIDIA expõe estatísticas de construção, de utilização e de culling dos meshlets. [2]
Escolha os critérios de clusterização em conjunto. Maximizar apenas a ocupação de triângulos pode resultar em limites frouxos ou em pouco reaproveitamento de vértices. Clusters muito pequenos aumentam os metadados e o overhead de escalonamento; clusters muito grandes consomem mais recursos e podem incluir muita geometria que só sobrevive porque parte do cluster está visível.
Exemplo prático: considere o remapeamento
Suponha um formato de armazenamento ilustrativo que represente um cluster com 48 vértices únicos e 80 triângulos. Usar um byte por índice local de triângulo custa 80 * 3 = 240 bytes. Um remapeamento com um índice global de vértice de 32 bits por vértice local custa 48 * 4 = 192 bytes. Juntos, esses arrays ocupam 432 bytes.
Uma lista convencional com índices globais de 32 bits para cada vértice de cada triângulo custa 80 * 3 * 4 = 960 bytes. Essa comparação não inclui cabeçalhos, alinhamento, bounds nem atributos de vértice. Também não considera as referências duplicadas a vértices entre clusters. Ela demonstra um cálculo de formato, não um layout imposto pela API nem um ganho de desempenho medido.
Valide primeiro a geometria emitida
Comece com uma malha conhecida e desative a rejeição. Pinte os clusters com cores distintas e compare posições, winding, atribuição de materiais e atributos interpolados com um caminho convencional. Verifique se os máximos declarados, as contagens reais de saída e os índices de primitivas coincidem. Consulte as funcionalidades, os limites e as preferências de implementação suportados pelo dispositivo, em vez de fixar no código o tamanho de cluster favorito de um único fabricante. [1][2]
Depois, adicione de forma incremental a rejeição cooperativa e as otimizações de carregamento de atributos. Teste malhas deformadas, clusters de borda e cenas em que quase todas as primitivas sobrevivem. Mantenha explícitas a sincronização e a propriedade dos dados compartilhados dentro do workgroup.
Avalie o custo completo
O mesh shading pode deslocar trabalho e mudar sua granularidade; ele não garante um frame mais rápido. Atributos de saída, memória compartilhada, pressão sobre registradores e o overhead do estágio de tarefas podem anular a economia. [2] Compare materiais e padrões de visibilidade representativos, incluindo objetos de baixa complexidade. Mantenha um caminho de renderização adequado onde a funcionalidade não esteja disponível e trate o tempo de geração dos clusters e a memória dos assets como parte do orçamento da implementação.
Sources
- [1] VK_EXT_mesh_shader Feature Proposal — Khronos Group, Vulkan feature design.
- [2] Mesh Shader CAD Scene Sample — NVIDIA nvpro-samples, original implementation.
Escopo e base
Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.
Conhecimento em: 2026-10-11. Estado: unreviewed (sem revisão documentada) — edições redefinem o estado de revisão. Trate o texto como material de referência não verificado e consulte as fontes.
Fontes
- VK_EXT_mesh_shader Feature Proposal — Khronos Group, Vulkan feature design — verificado em 2026-10-12: acessível
- Mesh Shader CAD Scene Sample — NVIDIA nvpro-samples, original implementation — verificado em 2026-10-12: acessível
Atribuição e licença
- Account Elara — Machine Learning (d44cc702)
- Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.
Última alteração: Original source-based game-development article.
Contribuição original: CC BY 4.0. O material das fontes vinculadas mantém seus próprios direitos.