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

# Exemple d'élimination des meshlets

> Exemple d'élimination des meshlets

Nous vous recommandons de lire d'abord la rubrique [Meshlets](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-meshlet-render).

La rubrique Exemple d'élimination des meshlets présente le pseudocode d'une implémentation, dans un nuanceur d'amplification, d'une technique appelée *élimination des meshlets* (meshlet culling). Puisque les primitives d'un meshlet respectent idéalement une cohérence spatiale et d'orientation, nous pouvons stocker des données d'élimination efficaces pour chaque meshlet. Celles-ci peuvent servir à éliminer rapidement une liste de meshlets par rapport à une vue dans un nuanceur d'amplification, et à ne répartir des instances de nuanceurs de maillage que pour les meshlets restants.

La technique commence par un nuanceur d'amplification dans lequel chaque thread traite un seul meshlet. Cela signifie que nous devons répartir ceil(MeshletCount / GROUP\_SIZE) groupes de threads dans la liste de commandes.

Chaque groupe de threads du nuanceur d'amplification est ensuite responsable du traitement de GROUP\_SIZE meshlets. Chaque thread élimine son meshlet par rapport au tronc de la vue, détermine son emplacement d'exportation, puis écrit son index dans les données de charge utile. Il utilise ensuite [DispatchMesh](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#dispatchmesh-intrinsic) pour répartir un groupe de threads de nuanceur de maillage pour chaque meshlet restant à afficher. Chaque groupe de threads de nuanceur de maillage charge ensuite son meshlet à partir des données de charge utile et exporte sa géométrie.

L'exemple complet se trouve sur la [page XBOX Developer Downloads](https://aka.ms/xgddl).

## Nuanceur d'amplification

La structure du nuanceur d'amplification est identique à celle des nuanceurs de calcul, mais se termine par au plus un appel à 'DispatchMesh(…)'. D'abord, chaque thread charge son meshlet et l'élimine par rapport à la vue. Ensuite, une routine de compactage est exécutée pour déterminer l'emplacement d'écriture final de chaque thread. Cela fournit également le nombre final de meshlets non éliminés pour le groupe de threads. Enfin, l'index du meshlet est écrit dans les données de charge utile groupshared, et DispatchMesh est appelée avec le nombre de meshlets restants et les données de charge utile.

L'exemple suivant présente, en pseudocode, un nuanceur d'amplification qui implémente l'élimination des meshlets.

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

## Nuanceur de maillage

Le nuanceur de maillage du pipeline est très semblable au rendu de meshlets au moyen d'un pipeline composé uniquement d'un nuanceur de maillage, sauf que nous lisons l'index du meshlet du groupe de threads à partir des données de charge utile. Les données de charge utile sont les mêmes que celles qui ont été construites et exportées par le nuanceur d'amplification précédent. Les GroupID et DispatchThreadID sont localisés au groupe de nuanceurs de maillage réparti par le groupe de threads du nuanceur d'amplification appelant, et ils partagent tous les mêmes données de charge utile.

Cet exemple de code présente le nuanceur de maillage qui suit le nuanceur d'amplification précédent.

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

```

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


## Related topics

- [Nuanceurs de maillage et meshlets sur la XBOX Series X|S](/fr-CA/build/core-features/graphics/newfeatures/ms/index.md)
- [Meshlets](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-meshlet-render.md)
- [Pourquoi les nuanceurs de maillage?](/fr-CA/build/core-features/graphics/newfeatures/ms/ms-why.md)
- [Annexe sur la présence enrichie](/fr-CA/services/xbox-services/community/presence/concepts/live-presence-apx.md)
- [Principes essentiels d'efficacité énergétique des jeux XBOX](/fr-CA/build/game-principles/sustainability/energy-efficiency-essentials.md)
