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.

Il Variable Rate Shading (VRS) è un metodo per ridurre il costo di ombreggiatura diminuendo la risoluzione dell'ombreggiatura per ogni pixel (detto anche fragment shading), mantenendo al contempo la risoluzione originale per renderizzare la geometria. Ciò significa che i bordi della geometria rimangono nitidi come lo sarebbero senza il VRS. Il VRS può essere combinato con qualsiasi tecnica di Antialiasing 3D (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: controlla la modalità del variable rate shading. Disabled disabilita il variable rate shading. Texture utilizza una texture creata manualmente per impostare la densità di ombreggiatura (vedi la proprietà di seguito). XR genera automaticamente una texture adatta al rendering foveato in realtà virtuale/aumentata.

  • Texture: la texture da usare per controllare la densità di ombreggiatura nella viewport radice. Utilizzata solo se Mode è Texture.

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

Nota

Su hardware non supportato, non c'è alcuna differenza visiva quando è abilitato il variable rate shading. È possibile verificare se l'hardware supporta il variable rate shading eseguendo l'editor o il progetto con l'argomento della riga di comando --verbose.

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.

È possibile creare manualmente una propria mappa di densità per il VRS attraverso un editor di immagini, oppure generarla con un altro metodo (ad esempio, sulla CPU tramite la classe Image o sulla GPU tramite uno shader). Tuttavia, bisogna prestare attenzione alle implicazioni prestazionali generando dinamicamente un'immagine per il VRS. Se si opta per la generazione dinamica, assicurarsi che il processo di generazione dell'immagine per il VRS sia veloce abbastanza da non vanificare i vantaggi prestazionali offerti dal VRS.

La texture deve seguire queste regole:

  • La texture deve utilizzare un formato di compressione senza perdita di dati così che i colori si possano abbinare con precisione.

  • Le seguenti densità VRS sono associate a diversi colori, dove i colori più brillanti rappresentano un livello inferiore di precisione di ombreggiatura:

Densità

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.

Pertanto, rimanere a una risoluzione relativamente bassa, come 256×256 (quadrata) o 480×270 (16:9), è consigliato. A seconda delle esigenze, una texture quadrata potrebbe essere più adatta rispetto a una texture che corrisponde al rapporto d'aspetto più comune della viewport nel progetto (come 16:9).

Suggerimento

Utilizzando il variable rate shading, è possibile utilizzare un LOD bias per le mipmap delle texture negativo per ridurre la sfocatura nelle aree con variable rate shading ridotto.

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.

I risultati sono stati catturati su una GeForce RTX 4090 con il driver NVIDIA 525.60.11.

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 termini di miglioramenti delle prestazioni, il variable rate shading risulta più vantaggioso a risoluzioni di destinazione più alte. La riduzione della qualità visiva è anche meno evidente alle alte risoluzioni.

Nota

Per i giochi non VR, probabilmente sarà necessario usare una texture VRS meno aggressiva rispetto alla texture usata in questo esempio. Pertanto, i miglioramenti sulle prestazioni effettivi saranno inferiori.