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.

Variable rate shading

Che cos'è il variable rate shading?

Nei motori moderni di rendering 3D, gli shader sono molto più complessi rispetto al passato. L'avvento del rendering basato sulla fisica, dell'illuminazione globale in tempo reale e degli effetti nello spazio dello schermo ha aumentato il numero di operazioni di ombreggiatura per ogni pixel necessarie per renderizzare di ogni frame. Inoltre, anche le risoluzioni dello schermo sono aumentate tanto, con 1440p e 4K che sono ormai risoluzioni finali comuni. Pertanto, il costo totale dell'ombreggiatura di una scena rappresenta solitamente una parte significativa del tempo impiegato per renderizzare ogni frame.

Variable rate shading (VRS) is a method of decreasing this shading cost by reducing the resolution of per-pixel shading (also called fragment shading), while keeping the original resolution for rendering geometry. This means geometry edges remain as sharp as they would without VRS. VRS can be combined with any Antialiasing 3D technique (MSAA, FXAA, TAA, SSAA).

VRS consente di specificare la qualità dell'ombreggiatura in modo locale, permettendo così di ottenere un'ombreggiatura più dettagliata in alcune parti della viewport rispetto ad altre. Questo è particolarmente utile nella realtà virtuale (VR) per ottenere un rendering foveato, in cui il centro della viewport è più dettagliato rispetto ai bordi.

Ecco una scena renderizzata prima con il rate shading disabilitato e poi abilitato, utilizzando la mappa di densità collegata in fondo a questa pagina:

Variable rate shading disabilitato in una scena con texture

Variable rate shading disabilitato in una scena con texture

Variable rate shading abilitato in una scena con texture (peggiore qualità, ma migliori prestazioni)

Variable rate shading abilitato in una scena con texture (peggiore qualità, ma migliori prestazioni)

