> ## 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.

# Uso do pipeline de Mesh Shader

> Uso do pipeline de Mesh Shader

Usar o pipeline de Mesh Shader no Direct3D 12 se resume às seguintes etapas familiares.

1. Escreva e compile um Mesh Shader e (opcionalmente) um Amplification Shader usando o DXC.
2. Crie um objeto de estado de pipeline de Mesh Shader usando o bytecode do shader compilado.
3. Grave o dispatch do objeto de estado de pipeline de Mesh Shader usando uma lista de comandos.
4. Execute a lista de comandos em uma fila de comandos.

## Objetos de estado de pipeline de Mesh Shader

O Direct3D 12 expõe o pipeline de Mesh Shader por meio das APIs familiares de objeto de estado de pipeline gráfico. A criação do objeto de estado de pipeline de Mesh Shader usa as APIs de fluxo de estado de pipeline, conforme ilustrado nos dois próximos exemplos de código.

As APIs ID3D12Device e ID3D12GraphicsCommandList permitem verificar o suporte de hardware e despachar cargas de trabalho do pipeline de Mesh Shader (o segundo exemplo de código). Observe que não é necessário verificar o suporte de hardware no XBOX Series X|S.

O exemplo de código a seguir mostra uma desc de fluxo de pipeline de Mesh Shader a ser fornecida às APIs de criação de fluxo de pipeline.

```text theme={null}
struct MyPsoStreamDesc
{
    CD3DX12_PIPELINE_STATE_STREAM_ROOT_SIGNATURE        pRootSignature;
    CD3DX12_PIPELINE_STATE_STREAM_AS                    AS;
    CD3DX12_PIPELINE_STATE_STREAM_MS                    MS;
    CD3DX12_PIPELINE_STATE_STREAM_PS                    PS;
    CD3DX12_PIPELINE_STATE_STREAM_BLEND_DESC            BlendState;
    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL1        DepthStencilState;
    CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER            RasterizerState;
    CD3DX12_PIPELINE_STATE_STREAM_RENDER_TARGET_FORMATS RTFormats;
    CD3DX12_PIPELINE_STATE_STREAM_DEPTH_STENCIL_FORMAT  DepthFormat;
    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_DESC           SampleDesc;
    CD3DX12_PIPELINE_STATE_STREAM_SAMPLE_MASK           SampleMask;
};
```

O exemplo de código a seguir mostra a criação e o uso do estado de pipeline de Mesh Shader.

```text theme={null}
{
    // Check the hardware for Mesh Shader pipeline feature support, which is unnecessary on Xbox Series X&#124;S.
    D3D12_FEATURE_DATA_D3D12_OPTIONS7 options;
    device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS7, &options, sizeof(options));
    
    if (options.MeshShaderTier == D3D12_MESH_SHADER_TIER_NOT_SUPPORTED)
        throw std::exception("Mesh Shaders not supported!"); 

    // Create the Mesh Shader pipeline by using the pipeline state stream APIs.
    MyPsoStreamDesc psoDesc;
    psoDesc.AS = {...};
    psoDesc.MS = {...};
    ...

    D3D12_PIPELINE_STATE_STREAM_DESC desc = { sizeof(psoDesc), &psoDesc };
    device->CreatePipelineState(&desc, IID_PPV_ARGS(&msPso));

    ...

    // Set the graphics root signature, Mesh Shader pipeline state object, and root parameters.
    cmdList->SetGraphicsRootSignature(&msRootSig);
    cmdList->SetPipelineState(&msPso); 
    ...

    // Dispatch the bound Mesh Shader pipeline directly ...
    cmdList->DispatchMesh(groupCount, 1, 1);
    
    // ... or indirectly.
    cmdList->ExecuteIndirect(&msCommandSig, ...);
}
```

## Mesh Shaders

Os Mesh Shaders são compilados com a ferramenta de linha de comando DXC ou com a biblioteca do compilador usando o novo perfil de shader "*ms*" de Mesh Shader, por exemplo, *ms\_6\_5*. O terceiro exemplo de código fornece uma implementação de exemplo de um Mesh Shader de triângulo em espaço de tela; acompanhe usando esse exemplo de código como referência.

Veja a seguir um exemplo de compilação de um Mesh Shader na linha de comando.

```text theme={null}
dxc.exe -T ms_6_5 -E main -Fo ExampleMS.cso ExampleMS.hlsl
```

A função **main** do shader é decorada com atributos de metadados.

* **NumThreads** declara a dimensionalidade do grupo de threads
* **OutputTopology** declara o tipo de primitivo

As únicas entradas são os IDs de thread familiares dos compute shaders. Todos os outros dados devem ser lidos manualmente por meio de constant buffer views (CBVs), shader resource views (SRVs) ou unordered access views (UAVs).

