> ## 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 do Direct3D 12 para Variable Rate Shading

> API do Direct3D 12 para Variable Rate Shading

Este tópico foi criado a partir da [especificação do Variable Rate Shading](https://github.com/microsoft/DirectX-Specs/blob/master/d3d/VariableRateShading.md) e atualizado para o hardware do XBOX Series X|S.

## API

A seção a seguir descreve a forma como o Variable Rate Shading (VRS) fica acessível aos aplicativos por meio do Direct3D 12.

### Consulta de funcionalidades

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

Para consultar a funcionalidade de Camada 1, um aplicativo pode, por exemplo:

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

### Taxas de sombreamento

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

Os valores são organizados de modo que as taxas de sombreamento possam ser facilmente decompostas em dois eixos, em que os valores de cada eixo são representados de forma compacta em espaço logarítmico.

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

Permitindo, por exemplo:

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

Por conveniência, isso pode ser usado para decompor e entender 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 )
```

#### Comentários

Essa interpretação dos dados é voltada para descrever a máscara de espaço de tela, que pode ser manipulada por sombreadores. No entanto, não há motivo para não ter uma definição consistente dos tamanhos de pixel grosseiro a serem usados em todos os lugares, inclusive ao definir a taxa de sombreamento no nível de comando.

### Definindo a taxa de sombreamento e os combinadores no nível de comando

A taxa de sombreamento e, opcionalmente, os combinadores são especificados por meio de um método da lista de comandos.

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

### Preparando a imagem de espaço de tela

O estado de recurso somente leitura que designa uma imagem de taxa de sombreamento utilizável é definido da seguinte forma.

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

### Definindo a imagem de espaço de tela

A imagem de espaço de tela é especificada por meio de um método da lista de comandos.

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

Por exemplo:

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

<Info>
  No XBOX Series X|S, você deve fazer a transição da imagem de taxa de sombreamento para o estado legível antes de defini-la (na linha do tempo da GPU).
</Info>

### Consultando o tamanho do bloco

O tamanho do bloco é consultado a partir de uma funcionalidade.

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

Uma dimensão é recuperada, porque as dimensões horizontal e vertical são sempre iguais. Se a funcionalidade do sistema for D3D12\_SHADING\_RATE\_TIER\_NOT\_SUPPORTED, o tamanho de bloco retornado será 0.

## Consulte também

[Visão geral do Variable Rate Shading](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-overview)

[Design do recurso Variable Rate Shading](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-feature)

[Por que usar o Variable Rate Shading?](/pt-BR/build/core-features/graphics/newfeatures/vrs/why-vrs)


## Related topics

- [Variable Rate Shading (VRS) no XBOX Series X|S](/pt-BR/build/core-features/graphics/newfeatures/vrs/index.md)
- [D3D12_FEATURE_DATA_D3D12_OPTIONS6](/pt-BR/reference/graphics/d3d12/structs/d3d12_feature_data_d3d12_options6_public.md)
- [Diretório de tópicos NDA: links ativos do Microsoft Learn](/pt-BR/nda/nda-topic-directory.md)
- [Guia de programação do Direct3D 12](/pt-BR/build/gdk-and-engines/guides/directx-12-programming-guide.md)
- [D3D12_VARIABLE_SHADING_RATE_TIER](/pt-BR/reference/graphics/d3d12/enums/d3d12_variable_shading_rate_tier_public.md)