Se utilizzato in scene con dettagli a bassa frequenza (come scene con un'estetica stilizzata/low-poly), è possibile ottenere un simile miglioramento sulle prestazioni, ma con meno riduzione della qualità visiva:

Variable rate shading disabilitato in una scena senza texture

Variable rate shading disabilitato in una scena senza texture

Variable rate shading abilitato in una scena senza texture (qualità minore, ma prestazioni maggiori)

Variable rate shading abilitato in una scena senza texture (qualità minore, ma prestazioni maggiori)

Supporto hardware

Il variable rate shading è supportato solo su GPU specifiche:

Desktop:

  • NVIDIA Turing e successive (inclusa la serie GTX 1600)

  • AMD RDNA2 e successive (entrambe le GPU integrate e dedicate, inclusa Steam Deck)

  • Intel Arc Alchemist e successive (solo GPU dedicate)

    • Le schede grafiche integrate di Intel non supportano il variable rate shading.

Mobili SoCs:

  • Snapdragon 888 e più recenti

  • MediaTek Dimensity 9000 e più recenti

  • ARM Mali-G615 e più recenti

Dalla data di gennaio 2023, le GPU Apple e Raspberry Pi non supportano il variable rate shading.

Utilizzare il variable rate shading in Godot

Nota

Il renderer Forward+ e Mobile entrambi supportano il variable rate shading. È possibile usare il VRS sia in modalità di visualizzazione pancake (non XR) sia in modalità XR.

Il renderer Compatibilità non supporta il variable rate shading. Per l'XR, è possibile utilizzare il livello di foveazione come alternativa.

Nelle impostazioni avanzate del progetto, la sezione Rendering > VRS offre impostazioni per controllare il variable rate shading nella viewport radice:

  • Mode: Controls the variable rate shading mode. Disabled disables variable rate shading. Texture uses a manually authored texture to set shading density (see the property below). XR automatically generates a texture suited for foveated rendering in virtual/augmented reality.

  • Texture: The texture to use to control shading density on the root viewport. Only used if Mode is Texture.

Per le viewport personalizzate, la modalità VRS e la texture devono essere impostate manualmente sul nodo Viewport.

Nota

On unsupported hardware, there is no visual difference when variable rate shading is enabled. You can check whether hardware supports variable rate shading by running the editor or project with the --verbose command line argument.

Creare una mappa di densità per VRS

Se si utilizza la modalità VRS Texture, è obbligatorio impostare una texture da utilizzare come mappa di densità. Altrimenti, nessun effetto sarà visibile.

You can create your own VRS density map manually using an image editor, or generate it using another method (e.g. on the CPU using the Image class, or on the GPU using a shader). However, beware of performance implications when generating a VRS image dynamically. If opting for dynamic generation, make sure the VRS image generation process is fast enough to avoid outweighing the performance gains from VRS.

La texture deve seguire queste regole:

  • The texture must use a lossless compression format so that colors can be matched precisely.

  • The following VRS densities are mapped to various colors, with brighter colors representing a lower level of shading precision:

Density

Colore

Commento

1×1 (dettaglio maggiore)

rgb(0, 0, 0) - #000000

1×2

rgb(0, 85, 0) - #005500

2×1

rgb(85, 0, 0) - #550000

2×2

rgb(85, 85, 0) - #555500

2×4

rgb(85, 170, 0) - #55aa00

4×2

rgb(170, 85, 0) - #aa5500

4×4

rgb(170, 170, 0) - #aaaa00

4×8

rgb(170, 255, 0) - #aaff00

Non supportato sulla maggior parte dell'hardware.

8×4

rgb(255, 170, 0) - #ffaa00

Non supportato sulla maggior parte dell'hardware.

8×8 (dettaglio minore)

rgb(255, 255, 0) - #ffff00

Non supportato sulla maggior parte dell'hardware.

Ad esempio, questa texture di densità VRS offre la massima densità di ombreggiatura al centro della viewport e la minima densità di ombreggiatura negli angoli:

Esempio di texture della mappa di densità VRS, che simula il rendering foveato

Esempio di texture della mappa di densità VRS, che simula il rendering foveato

Non ci sono requisiti di dimensioni o proporzioni per la texture di densità VRS. Tuttavia, non c'è alcun vantaggio nell'utilizzare una mappa di densità VRS più grande della risoluzione della viewport divisa per la dimensione delle celle della GPU. La dimensione delle celle determina l'area più piccola in pixel in cui la densità di ombreggiatura può cambiare separatamente dagli altre celle. Sulla maggior parte delle GPU, questa dimensione delle celle è di 8×8 pixel. È possibile visualizzare la dimensione delle celle eseguendo Godot con l'argomento della riga di comando --verbose, stampata nelle informazioni VRS di debug.

Therefore, sticking to a relatively low resolution such as 256×256 (square) or 480×270 (16:9) is recommended. Depending on your use cases, a square texture may be more suited compared to a texture that matches the most common viewport aspect ratio in your project (such as 16:9).

Suggerimento

When using variable rate shading, you can use a negative texture mipmap LOD bias to reduce blurriness in areas with reduced shading rate.

Note that the texture LOD bias is set globally, so this will also affect areas of the viewport with full shading rate. Don't use values that are too low, or textures will appear grainy.

Confronto di prestazioni

Per dare un'idea di quanto VRS possa migliorare le prestazioni in teoria, ecco un confronto delle prestazioni con la scena di esempio con texture mostrata in cima a questa pagina. È utilizzata la mappa di densità VRS di esempio presente in questa pagina.

Results were captured on a GeForce RTX 4090 with the NVIDIA 525.60.11 driver.

Risoluzione

VRS disabilitato

VRS abilitato

Non supportato sulla maggior parte dell'hardware

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%

In terms of performance improvements, variable rate shading is more beneficial at higher target resolutions. The reduction in visual quality is also less noticeable at high resolutions.

Nota

For non-VR games, you will probably have to use a less aggressive VRS texture than what was used in this example. As a result, the effective performance gains will be lower.