Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Variable rate shading (sombreamento de taxa variável)
O que é o taxa de sombreamento variável?
Nos motores de renderização 3D modernos, os shaders são muito mais complexos do que antigamente. O advento da renderização baseada em física, da iluminação global em tempo real e dos efeitos em espaço de tela aumentou a quantidade de sombreamento por pixel que deve ser executada para renderizar cada quadro. Além disso, as resoluções de tela também aumentaram muito, com 1440p e 4K sendo agora resoluções-alvo comuns. Como resultado, o custo total do sombreamento na renderização da cena geralmente representa uma parcela significativa do tempo necessário para renderizar cada quadro.
O sombreamento de taxa variável (VRS - Variable Rate Shading) é um método para diminuir esse custo de sombreamento ao reduzir a resolução do sombreamento por pixel (também chamado de sombreamento de fragmento), mantendo a resolução original para a renderização da geometria. Isso significa que as bordas da geometria permanecem tão nítidas quanto seriam sem o VRS. O VRS pode ser combinado com qualquer técnica de Antisserrilhamento 3D (MSAA, FXAA, TAA, SSAA).
O VRS permite especificar a qualidade do sombreamento de maneira local, o que torna possível fazer com que certas partes da viewport recebam um sombreamento mais detalhado do que outras. Isso é particularmente útil em realidade virtual (VR) para alcançar o foveated rendering (renderização foveada), onde o centro da viewport é mais detalhado do que as bordas.
Aqui está uma cena renderizada com o sombreamento de taxa desativado e depois ativado, usando o mapa de densidade vinculado ao final desta página:
Sombreamento de taxa variável desativado em cena com textura
Sombreamento de taxa variável ativado em cena com textura (menor qualidade, mas maior desempenho)
Quando usado em cenas com detalhes de baixa frequência (como cenas com uma estética estilizada/low-poly), é possível alcançar ganhos de desempenho semelhantes, mas com menor redução na qualidade visual:
Sombreamento de taxa variável desativado em cena sem textura
Sombreamento de taxa variável ativado em cena sem textura (menor qualidade, mas maior desempenho)
Suporte de hardware
O sombreamento de taxa variável é suportado apenas em GPUs específicas:
Desktop:
NVIDIA Turing e mais recentes (incluindo a série GTX 1600)
AMD RDNA2 e mais recentes (tanto GPUs integradas quanto dedicadas – incluindo o Steam Deck)
Intel Arc Alchemist e mais recentes (apenas GPUs dedicadas)
Os gráficos integrados da Intel não suportam sombreamento de taxa variável.
SoCs móveis:
Snapdragon 888 e mais recentes
MediaTek Dimensity 9000 e mais recentes
ARM Mali-G615 e mais recentes
Até janeiro de 2023, as GPUs da Apple e do Raspberry Pi não suportavam sombreamento de taxa variável.
Utilizando Variable Rate Shading no Godot
Nota
Tanto o renderizador Forward+ quanto o Mobile suportam sombreamento de taxa variável. O VRS pode ser usado tanto em modos de exibição de tela plana (não-XR) quanto em XR.
O renderizador Compatibility não suporta sombreamento de taxa variável. Para XR, você pode usar o nível de foveação como uma alternativa.
Nas Configurações Avançadas do Projeto, a seção Rendering > VRS oferece configurações para controlar o sombreamento de taxa variável na viewport raiz:
Mode: Controla o modo de sombreamento de taxa variável. Disabled desativa o sombreamento de taxa variável. Texture usa uma textura criada manualmente para definir a densidade do sombreamento (veja a propriedade abaixo). XR gera automaticamente uma textura adequada para renderização foveada em realidade virtual/aumentada.
Texture: A textura a ser usada para controlar a densidade de sombreamento na viewport raiz. Usada apenas se o Mode for Texture.
Para viewports personalizadas, o modo VRS e a textura devem ser definidos manualmente no nó Viewport.
Nota
Em hardwares não suportados, não há diferença visual quando o sombreamento de taxa variável está ativado. Você pode verificar se o hardware suporta sombreamento de taxa variável executando o editor ou o projeto com o argumento de linha de comando --verbose argumento de linha de comando.
Criando um mapa de densidade VRS
Se estiver usando o modo VRS Texture, você deve definir uma textura para ser usada como mapa de densidade. Caso contrário, nenhum efeito será visível.
Você pode criar seu próprio mapa de densidade VRS manualmente usando um editor de imagem, ou gerá-lo usando outro método (por exemplo, na CPU usando a classe Image, ou na GPU usando um shader). No entanto, cuidado com as implicações de desempenho ao gerar uma imagem VRS dinamicamente. Se optar pela geração dinâmica, certifique-se de que o processo de geração da imagem VRS seja rápido o suficiente para evitar que anule os ganhos de desempenho do VRS.
A textura deve seguir estas regras:
A textura deve usar um formato de compressão sem perdas (lossless) para que as cores possam ser correspondidas com precisão.
As seguintes densidades de VRS são mapeadas para várias cores, com cores mais brilhantes representando um nível menor de precisão de sombreamento:
Densidade |
Cor |
Comente |
|---|---|---|
1×1 (maior nível de detalhe) |
|
|
1×2 |
|
|
2×1 |
|
|
2×2 |
|
|
2×4 |
|
|
4×2 |
|
|
4×4 |
|
|
4×8 |
|
Não suportado na maioria dos hardwares. |
8×4 |
|
Não suportado na maioria dos hardwares. |
8×8 (menor nível de detalhe) |
|
Não suportado na maioria dos hardwares. |
Por exemplo, esta textura de densidade VRS fornece a maior densidade de sombreamento no centro da viewport e a menor densidade de sombreamento nos cantos:
Exemplo de textura de mapa de densidade VRS, simulando renderização foveada
Não há requisitos de tamanho ou proporção para a textura de densidade VRS. No entanto, não há benefício em usar um mapa de densidade VRS que seja maior que a resolução da viewport dividida pelo tamanho do bloco (tile size) da GPU. O tamanho do bloco é o que determina a menor área de pixels onde a densidade de sombreamento pode ser alterada separadamente de outros blocos. Na maioria das GPUs, esse tamanho de bloco é de 8×8 pixels. Você pode visualizar o tamanho do bloco executando o Godot com o argumento de linha de comando --verbose, pois ele é exibido nas informações de depuração do VRS.
Portanto, recomenda-se manter uma resolução relativamente baixa, como 256×256 (quadrada) ou 480×270 (16:9). Dependendo dos seus casos de uso, uma textura quadrada pode ser mais adequada em comparação com uma textura que corresponda à proporção de tela mais comum da viewport no seu projeto (como 16:9).
Dica
Ao usar o sombreamento de taxa variável, você pode usar uma compensação negativa de LOD de mipmap de textura para reduzir o desfoque em áreas com taxa de sombreamento reduzida.
Note que a compensação de LOD da textura é definida globalmente, portanto, isso também afetará áreas da viewport com taxa de sombreamento total. Não use valores muito baixos, ou as texturas parecerão granuladas.
Comparação de desempenho
Para dar uma ideia de quanto o VRS pode melhorar o desempenho na teoria, aqui está uma comparação de desempenho com a cena de exemplo texturizada mostrada no topo desta página. O exemplo de mapa de densidade VRS presente nesta página foi utilizado.
Os resultados foram capturados em uma GeForce RTX 4090 com o driver NVIDIA 525.60.11.
Resolução |
VRS desabilitado |
VRS habilitado |
Melhoria de desempenho |
|---|---|---|---|
1920×1080 (Full HD) |
2832 FPS |
3136 FPS |
+10.7% |
2560×1440 (QHD) |
2008 FPS |
2256 FPS |
+12.3% |
3840×2160 (4K) |
1236 FPS |
1436 FPS |
+16.2% |
7680×4320 (8K) |
384 FPS |
473 FPS |
+23.1% |
Em termos de melhorias de desempenho, o sombreamento de taxa variável é mais benéfico em resoluções de destino mais altas. A redução na qualidade visual também é menos perceptível em altas resoluções.
Nota
Para jogos que não são de VR, você provavelmente terá que usar uma textura de VRS menos agressiva do que a que foi usada neste exemplo. Como resultado, os ganhos reais de desempenho serão menores.