As saídas geométricas são declaradas por meio dos parâmetros *out* como *matrizes de saída compartilhadas*. São parâmetros de matriz somente gravação cujos tipos declaram os tipos de vértice e primitivo definidos pelo usuário a serem exportados do shader. Os modificadores *vertices*, *indices* e *primitives* especificam cada parâmetro como uma das três saídas geométricas distintas. O comprimento dessas matrizes deve ser uma constante em tempo de compilação e define o número máximo de vértices e primitivos que podem ser exportados.

A função intrínseca [SetMeshOutputCounts](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#setmeshoutputcounts) declara as contagens reais de exportação de vértices e primitivos para o grupo de threads. Essa chamada é opcional: o padrão é zero tanto para numVerts quanto para numPrims. Esses valores devem ser menores ou iguais aos comprimentos das matrizes de saída. Essa chamada pode ocorrer a qualquer momento *antes* das gravações nas matrizes de saída compartilhadas. Espera-se que os valores fornecidos sejam constantes no grupo de threads, e eles serão lidos da primeira lane.

Os vértices e primitivos são então transformados pelo grupo de threads e gravados nas matrizes de saída compartilhadas. A chamada a **SetMeshOutputCounts()** deve ser realizada antes que qualquer gravação ocorra, e as gravações devem estar dentro dos limites declarados por essa chamada.

O exemplo de código a seguir mostra um Mesh Shader que renderiza um único triângulo em espaço de tela.

```text theme={null}
static const float4 Vertices[3] = 
{
    float4(-0.5f, -0.5f, 0.0f, 1.0f),
    float4( 0.0f,  0.5f, 0.0f, 1.0f),
    float4( 0.5f, -0.5f, 0.0f, 1.0f)
};
static const uint3 Primitives[1] = { uint3(0, 1, 2) };

[NumThreads(32, 1, 1)]
[OutputTopology("triangle")]
void main(
    uint groupThreadId : SV_GroupIndex,
    out vertices VertexOut verts[3],
    out indices uint3 tris[1],
    out primitives PrimitiveOut prims[1])
{
    SetMeshOutputCounts(3, 1);

    if (groupThreadId < 3)
    {
        VertexOut vout;
        vout.Position = Vertices[groupThreadId];
        vout.Color = float3(1.0, 1.0, 1.0);
        
        verts[groupThreadId] = vout;
    }

    if (groupThreadId < 1)
    {
        tris[groupThreadId] = Primitives[groupThreadId];

        prims[groupThreadId].PrimitiveId = groupThreadId;
    }
}
```

## Amplification Shaders

Os Amplification Shaders são compilados com a ferramenta de linha de comando DXC ou com a biblioteca usando o novo perfil de shader "*as*" de Amplification Shader, por exemplo, *as\_6\_5*.

Veja a seguir um exemplo de compilação de um Amplification Shader na linha de comando.

```text theme={null}
dxc.exe -T as_6_5 -E main -Fo ExampleAS.cso ExampleAS.hlsl
```

Sua estrutura é idêntica à dos compute shaders, exceto pela chamada opcional à função intrínseca [DispatchMesh](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#dispatchmesh-intrinsic), que despacha um cluster de Mesh Shaders filhos. O exemplo de código a seguir descreve um Amplification Shader bem genérico, apenas para mostrar a estrutura geral.

Para uma aplicação abrangente de Amplification Shaders, consulte [Exemplo de culling de meshlets](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling).

O exemplo de código a seguir mostra um esboço genérico de um Amplification Shader.

```text theme={null}
struct MyPayload 
{ 
    uint   SomeData;
    float4 MoreData;
    float3 DataData[32];
};

groupshared MyPayload payload;

[NumThreads(32, 1, 1)] 
void main(
    uint3 dispatchThreadId : SV_DispatchThreadID,
    uint3 groupThreadId : SV_GroupThreadID,
    uint groupId : SV_GroupID
)
{
    ReadMyResourceData(dispatchThreadId);

    uint count = GetMyThreadgroupCount(groupId, groupThreadId);
    BuildMyPayload(groupId, groupThreadId, payload);

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

## Confira também

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

[Por que usar 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)

[Exemplo de culling de meshlets](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling)


## Related topics

- [Visão geral da API do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-api-design.md)
- [Mesh shaders e meshlets no XBOX Series X|S](/pt-BR/build/core-features/graphics/newfeatures/ms/index.md)
- [Por que usar Mesh Shaders?](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-why.md)
- [Diretório de tópicos NDA: links ativos do Microsoft Learn](/pt-BR/nda/nda-topic-directory.md)
- [Visão geral do pipeline de Mesh Shader](/pt-BR/build/core-features/graphics/newfeatures/ms/ms-overview.md)
