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

# Sombreamento de taxa variável e iluminação esparsa

> Sombreamento de taxa variável e iluminação esparsa

Este tópico descreve o sombreamento de taxa variável (VRS) e a iluminação esparsa. O VRS é um novo recurso de hardware e software do Direct3D 12 para alocar desempenho/potência de renderização em taxas variadas ao longo de uma imagem renderizada. Esse recurso leva a um desempenho aprimorado. Visualmente, a redução da taxa de sombreamento tem pouco ou nenhum efeito na qualidade perceptível da saída.

O Microsoft Game Development Kit (GDK) de novembro de 2019 para XBOX Series X|S inclui suporte ao VRS Tier 2 no hardware do XBOX Series X|S.

<Note>
  Estas informações eram atuais em novembro de 2019. Vários recursos podem ter sido alterados ou atualizados desde então.
</Note>

<a id="introduction" />

## Introdução: VRS

A saída em 1080p e resoluções maiores resultou no desenvolvimento de técnicas de renderização que reduzem a carga de sombreamento de pixels. Essas técnicas incluem o seguinte:

* Renderização foveada em realidade virtual
* Renderização em tabuleiro de xadrez (checkerboard)
* Upscaling temporal

O VRS foi o próximo passo lógico nessa progressão. O VRS para PCs foi lançado em março de 2019. Atualmente, ele está disponível no DirectX 12 e no Windows 10 usando as tecnologias Intel Ice Lake (Tier 1) e NVIDIA Turing (Tier 2). A AMD está produzindo placas gráficas aprimoradas para PCs criadas com a nova microarquitetura RDNA2 no período de fim de ano de 2020.

Para obter mais informações sobre o VRS, confira o seguinte:

**Microsoft Game Dev**

