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
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 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 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) |
|
|
1×2 |
|
|
2×1 |
|
|
2×2 |
|
|
2×4 |
|
|
4×2 |
|
|
4×4 |
|
|
4×8 |
|
Non supportato sulla maggior parte dell'hardware. |
8×4 |
|
Non supportato sulla maggior parte dell'hardware. |
8×8 (dettaglio minore) |
|
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
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.