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

# Utilisation du pipeline de nuanceurs de maillage

> Utilisation du pipeline de nuanceurs de maillage

L'utilisation du pipeline de nuanceurs de maillage dans Direct3D 12 se résume aux étapes familières suivantes.

1. Écrire et compiler un nuanceur de maillage et (facultativement) un nuanceur d'amplification à l'aide de DXC.
2. Créer un objet d'état de pipeline de nuanceurs de maillage à l'aide du bytecode de nuanceur compilé.
3. Enregistrer la répartition de l'objet d'état de pipeline de nuanceurs de maillage à l'aide d'une liste de commandes.
4. Exécuter la liste de commandes dans une file d'attente de commandes.

## Objets d'état de pipeline de nuanceurs de maillage

Direct3D 12 expose le pipeline de nuanceurs de maillage au moyen des API familières d'objets d'état de pipeline graphique. La création de l'objet d'état de pipeline de nuanceurs de maillage utilise les API de flux d'état de pipeline, comme l'illustrent les deux exemples de code suivants.

Les API ID3D12Device et ID3D12GraphicsCommandList permettent de vérifier la prise en charge matérielle et de répartir les charges de travail du pipeline de nuanceurs de maillage (deuxième exemple de code). Notez qu'il n'est pas nécessaire de vérifier la prise en charge matérielle sur la XBOX Series X|S.

L'exemple de code suivant montre une description de flux de pipeline de nuanceurs de maillage à fournir aux API de création de flux 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;
};
```

L'exemple de code suivant montre la création et l'utilisation de l'état de pipeline de nuanceurs de maillage.

```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, ...);
}
```

## Nuanceurs de maillage

Les nuanceurs de maillage sont compilés avec l'outil en ligne de commande DXC ou la bibliothèque du compilateur à l'aide du nouveau profil de nuanceur de maillage « *ms* », par exemple *ms\_6\_5*. Le troisième exemple de code fournit un exemple d'implémentation d'un nuanceur de maillage de triangle dans l'espace écran; suivez en utilisant cet exemple de code comme référence.

Voici un exemple de compilation d'un nuanceur de maillage en ligne de commande.

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

La fonction **main** du nuanceur est décorée d'attributs de métadonnées.

* **NumThreads** déclare la dimensionnalité du groupe de threads
* **OutputTopology** déclare le type de primitive

Les seules entrées sont les ID de thread familiers des nuanceurs de calcul. Toutes les autres données doivent être lues manuellement au moyen de vues de mémoire tampon constante (CBV), de vues de ressource de nuanceur (SRV) ou de vues d'accès non ordonné (UAV).

Les sorties géométriques sont déclarées au moyen des paramètres *out* en tant que *tableaux de sortie partagés*. Il s'agit de paramètres de tableau en écriture seule dont les types déclarent les types de sommets et de primitives définis par l'utilisateur à exporter à partir du nuanceur. Les modificateurs *vertices*, *indices* et *primitives* désignent chaque paramètre comme l'une des trois sorties géométriques distinctes. La longueur de ces tableaux doit être une constante de compilation et définit le nombre maximal de sommets et de primitives pouvant être exportés.

La fonction intrinsèque [SetMeshOutputCounts](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#setmeshoutputcounts) déclare le nombre réel de sommets et de primitives exportés pour le groupe de threads. Cet appel est facultatif; la valeur par défaut est zéro pour numVerts et numPrims. Ces valeurs doivent être inférieures ou égales aux longueurs des tableaux de sortie. Cet appel peut avoir lieu à tout moment *avant* les écritures dans les tableaux de sortie partagés. Les valeurs fournies sont censées être constantes pour le groupe de threads et seront lues à partir de la première voie.

Les sommets et les primitives sont ensuite transformés par le groupe de threads et écrits dans les tableaux de sortie partagés. L'appel à **SetMeshOutputCounts()** doit être effectué avant toute écriture, et les écritures doivent respecter les limites déclarées par cet appel.

L'exemple de code suivant montre un nuanceur de maillage qui effectue le rendu d'un seul triangle dans l'espace écran.

```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;
    }
}
```

## Nuanceurs d'amplification

Les nuanceurs d'amplification sont compilés avec l'outil en ligne de commande DXC ou la bibliothèque à l'aide du nouveau profil de nuanceur d'amplification « *as* », par exemple *as\_6\_5*.

Voici un exemple de compilation d'un nuanceur d'amplification en ligne de commande.

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

Leur structure est identique à celle des nuanceurs de calcul, à l'exception de l'appel facultatif à la fonction intrinsèque [DispatchMesh](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#dispatchmesh-intrinsic), qui répartit une grappe d'enfants de nuanceur de maillage. L'exemple de code suivant présente un nuanceur d'amplification très générique, simplement pour en montrer la structure globale.

Pour une application complète des nuanceurs d'amplification, consultez [Exemple d'élimination des meshlets](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling).

L'exemple de code suivant montre la structure générique d'un nuanceur d'amplification.

```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);
}
```

## Voir aussi

[Vue d'ensemble du pipeline de nuanceurs de maillage](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-overview)

[Pourquoi les nuanceurs de maillage](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-why)

[Vue d'ensemble de l'API des nuanceurs de maillage](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-api-design)

[Meshlets](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-meshlet-render)

[Exemple d'élimination des meshlets](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-meshlet-culling)


## Related topics

- [Pourquoi les nuanceurs de maillage?](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-why.md)
- [Vue d'ensemble de l'API du pipeline de nuanceurs de maillage](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-api-design.md)
- [Nuanceurs de maillage et meshlets sur la XBOX Series X|S](/fr-CA/build/core-features/graphics/newfeatures/ms/index.md)
- [Répertoire des rubriques NDA : liens actifs vers Microsoft Learn](/fr-CA/nda/nda-topic-directory.md)
- [Vue d'ensemble du pipeline de nuanceurs de maillage](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-overview.md)