* [Variable Rate Shading Update XBOX Series Consoles](https://www.youtube.com/watch?v=pPyN9r5QNbs)
* [Tier 2 Variable Rate Shading in Gears](https://www.youtube.com/watch?v=-exWLpgnOJ4)

**Game Developers Conference (GDC) 2019**

* Microsoft: [Boost Rendering Performance with Variable Rate Shading](https://www.youtube.com/watch?v=f-SklVb2MDI)
* Microsoft: [DirectX: Variable Rate Shading, A Deep Dive](https://www.youtube.com/watch?v=2vKnKba0wxk)
* NVIDIA: [Adaptive Shading Overview](https://www.gdcvault.com/browse/gdc-19/play/1026205)

**Siggraph 2019**

* Intel: [Using Variable Rate Shading to improve the user experience](https://www.intel.com/content/www/us/en/developer/videos/use-variable-rate-shading-vrs-to-improve-the-user-experience-in-real-time-game-engines.html)

**Publicações**

* [Visually Lossless Content and Motion Adaptive Shading in Games](http://www.leiy.cc/publications/nas/nas-pacmcgit.pdf)

**Exemplos**

* [PC GitHub: exemplo de sombreamento de taxa variável do Direct3D 12](https://github.com/microsoft/DirectX-Graphics-Samples/tree/develop/Samples/Desktop/D3D12VariableRateShading)

### Metas de design do VRS

1. Taxas de sombreamento selecionáveis localmente para ajustar o equilíbrio entre a qualidade e o desempenho do jogo:
   * Qualidade total onde necessário.
   * Meia taxa, a mesma taxa da renderização em tabuleiro de xadrez.
   * Um quarto da taxa ou até menos.
2. Profundidade, estêncil e cobertura são sempre em taxa total, com bordas perfeitas.
3. O VRS é fácil de integrar a um mecanismo existente usando os mesmos sombreadores, com ou sem o VRS ativado.
4. Sem preenchimento de buracos, sem passes ou buffers adicionais e sem suposições.
5. A aparência suave e cinematográfica não é imposta. Visuais extremamente nítidos são possíveis.
6. Compatível com upscaling temporal e suavização de serrilhado multiamostra (MSAA).

### Escalabilidade local

O VRS pode reduzir seletivamente a taxa de sombreamento em áreas de detalhes de textura de baixa frequência. Por exemplo:

* Áreas com desfoques, como profundidade de campo, desfoque de movimento e bloom
* Situações de pouca iluminação ou saturação de luz
* Oclusão parcial, como transparências, neblina, água, nuvens, atrás de folhagens ou elementos do heads-up display (HUD)
* Detalhes de textura de baixa frequência, como partículas e transparências em meia resolução

Áreas que geralmente não são notadas. Por exemplo:

* Bordas da tela
* Áreas seguras de rastreamento ocular em realidade virtual
* Objetos em movimento rápido

**Figura 1. As taxas de sombreamento controlam as invocações do pixel shader (PS) por pixel.**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s09.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=a39a4fafb64127b546ad81ac4b84c325" alt="As taxas de sombreamento controlam as invocações do pixel shader por pixel" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s09.png" />

A Figura 1 mostra quatro taxas de sombreamento do VRS.

* Taxa 1 × 1: uma invocação de PS por pixel. Sombreia todos os pixels.
* Taxa 2 × 1: meia invocação de PS por pixel. Mais detalhes na vertical.
* Taxa 1 × 2: meia invocação de PS por pixel. Mais detalhes na horizontal.
* Taxa 2 × 2: um quarto de invocação de PS por pixel. Um quarto da taxa.

Especifique a taxa do sombreador usando um dos métodos a seguir.

### Fontes da taxa de sombreamento

Há três maneiras de especificar a taxa do sombreador.

* Por chamada de desenho:
  * Tier 1 em PCs com Windows.
  * [RSSetShadingRate](/pt-BR/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist5/methods/id3d12graphicscommandlist5_rssetshadingrate_public) define a taxa de sombreamento base e os combinadores para o VRS.
* Por vértice provocador ou primitiva:
  * Tier 2 em PCs com Windows e no XBOX Series X|S.
  * Exportação usando [SV\_ShadingRate](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-feature).
* Mapa de espaço de tela:
  * Tier 2 em PCs com Windows e no XBOX Series X|S.
  * [RSSetShadingRateImage](/pt-BR/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist5/methods/id3d12graphicscommandlist5_rssetshadingrateimage_public) define a imagem de taxa de sombreamento de espaço de tela para o VRS.
  * `R8_UINT` por bloco que contém enumerações [D3D12\_SHADING\_RATE](/pt-BR/reference/graphics/d3d12/enums/d3d12_shading_rate_public).
  * O aplicativo consulta o tamanho do bloco, que pode ser 8 × 8, 16 × 16 ou 32 × 32.

**Figura 2. Fontes e combinadores da taxa de sombreamento.**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s11.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=78b09a61b42fb899f54e35173f4e9df8" alt="Fontes e combinadores da taxa de sombreamento" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s11.png" />

A Figura 2 mostra um exemplo de fontes e combinadores com três fontes e um conjunto de dois combinadores.

1. O primeiro combinador recebe as taxas de sombreamento da chamada de desenho e a exportação do vértice por parâmetro ou do vértice provocador.
2. O segundo combinador recebe os resultados do primeiro combinador e os combina com o mapa de espaço de tela.
3. A taxa de sombreamento final vai para o rasterizador.

**Figura 3. API de combinadores.**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s12.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=75f403128d82b12e1ff2dfcfd68d7db6" alt="API de combinadores" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s12.png" />

A Figura 3 mostra as chamadas da API de combinadores da Figura 2. Defina os combinadores para obter os resultados desejados.

**Figura 4. Resultado do VRS.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s13.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=ef34bb00a98da103c387c1d318a471d7" alt="Resultado do VRS" width="1280" height="724" data-path="images/gdk/features/graphics/xf19-gr08-s13.webp" />

A Figura 4 mostra uma cena renderizada com taxa variável em 4K, um tamanho de bloco de 8 × 8 e sem suavização de serrilhado temporal (TAA). Essa cena foi renderizada com muitas reduções da taxa de sombreamento.

**Figura 5. Taxa de sombreamento por bloco.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s14.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=9591c04ff382b906e4b21636d8a6a94a" alt="Taxa de sombreamento por bloco" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s14.webp" />

A Figura 5 mostra a mesma cena usando um filtro Sobel e votação por bloco.

A taxa 1 × 1 é vermelha. A taxa 2 × 1 é ciano e tem mais detalhes verticais, mostrando os detalhes de textura nas paredes à esquerda e à direita. A taxa 1 × 2 é amarela e tem mais detalhes horizontais. A taxa 2 × 2 é preta.

**Figura 6. Área ampliada.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s16.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=3b46cd7f2802c2b0f36aa63b490f215a" alt="Área ampliada" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s16.webp" />

A Figura 6 amplia as pedras na parede do fundo da Figura 5 em uma área de 160 × 168 pixels. Isso corresponde a cerca de 0,3% da cena 4K original.

* O sinal do VRS está no lado esquerdo da Figura 6.
* A imagem de *referência (ground truth)*, renderizada inteiramente com a taxa 1 × 1, está no meio da Figura 6.
* As imagens da taxa de sombreamento e do erro absoluto estão no lado direito da Figura 6.

**Figura 7. Área ampliada: taxa 1 × 1.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s16a.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=f01fbb0560c5ef8a35162f1be3bf346b" alt="Área ampliada: taxa 1 x 1" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s16a.webp" />

A Figura 7 mostra onde o sombreador que estava gerando a taxa do sombreador usou a taxa total 1 × 1. Observe que isso foi feito em áreas de alto contraste. Observe também que o sombreador identificou o reflexo especular na parte superior das pedras afetadas.

**Figura 8. Área ampliada: taxa 2 × 2.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s16b.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=7f318ae26c90fc823db35eaf2f25f160" alt="Área ampliada: taxa 2 x 2" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s16b.webp" />

A Figura 8 mostra onde o sombreador usou a taxa 2 × 2 na superfície das pedras. Observe a redução na qualidade do sombreamento para o sinal do VRS.

**Figura 9. Área ampliada: várias taxas de sombreamento.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s16c.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=de3246ad3559ad475a83c5cce7ecfd5f" alt="Área ampliada: várias taxas de sombreamento" width="1280" height="723" data-path="images/gdk/features/graphics/xf19-gr08-s16c.webp" />

A Figura 9 mostra áreas em que várias taxas de sombreamento foram usadas em seções danificadas da superfície das pedras.

**Figura 10. Área ampliada: meias taxas.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s16d.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=c1eff56f22b243944f45c97b9f91699d" alt="Área ampliada: " width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s16d.webp" />

A Figura 10 mostra áreas em que o sombreamento de meia taxa foi usado. Ele é útil para preservar detalhes em uma área específica. Sem o sombreamento de meia taxa, você precisa usar o sombreamento de taxa total.

**Figura 11. Quanto sombreamento fizemos?**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s17.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=0f3715de6e310f4ff740575fa357325d" alt="Quanto sombreamento fizemos?" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s17.png" />

A Figura 11 mostra a quantidade de sombreamento feita durante a renderização da tela. A seção ampliada tem 20 × 21 blocos (160 × 168 pixels).

* 94 blocos de taxa total (vermelho)
* 143 blocos de meia taxa (ciano/amarelo)
* 183 blocos de um quarto da taxa (preto)

Invocações de PS em 8 × 8 pixels por bloco:

* Sem VRS = 26.880 threads de PS
* Com VRS = 13.520 threads de PS
* Invocações de PS divididas pelo número de pixels = 0,503

### Derivando o mapa de espaço de tela

Recomendamos que você use o último quadro para prever o quadro atual. Por exemplo, o último quadro informará:

* Onde você aplicará a profundidade de campo.
* Onde ocorre o desfoque de movimento.
* Que há uma área de pouca luz ou uma área de saturação de luz.

Um resumo do exemplo anterior (Figura 4 a Figura 11):

* Começou com um filtro Sobel.
* Os resultados foram obtidos sem usar reprojeção de movimento.
* Os kernels de convolução X e Y foram verificados em relação ao gradiente e à luminância e, em seguida, comparados a uma taxa.
* Votação por bloco sobre qual taxa de sombreamento usar.
* Se o resultado da comparação for diferente de zero para X ou Y, a taxa será 2 × 1 ou 1 × 2.
* Recomendamos que você use intrínsecos entre lanes (cross-lane).

O resultado é um processo com uma pequena superfície de API, sem alterações nos sombreadores e sem alterações no MSAA. Um passe de reconstrução não é necessário. A superfície do VRS está completa e pronta para renderizar.

<Note>
  Para obter um filtro atualizado, confira o exemplo VRSandSparseLighting nos [exemplos de console do Microsoft GDK](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics).
</Note>

**Figura 12. Alteração no local de invocação do PS.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s19.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=fb1f1a84b9777ccd12ea7ffb7cf8c230" alt="Alteração no local de invocação do PS" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s19.webp" />

A Figura 12 compara a imagem de referência na taxa 1 × 1 com um sinal do VRS da mesma cena.

O VRS altera o local de invocação do PS, e isso pode criar problemas. Por exemplo:

* O VRS pode capturar detalhes que não estão na imagem de referência.
* Diferentes taxas de sombreamento podem capturar ou perder detalhes de subpixel.

Detalhes de subpixel, ou subamostragem, podem ser um problema.

* Serrilhado temporal quando a câmera está se movendo:
  * Neste exemplo, temos problemas de serrilhado temporal mesmo sem o VRS.
* As taxas grosseiras do VRS podem piorar a subamostragem.
  * Os gradientes de textura são mais longos em cada eixo grosseiro.
  * A seleção de mip inferior é automática e tem serrilhado aprimorado.
  * Usar níveis de detalhe (LODs) de malha melhora o desempenho.
  * Tenha cuidado ao usar serrilhado de sombreador.
  * Use o TAA para resolver problemas de renderização por subamostragem.

<a id="vrs-on-pc" />

### Taxas de sombreamento

As taxas 1 × 1, 2 × 1, 1 × 2 e 2 × 2 são o conjunto mínimo de recursos do VRS. Os PCs têm um recurso adicional usando [AdditionalShadingRatesSupported](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-feature), que dá suporte às taxas de sombreamento 2 × 4, 4 × 2 ou 4 × 4. As taxas 2x parecem ser as mais eficazes. Com as taxas 2x, pode ser difícil encontrar degradação de qualidade. Isso é especialmente verdadeiro com as taxas 2 × 1 e 1 × 2. Com as taxas 4x, é muito mais fácil ver diferenças na renderização, mas elas são mais difíceis de usar. As vantagens de desempenho diminuem ao usar taxas 4x.

A seguir estão os resultados de desempenho do NVIDIA Tier 2 com o mapa de espaço de tela.

**Wolfenstein II: The New Colossus**

* O modo equilibrado tem uma melhoria de 6% em quadros por segundo (FPS).
* O modo de desempenho tem uma melhoria de 9-10% em FPS.
* Fonte: Digital Foundry

**Civilization VI**

* Redução de 8-17% no tempo total de quadro.

<Note>
  Para conhecer os ganhos de desempenho em DOOM Eternal e Gears 5 e obter informações atualizadas, confira o vídeo a seguir:
</Note>

[Variable Rate Shading Update XBOX Series Consoles](https://www.youtube.com/watch?v=pPyN9r5QNbs).

<a id="term-anaconda-and-term-lockhart-vrs-tier2x" />

## VRS Tier 2.x do XBOX Series X|S

### Suporte nos consoles XBOX Series X|S

Os consoles XBOX Series X|S implementaram a especificação Tier 2 para PC no Microsoft Game Development Kit (GDK) de novembro de 2019 com os seguintes recursos e exceções.

Recursos:

* Taxas de sombreamento 1 × 1, 1 × 2, 2 × 1 e 2 × 2
* Mapa de espaço de tela

Exceções:

* Sem capacidade de modo 4x.
* A saída da máscara de cobertura está incorreta no momento se você usar MSAA. Uma correção está planejada para esse problema de saída.
  * A entrada [SV\_Coverage](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-feature) funciona corretamente.
* O hardware não implementa um centroide em conformidade com a especificação.
* A [exibição de destino de renderização](/pt-BR/reference/graphics/d3d12/structs/d3d12_render_pass_render_target_desc_public) (RTV) é permitida no mapa de imagem de taxa de sombreamento.

### Extensões XBOX do XBOX Series X|S

O suporte está planejado para:

* Supersampling com MSAA.
* Deslocamentos de posição de amostra.
* Combinadores extras.
* Taxa de sombreamento por primitiva com vários visores.
* Exportação da taxa de sombreamento a partir do sombreador de domínio.
* Superfície de feedback da taxa de sombreamento.

Informe-nos suas prioridades de recursos usando os fóruns do Microsoft Game Development Kit (GDK).

### Supersampling com MSAA

O XBOX Series X|S dá suporte às taxas de sombreamento de supersampling 2x e 4x. Por exemplo, elas são usadas no MSAA 8x. O conjunto de possíveis invocações de PS por pixel é o seguinte.

* 0.25
* 0.5
* 1
* 2
* 4
* 8

Uma invocação de PS por taxa 2 × 2 é a taxa mais grosseira possível. Com MSAA 8×, ela é efetivamente uma taxa de 1/32, ou 1 invocação de PS transmitida para 4 pixels × 8 amostras.

**Figura 13. Matriz completa das taxas de sombreamento do XBOX Series X|S.**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s28.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=02eb9665d7add02b6eff85b7dd3b09fc" alt="Matriz completa das taxas de sombreamento do XBOX Series X|S" width="1280" height="721" data-path="images/gdk/features/graphics/xf19-gr08-s28.png" />

A Figura 13 mostra uma matriz das taxas de sombreamento do XBOX Series X|S que considera o domínio de supersampling. A matriz mostra o número de invocações de PS por pixel. Observe que não há modos retangulares no domínio de supersampling.

### HTile e o mapa de espaço de tela

No XBOX Series X|S, a taxa de sombreamento é gravada em um mapa de espaço de tela, que é então transcodificado em [HTile](/pt-BR/reference/graphics/d3d12_xs/enums/d3d12xbox_shading_rate_settings_htile_mode_type), onde o rasterizador lê a taxa de sombreamento.

* O tamanho do bloco é sempre 8 × 8. Nenhuma consulta é necessária.
* O bloco é lido durante a rasterização. Nenhuma largura de banda extra é necessária.
* Uma extensão XBOX poderia realizar uma limpeza de profundidade e definir o mapa de taxa de sombreamento em um único passe. Isso melhora o desempenho.

#### Duas novas codificações de HTile

Duas novas codificações de HTile com Stencil estão disponíveis agora.

* Sem suporte à taxa de sombreamento de supersampling:
  * Os bits livres 10-11 no Stencil do HTile são usados para armazenar a taxa de sombreamento.
* Com suporte à taxa de sombreamento de supersampling:
  * São necessários quatro bits para a taxa de sombreamento. O HTile perde seu segundo pré-teste Hi-Stencil (bits 6-7). O primeiro pré-teste permanece.

No Microsoft Game Development Kit (GDK) de novembro de 2019, todos os HTiles usam a segunda codificação. No futuro, espere um sinalizador de recurso "nunca VRS" que retorna um formato de HTile "sem estêncil" para precisão extra. O suporte ao primeiro formato de HTile será adicionado ao Microsoft Game Development Kit (GDK).

### Detalhes de implementação do XBOX Series X|S

Quando `RSSetShadingRateImage` é chamado, ele transcodifica o conteúdo em um HTile. Se não houver um HTile associado, um HTile temporário será alocado do alocador de comandos da lista de comandos. Isso habilita o VRS sem profundidade. O VRS pode ser usado para coisas como pós-processamento. Se a alocação falhar por falta de memória, o VRS será desativado.

Se você alterar a exibição de estêncil de profundidade (DSV), recomendamos que chame primeiro `RSSetShadingRateImage(nullptr)`. Caso contrário, você poderá pagar o custo de transcodificação novamente se a DSV tiver as mesmas dimensões.

Uma RTV maior que 4K falha. Uma correção para esse problema está planejada para o Microsoft Game Development Kit (GDK) de abril de 2020.

### O XBOX Series X|S tem combinadores extras

**Figura 14. O XBOX Series X|S tem combinadores extras.**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s32.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=ff631fff6f8d37a757d067c2315e0c20" alt="O XBOX Series X|S tem combinadores extras" width="1280" height="721" data-path="images/gdk/features/graphics/xf19-gr08-s32.png" />

A Figura 14 mostra os combinadores adicionais do XBOX Series X|S. Podemos expô-los se houver demanda.

### Local de invocação do PS

O hardware do XBOX Series X|S dá suporte a deslocamentos de amostra no centro, no centroide e programáveis, que podem alterar o local de invocação do pixel shader.

* Deslocamento de 4 bits para cada taxa de sombreamento
* O local em que o PS é invocado pode mudar a cada ciclo de quadro

### Incompatibilidades do VRS

Há algumas coisas que são incompatíveis com o VRS e o desativam no XBOX Series X|S. Isso ocorre quando o local do PS não se alinha com a amostra de profundidade ou com a amostra de estêncil.

* Máscara de cobertura pós-profundidade
* [Raster Order Views](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-feature) (ROVs)
* Importação de [SV\_Depth](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-feature)
  * Passe por meio do interpolador. Confira a definição do compilador de sombreador `__XBOX_SV_POS_ZW_VIA_ATTRIBUTE`, que faz isso para você.
* Gravação de `SV_Depth` ou [SV\_StencilRef](/pt-BR/build/core-features/graphics/newfeatures/vrs/vrs-feature)

### Extensão Shading Rate Feedback Surface

A extensão Shading Rate Feedback Surface faz o seguinte:

* Usa 2 bits de [cmask](/pt-BR/build/core-features/graphics/overviews/cmask-decoding)
* Registra se um triângulo foi renderizado em uma taxa fina ou grosseira em cada eixo
* Remove a funcionalidade de limpeza rápida de `cmask`
* É incompatível com o processo `cmask` para composição rápida

### Resumo do suporte por plataforma

**Figura 15. Suporte por plataforma.**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s36.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=99dcf851de13981e357bc1dd13e6f461" alt="Suporte por plataforma" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s36.png" />

A Figura 15 mostra o suporte a recursos de cada plataforma.

<Note>
  Estas informações eram atuais em novembro de 2019. Vários recursos podem ter sido alterados ou atualizados desde então.
</Note>

Esteja ciente do seguinte:

* O XBOX Series X|S dá suporte à maior quantidade de conjuntos de recursos.
* Com recursos pequenos, é melhor usar blocos 8 × 8 em vez de blocos 16 × 16, pois eles aumentam a taxa de sombreamento para menos pixels.

<a id="term-scarlett-hardware-performance-optimizations" />

## Otimizações de desempenho de hardware do XBOX Series X|S

As melhorias de desempenho do XBOX Series X|S precisam ser feitas em conjunto com uma redução nas cargas do pixel shader.

### Operações de bloco de cor

No pipeline gráfico lógico, um bloco de cor é uma das duas últimas operações lógicas antes da saída de renderização.

**Caminhos lentos**

Quando a RTV tem mais de 32 bits por pixel (bpp) ou a mesclagem está habilitada:

* Sem VRS, há 4 pixels por ciclo de clock por back-end de renderização (RB).
* Com VRS, há 4 pixels por ciclo de clock por RB. No entanto, a transmissão de grosseiro para fino leva *n* ciclos adicionais, em que *n* é igual ao número de pixels cobertos.

**Caminhos rápidos**

Quando a RTV tem 32 bpp ou menos e a mesclagem não está habilitada:

* Sem VRS, você pode usar o back-end de renderização otimizado (RB+) com uma taxa 2x, que equivale a 8 pixels por ciclo de clock por RB.
* Com VRS, há 4 pixels por ciclo de clock por RB para uma taxa 1 × 1.
* No entanto, o bloco de cor pode carregar lateralmente cópias de transmissão adicionais.
  * 4 pixels por ciclo de clock para uma taxa 2 × 1.
  * 8 pixels por ciclo de clock para uma taxa 1 × 2.
  * 8 pixels por ciclo de clock para uma taxa 2 × 2.

Há um limite de 16 pixels por ciclo de clock por RB.

O trabalho do pixel shader agora é aprimorado porque o bloco de cor pode processar cópias adicionais.

### RSSetShadingRate

Para usar o RB+, desative o VRS chamando `RSSetShadingRate(D3D12_SHADING_RATE_1x1, nullptr);`. Observe que `RSSetShadingRate` não altera o contexto (roll a context).

### VRS e compressão de cor delta

A compressão de cor delta (DCC) agora tem um modo compatível com VRS que reduz a largura de banda.

* O VRS gera um sinal que é mal compactado com a DCC normal.
  * Exemplo de sinal: âncora, delta, delta zero, delta, delta zero. Repetir.
* Um modo compatível com VRS foi adicionado à DCC.
* Otimizado para compactação próxima de 4:1 na taxa 2 × 2.
* Proporções significativamente melhores para as taxas 2 × 1 e 1 × 2.

<a id="sparse-lighting-or-sparse-deferred-passes" />

## Iluminação esparsa

O VRS grava valores duplicados do g-buffer e os ilumina. Processar dados duplicados do g-buffer é um desperdício.

### Iluminação esparsa: explorando o sinal do VRS

Para evitar desperdício de desempenho, examine os g-buffers em busca de valores duplicados e, em seguida, identifique e ilumine apenas um subconjunto de pixels. Por exemplo, em um quad de 2 × 2 pixels:

* 1 pixel para uma taxa 2 × 2
* 2 pixels para uma taxa 1 × 2 ou 2 × 1 (padrão de tabuleiro de xadrez)
* 4 pixels para uma taxa 1 × 1

### Exemplo de implementação de iluminação esparsa

Um exemplo que usa um tamanho de bloco de 16 × 16 e um tamanho de grupo de 8 × 8 é o seguinte.

1. O thread do sombreador de computação compara os valores do g-buffer a cada 2 × 2 pixels.
2. Em seguida, ele grava de 1 a 4 coordenadas por thread. Cada uma tem 32 bits por coordenada.
   * 4 bits para a coordenada x relativa ao bloco.
   * 4 bits para a coordenada y relativa ao bloco.
   * 3 bits que indicam se o valor deve ser copiado em x, em y ou na diagonal (para preencher buracos).
   * 21 bits são suficientes para um valor de profundidade.
3. Uma das saídas é a contagem do número de operações de iluminação necessárias por bloco de tela.

<Note>
  Para obter informações atualizadas, confira o seguinte:
</Note>

[Variable Rate Compute Shaders - Halving Deferred Lighting Time](https://www.youtube.com/watch?v=Sswuj7BFjGo).

[Exemplo VRSandSparseLighting](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics).

### Sombreador de iluminação adiada

O sombreador de iluminação adiada agora despacha uma wave por thread de bloco em vez de um thread por pixel.

1. A wave percorre `tileCount` *n* vezes. O desempenho melhora quando você remove operações de iluminação iguais ou superiores ao trabalho de uma wave. Ao considerar o desempenho de Wave32 em relação ao de Wave64:
   * Wave32 produz um ganho de velocidade quando há 224 pixels ou menos para iluminar.
   * Wave64 produz um ganho de velocidade quando há 194 pixels ou menos para iluminar.
2. O thread lê 32 bits, descompactando coordinate.xy e a profundidade.
3. Faça a iluminação como você faria normalmente. As listas de luzes continuam invariantes na wave.
4. Termine com até três cópias de transmissão do resultado iluminado.
   * Um bit para cada cópia horizontal, vertical e diagonal.
   * XOR1 é usado para calcular destination.xy para cada uma das três cópias.
   * O preenchimento de buracos é perfeito, pré-calculado e barato.

**Figura 16. Resultado com iluminação esparsa e contagem de operações de iluminação.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s47.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=a7c0e07d988e915ebd239696439f5bb5" alt="Resultado com iluminação esparsa e contagem de operações de iluminação" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s47.webp" />

A Figura 16 mostra, à esquerda, uma imagem 4K da cabeça de um leão de pedra com iluminação esparsa. O buffer de contagem está à direita. Ele mostra uma redução significativa nas operações de iluminação. Os g-buffers da pedra foram testados quanto a valores duplicados exatos com um pequeno intervalo de profundidade permitido (delta permitido de LinearZ de 0,001).

**Figura 17. Resultado iluminado, sem preenchimento de buracos.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s48.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=b2664ba0a28ccdf5cffaf9c5bb9c929b" alt="Resultado iluminado, sem preenchimento de buracos" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s48.webp" />

A Figura 17 mostra uma imagem ampliada do globo ocular do leão sem preenchimento de buracos.

* Os buracos são pixels pretos.
* 1 × 1 e todas as amostras são iluminadas.
* 2 × 1 e 1 × 2 se parecem com tabuleiros de xadrez.
* 2 × 2 ilumina uma amostra em cada quatro.

Observe que a malha de arame (wireframe) está visível. O problema aqui é que a taxa de sombreamento solicitada não é necessariamente a taxa de sombreamento que ocorre.

Por exemplo, considere um quad de 2 × 2 pixels sombreado na taxa 2 × 2. Isso pode gerar de uma a quatro invocações de PS com zero de overdraw.

* Uma invocação se o quad de pixels for coberto por um único triângulo.
* Quatro invocações se o quad for coberto por quatro triângulos.

LODs de malha ruins geram resultados ruins de VRS.

**Figura 18. Comparação do g-buffer com delta adicionado de 0,025.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s50.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=71fa94f7657735e3c44876cf4bb1764f" alt="Comparação do g-buffer com delta adicionado de 0,025" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s50.webp" />

A Figura 18 mostra o resultado de adicionar um pequeno delta permitido nos valores durante a comparação do g-buffer. Os valores de normais estão à esquerda. Os valores de albedo estão à direita. Adicionar o pequeno delta reduziu o número de operações de iluminação e eliminou a malha de arame. A luma dessas imagens corresponde aproximadamente ao número de cálculos de iluminação. Isso se aproxima do conjunto ideal de pixels a iluminar: 1, 2, 3 ou 4 por taxa 2 × 2.

**Figura 19. Correspondência exata do g-buffer.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s51.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=51a23192502f48c75d4baf5121e5e1f1" alt="Correspondência exata do g-buffer" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s51.webp" />

A Figura 19 mostra a imagem da cabeça do leão com os buracos preenchidos. É difícil notar a diferença entre as duas, mesmo quando ampliadas.

### Exame do g-buffer com otimizações específicas do XBOX Series X|S

<Note>
  Há uma implementação aprimorada que não envolve examinar o conteúdo do g-buffer. Para obter mais informações, confira o vídeo e o exemplo a seguir.
</Note>

[Variable Rate Compute Shaders - Halving Deferred Lighting Time](https://youtu.be/Sswuj7BFjGo?t=859)

Exemplo [VRSandSparseLighting](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics)

O exame do g-buffer é caro. As otimizações específicas do XBOX Series X|S incluem o seguinte:

1. Leia o mapa de taxa de sombreamento. Use o caminho rápido para blocos de taxa total e processe todos os pixels.
2. Aproveite a superfície `cmask` de feedback da taxa de sombreamento. Use o caminho rápido para blocos de taxa reduzida cobertos por um único triângulo.
3. Para os blocos restantes:
   1. Leia a chave de DCC e, em seguida, explore os deltas zero.
   2. Faça um exame do g-buffer.
      * Use o hash do g-buffer para otimização. Isso tem um custo de armazenamento e largura de banda.
      * Combine a leitura do g-buffer com passes que estejam fazendo outra coisa, como ler a profundidade.

**Figura 20. Economia da iluminação esparsa em comparação com a iluminação adiada normal em 4K.**

<img src="https://mintcdn.com/microsoft-4404708b/nPGvaZX_dCfrbYxW/images/gdk/features/graphics/xf19-gr08-s53.webp?fit=max&auto=format&n=nPGvaZX_dCfrbYxW&q=85&s=54b35f4d5c535a63fc5a0b7c5abb0427" alt="Economia da iluminação esparsa em comparação com a iluminação adiada normal em 4K" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s53.webp" />

A Figura 20 mostra renderizações de cenas que comparam a economia da iluminação esparsa com a iluminação adiada em 4K.

* `cmask` e DCC não foram usados nessas cenas.
* A figura não inclui a economia do VRS nem do tempo de rasterização.
* A descontinuidade de profundidade ao redor dos pilares causa uma grande partição de profundidade e uma contagem de luzes maior.
* Na cena inferior, a contagem de luzes é relativamente baixa.
* A cena superior tem o maior tempo total decorrido. A cena inferior tem o menor tempo total decorrido. As melhorias escalam favoravelmente com a complexidade da cena.

<a id="integration-with-other-techniques" />

## Integração com outras técnicas

### VRS, dimensionamento dinâmico de resolução e upscaling temporal

O VRS não substitui o dimensionamento dinâmico de resolução (DRS).

* É possível reduzir a taxa de sombreamento quando o tempo de quadro ultrapassa o tempo de quadro desejado.
* As melhorias do VRS são imprevisíveis. Elas dependem do conteúdo da cena. Outros fatores incluem a iluminação.
* O DRS tem um efeito maior e mais previsível no tempo de quadro.

As melhorias do VRS são um bônus.

* Não substitua o DRS. Em vez disso, ajude o DRS a atingir resoluções mais altas.
* Use o upscaling temporal para a resolução de saída.

**Figura 21. VRS versus renderização em tabuleiro de xadrez no XBOX Series X|S.**

<img src="https://mintcdn.com/microsoft-4404708b/bbcb-wO6G9v_h7Cf/images/gdk/features/graphics/xf19-gr08-s56.png?fit=max&auto=format&n=bbcb-wO6G9v_h7Cf&q=85&s=877965ce7f3224ac103e4b17c9331cd2" alt="VRS versus renderização em tabuleiro de xadrez no XBOX Series X|S" width="1280" height="720" data-path="images/gdk/features/graphics/xf19-gr08-s56.png" />

A Figura 21 compara o VRS e a técnica de renderização em tabuleiro de xadrez no XBOX Series X|S.

### Fatores de desempenho do VRS

O desempenho do VRS depende de vários fatores. Eles incluem:

* Eficiência da rasterização. Parallax, relief e cone-step mapping são preferíveis.
* Conteúdo da cena.
* Sobrecarga do cálculo da taxa de sombreamento.
* Custo do PS e gargalos de hardware posteriores.
* Suas preferências pessoais de desempenho versus qualidade.

### Taxas de sombreamento por triângulo/por chamada de desenho

As taxas de sombreamento por triângulo/por chamada de desenho são um ótimo aprimoramento de desempenho. Elas reduzem o custo da GPU em comparação com o mapa de espaço de tela.

**Por chamada de desenho:**

* Partículas e objetos em movimento rápido são renderizados no mapa de reflexo.
* Determine se o objeto está atrás de uma translucidez.

**Por triângulo:**

* Determine se o triângulo está no lado oposto de uma superfície de água em relação à câmera.
* Determine se o triângulo está ocluído atrás de folhagens ou de outro objeto.

<a id="future-plans" />

## Planos futuros

### Somente XBOX

* Remover o mapa de espaço de tela.
  * Gravar a taxa de sombreamento diretamente no HTile.
  * Realizar uma limpeza de profundidade na mesma operação.
* Girar os deslocamentos de amostra por quadro.
  * Isso resulta em uma convergência semelhante ao tabuleiro de xadrez, mas oferece cobertura perfeita.

### PC e XBOX

* Combinar a determinação da taxa de sombreamento com um sombreador de pós-processamento.
* Para taxas menores que 1 × 1, mas não exatamente 2 × 2, faça o seguinte:
  * Considere alternar as taxas 2 × 1 e 1 × 2 por quadro, especialmente para títulos de 60 Hertz.
  * Isso resulta em um padrão de tabuleiro de xadrez em que os quadrados pretos recebem 2 × 1 no primeiro quadro e 1 × 2 no quadro seguinte. Os quadrados brancos recebem 1 × 2 no primeiro quadro e 2 × 1 no quadro seguinte.
  * Use jitter de TAA grosseiro em vez de jitter de TAA de subpixel.
  * Adicione uma taxa de sombreamento por triângulo.
    * Use o mapa de espaço de tela, a menos que uma taxa mais grosseira seja especificada. Essa é uma ótima configuração padrão de combinador.
* Ray tracing.
  * Use a mesma medida de frequência de sombreamento (o mapa) para controlar a contagem de raios.
  * Transmita o resultado do raio para os pixels adjacentes (ray tracing esparso).

<a id="conclusion" />

## Conclusão

O VRS é uma otimização poderosa para PCs e dispositivos XBOX Series X|S.

* O VRS oferece cobertura perfeita e controle local da taxa de sombreamento. Essas são grandes melhorias em relação aos recursos existentes.
* É fácil incorporar o VRS ao seu mecanismo. O VRS se integra bem a tecnologias existentes, como DRS e upscaling temporal.
* Os maiores ganhos do VRS ocorrem ao processar efeitos tradicionalmente caros, como desfoques, sombras e efeitos volumétricos.
* O VRS tem uma sobrecarga muito baixa.

Explore o sinal do VRS usando a iluminação esparsa.

* Iluminar dados duplicados do g-buffer desperdiça recursos.
* Outros passes esparsos são possíveis.
* Reutilize a contagem de operações de iluminação necessárias por bloco de tela e suas coordenadas.

Os exemplos do ATG fornecem um sombreador autônomo para calcular a taxa de sombreamento​. ​Para obter mais informações sobre o VRS, confira o exemplo VRSandSparseLighting nos [exemplos de console do Microsoft GDK](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/development-downloads/gdk-samples-list#graphics).

<a id="next-steps" />

## Próximas etapas

Se quiser revisar as informações dos materiais da apresentação relacionados a esta visão geral, baixe os seguintes arquivos do [XBOX Developer Download Secure Data Storage (SDS)](https://www.microsoft.com/en-us/software-download/gdk).

* Apresentação de slides: XF2019\_Graphics\_08\_Day2\_Variable\_Rate\_Shading\_and\_Sparse\_Lighting.pptx em Xfest 2019 Graphics Track PowerPoints (\[2019.11]-Xfest2019GraphicsTrackPowerPoints.ZIP)
* Apresentação em vídeo: XF2019\_Graphics\_08\_Day2\_Variable\_Rate\_Shading\_and\_Sparse\_Lighting.mp4 em Xfest 2019 Graphics Track Videos (\[2019.11]-Xfest2019GraphicsTrackVideos.ZIP)

<a id="gdk-graphics-presentations" />

### Baixar as apresentações e os vídeos do Microsoft PowerPoint

1. Acesse [Downloads do Game Development Kit (GDK)](https://www.microsoft.com/en-us/software-download/gdk).
2. Em <b>Select file type</b>, selecione **Conference Materials** e, em seguida, selecione **Confirm**.
3. Em <b>Select build/version number</b>, escolha uma das seguintes apresentações de gráficos.
   * Xfest 2019 Graphics Track PowerPoints
   * Xfest 2019 Graphics Track Videos
4. Selecione <b>Download Now</b> e aguarde a conclusão do download do arquivo .zip.
5. Acesse sua pasta local Downloads e descompacte (extraia) os arquivos da pasta compactada.

<a id="gdk-graphics-samples" />

### Baixar os exemplos de console do GDK mencionados neste tópico

1. Acesse [Downloads do Game Development Kit (GDK)](https://www.microsoft.com/en-us/software-download/gdk).
2. Em <b>Select file type</b>, selecione **GDK** e, em seguida, selecione **Confirm**.
3. Em <b>Select build/version number</b>, escolha a opção **Microsoft GDKX (Sample only)** mais recente.
4. Selecione <b>Download Now</b> e aguarde a conclusão do download do arquivo .zip.
5. Acesse sua pasta local Downloads e descompacte (extraia) os arquivos da pasta compactada.
6. Selecione **GDKSamples** > **Graphics**. Procure o exemplo.

<a id="see-also" />

## Confira também

[Especificações do DirectX 12 - Variable Rate Shading](https://microsoft.github.io/DirectX-Specs/d3d/VariableRateShading.html)

[Variable Rate Shading](https://github.com/microsoft/DirectX-Specs/blob/master/d3d/VariableRateShading.md)

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

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

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

[AMD FidelityFX Variable Shading](https://gpuopen.com/fidelityfx-variable-shading/)

[Variable Rate Shading Update XBOX Series Consoles](https://www.youtube.com/watch?v=pPyN9r5QNbs)

[Variable Rate Compute Shaders - Halving Deferred Lighting Time](https://www.youtube.com/watch?v=Sswuj7BFjGo)


## Related topics

- [Xfest2019](/pt-BR/build/core-features/graphics/overviews/presentations/xfest2019/index.md)
- [RSSetShadingRateImage (consoles XBOX Series)](/pt-BR/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist5/methods/id3d12graphicscommandlist5_rssetshadingrateimage_public.md)
- [RSSetShadingRate (consoles XBOX Series)](/pt-BR/reference/graphics/d3d12/interfaces/id3d12graphicscommandlist5/methods/id3d12graphicscommandlist5_rssetshadingrate_public.md)
- [D3D12_SHADING_RATE (consoles XBOX Series)](/pt-BR/reference/graphics/d3d12/enums/d3d12_shading_rate_public.md)
- [D3D12_SHADING_RATE_COMBINER](/pt-BR/reference/graphics/d3d12/enums/d3d12_shading_rate_combiner_public.md)
