> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Exemplo de culling de meshlets

> Exemplo de culling de meshlets

Recomendamos que você leia primeiro o tópico [Meshlets](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-meshlet-render).

O tópico Exemplo de culling de meshlets apresenta o pseudocódigo de uma implementação em Amplification Shader de uma técnica chamada *culling de meshlets*. Como os primitivos de um meshlet idealmente seguem uma coerência espacial e de orientação, podemos armazenar dados de culling eficientes por meshlet. Isso pode ser usado para fazer rapidamente o culling de uma lista de meshlets em relação a uma visão em um Amplification Shader e despachar instâncias de Mesh Shader somente para os meshlets restantes.

A técnica começa com um Amplification Shader no qual cada thread processa um único meshlet. Isso significa que devemos despachar ceil(MeshletCount / GROUP\_SIZE) grupos de threads na lista de comandos.

Cada grupo de threads do Amplification Shader é então responsável por processar GROUP\_SIZE meshlets. Cada thread faz o culling do seu meshlet em relação ao frustum de visão, determina seu slot de exportação e, em seguida, grava seu índice nos dados de payload. Depois, usa [DispatchMesh](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#dispatchmesh-intrinsic) para despachar um grupo de threads de Mesh Shader para cada meshlet restante a ser renderizado. Cada grupo de threads de Mesh Shader então carrega seu meshlet a partir dos dados de payload e exporta sua geometria.

O exemplo completo pode ser encontrado na [página de downloads para desenvolvedores do XBOX](https://aka.ms/xgddl).

## Amplification Shader

A estrutura do Amplification Shader é idêntica à dos compute shaders, mas termina com no máximo uma chamada 'DispatchMesh(…)'. Primeiro, cada thread carrega seu meshlet e faz o culling dele em relação à visão. Em seguida, uma rotina de compactação é executada para determinar o local final de gravação de cada thread. Isso também fornece a contagem final de meshlets não descartados para o grupo de threads. Por fim, o índice do meshlet é gravado nos dados de payload groupshared, e DispatchMesh é chamado com a contagem de meshlets restantes e os dados de payload.

O exemplo a seguir mostra um Amplification Shader que implementa o culling de meshlets em pseudocódigo.

```
#define GROUP_SIZE 128

struct Meshlet
{
    // Meshlet data.
    uint VertexOffset;
    uint VertexCount;
    uint PrimitiveOffset;
    uint PrimitiveCount;

    // Local Culling data.
    float4 BoundingSphere;
    float4 NormalCone;
};

StructuredBuffer<Meshlet> Meshlets : register(t0);

cbuffer ViewProps : register(b0)
{
    float4x4 ViewMat;
    float4x4 ViewProjMat;
    float3   ViewPosition;
};

struct MyPayload 
{ 
    uint MeshletIndices[GROUP_SIZE]; 
};

groupshared MyPayload payload;

bool CullTests(Meshlet m) { ... }
void CalcPayloadIndexAndCount(bool isCulled, out index, out count) { ... }

[NumThreads(GROUP_SIZE, 1, 1)] 
void main(
    uint dispatchThreadId : SV_DispatchThreadID,
    uint groupThreadId : SV_GroupThreadID
)
{
    Meshlet meshlet = Meshlets[dispatchThreadId];
    bool isCulled = CullTests(meshlet);
    
    uint index, count;
    CalcPayloadIndexAndCount(groupThreadId, isCulled, index, count);
    
    if (!isCulled)
    {
        payload.MeshletIndices[index] = dispatchThreadId;
    }

    DispatchMesh(count, 1, 1, payload);
}
```

## Mesh Shader

O Mesh Shader do pipeline é muito semelhante à renderização de meshlets com um pipeline somente de Mesh Shader, exceto pelo fato de que lemos o índice do meshlet do grupo de threads a partir dos dados de payload. Os dados de payload são os mesmos dados criados e exportados pelo Amplification Shader anterior. Os GroupIDs e DispatchThreadIDs são localizados no cluster de Mesh Shader despachado pelo grupo de threads do Amplification Shader que o invocou, e todos compartilham os mesmos dados de payload.

Este exemplo de código mostra o Mesh Shader que segue o Amplification Shader anterior.

```
#define MAX_MESHLET_SIZE 128

StructureBuffer<MyVertex>   Vertices;
StructureBuffer<Meshlet>    Meshlets;
StructuredBuffer<uint>      UniqueVertexIndices;
StructureBuffer<uint3>      PrimitiveIndices;

VertexOut TransformVertex(MyVertex v) { ... }

[NumThreads(MAX_MESHLET_SIZE, 1, 1)]
[OutputTopology("triangle")]
void main(
    uint groupThreadId : SV_GroupIndex,
    uint groupId : SV_GroupID,
    in payload MyPayload payload,
    out vertices VertexOut verts[MAX_MESHLET_SIZE],
    out indices uint3 tris[MAX_MESHLET_SIZE])
{
    uint meshletIndex = payload.MeshletIndices[groupId];
    Meshlet m = Meshlets[meshletIndex];

    SetMeshOutputCounts(m.VertCount, m.PrimCount);

    if (groupThreadId < m.PrimCount) 
    {
        tris[groupThreadId] = PrimitiveIndices[m.PrimOffset + groupThreadId];
    }

    if (groupThreadId < m.VertCount) 
    {
        uint index = UniqueVertexIndices[m.VertOffset + groupThreadId];
        MyVertex vin = Vertices[index];

        verts[groupThreadId] = TransformVertex(vin);
    }
}

```

## Consulte também

[Visão geral do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-overview)

[Por que Mesh Shaders?](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-why)

[Visão geral da API de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-api-design)

[Meshlets](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-meshlet-render)


## Related topics

- [Mesh shaders e meshlets no XBOX Series X|S](/pt-BR/build/core-features/graphics/newfeatures/ms/index.md)
- [Exemplos de gráficos](/pt-BR/build/core-features/graphics/graphics-samples.md)
- [Exemplo de configuração de cancelabilidade](/pt-BR/build/core-features/common/async/async-libraries/async-library-xasyncprovider-example-setup-cancelability.md)
- [Código de exemplo de reputação](/pt-BR/services/xbox-services/community/reputation/how-to/live-reputation-howto-nav.md)
- [Código de exemplo de convites](/pt-BR/services/xbox-services/multiplayer/invites/how-to/live-invites-howto-nav.md)
