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

# API Direct3D 12 de Variable Rate Shading

> API Direct3D 12 de Variable Rate Shading

Cette rubrique a été créée à partir de la [spécification Variable Rate Shading](https://github.com/microsoft/DirectX-Specs/blob/master/d3d/VariableRateShading.md) et mise à jour pour le matériel XBOX Series X|S.

## API

La section suivante décrit la manière dont Variable Rate Shading (VRS) est accessible aux applications via Direct3D 12.

### Interrogation des capacités

```text theme={null}
enum D3D12_SHADING_RATE_TIER
{
    D3D12_SHADING_RATE_TIER_NOT_SUPPORTED,
    D3D12_SHADING_RATE_TIER_1,
    D3D12_SHADING_RATE_TIER_2,
};

struct D3D12_FEATURE_DATA_D3D12_OPTIONS6
{
    BOOL AdditionalShadingRatesSupported; 
    BOOL PerPrimitiveShadingRateIndependentOfViewportUse;
    D3D12_SHADING_RATE_TIER ShadingRateTier;
    UINT ShadingRateImageTileSize;
};

enum D3D12_FEATURE
{
    // ...
    D3D12_FEATURE_D3D12_OPTIONS6
};
```

Pour vérifier la prise en charge du niveau 1 (Tier 1), une application peut par exemple procéder ainsi :

```text theme={null}
// Check that Tier 1 is supported.
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return 
    SUCCEEDED(m_device->CheckFeatureSupport(
        D3D12_FEATURE_D3D12_OPTIONS6, 
        &options, 
        sizeof(options))) && 
    options.ShadingRateTier == D3D12_SHADING_RATE_TIER_1;
```

### Taux d'ombrage

```text theme={null}
enum D3D12_SHADING_RATE
{
    D3D12_SHADING_RATE_1X1 = 0x0, // No change to shading rate.
    D3D12_SHADING_RATE_1X2 = 0x1, // Reduces vertical resolution 2x.
    D3D12_SHADING_RATE_2X1 = 0x4, // Reduces horizontal resolution 2x.
    D3D12_SHADING_RATE_2X2 = 0x5, // Reduces both axes by 2x.
    D3D12_SHADING_RATE_2X4 = 0x6, // Reduce horizontal resolution 2x, vertical by 4x.
    D3D12_SHADING_RATE_4X2 = 0x9, // Reduce horizontal resolution 4x, vertical by 2x.
    D3D12_SHADING_RATE_4X4 = 0xA, // Reduces both axes by 4x.
};
```

Les valeurs sont organisées de sorte que les taux d'ombrage puissent être facilement décomposés selon deux axes, les valeurs de chaque axe étant représentées de manière compacte dans un espace logarithmique.

```text theme={null}
enum D3D12_AXIS_SHADING_RATE
{
    D3D12_AXIS_SHADING_RATE_1X = 0x0,
    D3D12_AXIS_SHADING_RATE_2X = 0x1, 
    D3D12_AXIS_SHADING_RATE_4X = 0x2
};
```

Ce qui permet par exemple :

```text theme={null}
#define D3D12_MAKE_COARSE_SHADING_RATE(x,y) ((x) << 2 | (y))
D3D12_MAKE_COARSE_SHADING_RATE(
    D3D12_AXIS_SHADING_RATE_2X, 
    D3D12_AXIS_SHADING_RATE_1X)
```

Par commodité, ceci peut être utilisé pour décomposer et comprendre SV\_ShadingRate :

```text theme={null}
#define D3D12_GET_COARSE_SHADING_RATE_X_AXIS(x) ((x) >> 2 )
#define D3D12_GET_COARSE_SHADING_RATE_Y_AXIS(y) ((y) & 3 )
```

#### Remarques

Cette interprétation des données vise à décrire le masque en espace écran, qui peut être manipulé par les nuanceurs. Toutefois, rien n'empêche d'utiliser partout une définition cohérente des tailles de pixels grossiers, y compris lors de la définition du taux d'ombrage au niveau de la commande.

### Définition du taux d'ombrage au niveau de la commande et des combinateurs

Le taux d'ombrage et, éventuellement, les combinateurs sont spécifiés via une méthode de la liste de commandes.

```text theme={null}
enum D3D12_SHADING_RATE_COMBINER
{
    D3D12_SHADING_RATE_COMBINER_PASSTHROUGH,
    D3D12_SHADING_RATE_COMBINER_OVERRIDE,
    D3D12_SHADING_RATE_COMBINER_MIN,
    D3D12_SHADING_RATE_COMBINER_MAX,
    D3D12_SHADING_RATE_COMBINER_SUM,
};

class ID3D12GraphicsCommandList5: public ID3D12GraphicsCommandList4
{
public:
    // ...
    virtual void RSSetShadingRate(
        D3D12_SHADING_RATE baseShadingRate, 
        _In_reads_opt_(2) D3D12_SHADING_RATE_COMBINER* combiners) = 0;
};
```

### Préparation de l'image en espace écran

L'état de ressource en lecture seule désignant une image de taux d'ombrage utilisable est défini comme suit.

```text theme={null}
enum D3D12_RESOURCE_STATES
{
    // ...
    D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE
};
```

### Définition de l'image en espace écran

L'image en espace écran est spécifiée via une méthode de la liste de commandes.

```text theme={null}
class ID3D12GraphicsCommandList3: public ID3D12GraphicsCommandList2
{
public:
    // ...
    virtual void RSSetShadingRateImage(ID3D12Resource* image) = 0;
};
```

Par exemple :

```text theme={null}
m_commandList->RSSetShadingRateImage(screenSpaceImage);
```

<Info>
  Sur XBOX Series X|S, vous devez faire passer l'image de taux d'ombrage à l'état lisible avant de la définir (sur la chronologie du GPU).
</Info>

### Interrogation de la taille des vignettes

La taille des vignettes est obtenue à partir d'une capacité.

```text theme={null}
D3D12_FEATURE_DATA_D3D12_OPTIONS6 options;
return 
    SUCCEEDED(m_device->CheckFeatureSupport(
        D3D12_FEATURE_D3D12_OPTIONS6, 
        &options, 
        sizeof(options))) && 
    UINT tileSize = options.ShadingRateImageTileSize;
```

Une seule dimension est récupérée, car les dimensions horizontale et verticale sont toujours identiques. Si la capacité du système est D3D12\_SHADING\_RATE\_TIER\_NOT\_SUPPORTED, la taille de vignette renvoyée est 0.

## Voir aussi

[Vue d'ensemble de Variable Rate Shading](/fr/build/core-features/graphics/newfeatures/vrs/vrs-overview)

[Conception de la fonctionnalité Variable Rate Shading](/fr/build/core-features/graphics/newfeatures/vrs/vrs-feature)

[Pourquoi Variable Rate Shading ?](/fr/build/core-features/graphics/newfeatures/vrs/why-vrs)


## Related topics

- [Variable Rate Shading (VRS) sur XBOX Series X|S](/fr/build/core-features/graphics/newfeatures/vrs/index.md)
- [Répertoire des rubriques NDA : liens actifs vers Microsoft Learn](/fr/nda/nda-topic-directory.md)
- [D3D12_FEATURE_DATA_D3D12_OPTIONS6](/fr/reference/graphics/d3d12/structs/d3d12_feature_data_d3d12_options6_public.md)
- [D3D12_VARIABLE_SHADING_RATE_TIER](/fr/reference/graphics/d3d12/enums/d3d12_variable_shading_rate_tier_public.md)
- [Guide de programmation Direct3D 12](/fr/build/gdk-and-engines/guides/directx-12-programming-guide.md)
