Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
Variable Rate Shading¶
Was ist Variable Rate Shading?¶
In modernen 3D-Rendering-Engines sind die Shader viel komplexer als früher. Das Aufkommen von physikbasiertem Rendering, Global Illumination in Echtzeit und Screen-Space-Effekten hat die Anzahl der Shadings pro Pixel erhöht, die zum Rendern jedes Frames ausgeführt werden müssen. Außerdem sind die Bildschirmauflösungen stark angestiegen, wobei 1440p und 4K jetzt üblichen Zielauflösungen sind. Infolgedessen machen die Gesamtkosten für das Shading beim Rendern einer Szene in der Regel einen erheblichen Teil der Renderzeit für jedes Frame aus.
Variable Rate Shading (VRS) ist eine Methode zur Verringerung dieser Shading-Kosten, indem die Auflösung des Pixel-Shadings (auch Fragment-Shading genannt) reduziert wird, während die ursprüngliche Auflösung für das Rendern der Geometrie beibehalten wird. Das bedeutet, dass die Kanten der Geometrie so scharf bleiben, wie sie es ohne VRS wären. VRS kann mit jeder 3D-Antialiasing-Technik (MSAA, FXAA, TAA, SSAA) kombiniert werden.
Mit VRS kann die Shading-Qualität lokal festgelegt werden, so dass bestimmte Teile des Viewports ein detaillierteres Shading erhalten als andere. Dies ist besonders in der virtuellen Realität (VR) nützlich, um ein Foveated Rendering zu erreichen, bei dem die Mitte des Viewports detaillierter ist als die Ränder.
Hier ist eine Szene, die mit deaktiviertem und dann aktiviertem Rate Shading gerendert wurde, unter Verwendung der unten auf dieser Seite verlinkten Dichtekarte:
Bei der Verwendung in Szenen mit niederfrequenten Details (z. B. Szenen mit einer stilisierten/wenig plastischen Ästhetik) ist es möglich, ähnliche Performance-Gewinne zu erzielen, jedoch mit geringeren Einbußen bei der visuellen Qualität:
Hardware-Unterstützung¶
Variable Rate Shading wird nur von bestimmten GPUs unterstützt:
Desktop:
NVIDIA Turing und neuere Modelle (einschließlich GTX 1600 Serie)
AMD RDNA2 und neuer (sowohl integrierte Grafikchips als auch dedizierte GPUs - einschließlich Steam Deck)
Intel Arc Alchemist und neuer (nur dedizierte GPUs)
Die integrierten Intel-Grafikchips unterstützen kein Variable Rate Shading.
Mobile SoCs:
Snapdragon 888 und neuer
MediaTek Dimensity 9000 und neuer
ARM Mali-G615 und neuer
Mit Stand vom Januar 2023 unterstützen die Grafikprozessoren von Apple und Raspberry Pi kein Variable Rate Shading.
Variable Rate Shading in Godot verwenden¶
Bemerkung
Sowohl Forward Plus als auch Forward Mobile Rendering-Methoden unterstützen Variable Rate Shading. VRS kann sowohl im Pancake- (nicht-XR) als auch im XR-Anzeigemodus verwendet werden.
Die Kompatibilität-Rendering-Methode unterstützt kein Variable Rate Shading.
In den erweiterten Projekteinstellungen bietet der Abschnitt Rendern > VRS Einstellungen zur Steuerung des Variable Rate Shading im Root Viewport:
Modus: Steuert den Variable Rate Shading-Modus. Deaktiviert schaltet Variable Rate Shading aus. Textur verwendet eine manuell erstellte Textur, um die Shading-Dichte festzulegen (siehe Property unten). XR generiert automatisch eine Textur, die für Foveated Rendering in der Virtual/Augmented Reality geeignet ist.
Textur: Die Textur, die zur Steuerung der Shading-Dichte im Root Viewport verwendet wird. Wird nur verwendet, wenn Modus auf Textur eingestellt ist.
Für benutzerdefinierte Viewports müssen der VRS-Modus und die Textur manuell auf den Node Viewport gesetzt werden.
Bemerkung
Auf nicht unterstützter Hardware gibt es keinen visuellen Unterschied, wenn Variable Rate Shading aktiviert ist. Sie können überprüfen, ob die Hardware Variable Rate Shading unterstützt, indem Sie den Editor oder das Projekt mit dem --verbose
Kommandozeilenargument ausführen.
Erstellen einer VRS-Dichtekarte¶
Wenn Sie den VRS-Modus Textur verwenden, müssen Sie eine Textur festlegen, die als Dichtekarte verwendet werden soll. Andernfalls wird kein Effekt sichtbar sein.
Sie können Ihre eigene VRS-Dichtekarte manuell mit einem Bildbearbeitungsprogramm erstellen oder sie mit einer anderen Methode generieren (z.B. auf der CPU mit der Image-Klasse oder auf der GPU mit einem Shader). Achten Sie jedoch auf die Auswirkungen auf die Performance, wenn Sie ein VRS-Bild dynamisch erzeugen. Wenn Sie sich für die dynamische Generierung entscheiden, stellen Sie sicher, dass der Prozess der VRS-Bilderzeugung schnell genug ist, um die Performance-Gewinne durch VRS nicht aufzuwiegen.
Die Textur muss diesen Regeln folgen:
Die Textur muss ein verlustfreies Komprimierungsformat verwenden, damit die Farben genau angepasst werden können.
Die folgenden VRS-Dichten werden verschiedenen Farben zugeordnet, wobei hellere Farben einen geringeren Grad an Shading-Präzision darstellen:
Dichte |
Farbe |
Kommentar |
---|---|---|
1×1 (höchste Detailgenauigkeit) |
|
|
1×2 |
|
|
2×1 |
|
|
2×2 |
|
|
2×4 |
|
|
4×2 |
|
|
4×4 |
|
|
4×8 |
|
Wird von den meisten Geräten nicht unterstützt. |
8×4 |
|
Wird von den meisten Geräten nicht unterstützt. |
8×8 (niedrigste Detailstufe) |
|
Wird von den meisten Geräten nicht unterstützt. |
Diese VRS-Dichte-Textur bietet zum Beispiel die höchste Shading-Dichte in der Mitte des Viewports und die niedrigste Shading-Dichte in den Ecken:
Für die VRS-Dichtetextur gibt es keine Anforderungen an Größe oder Seitenverhältnis. Es ist jedoch nicht sinnvoll, eine VRS-Dichtekarte zu verwenden, die größer ist als die Viewport-Auflösung geteilt durch die Kachelgröße der GPU. Die Kachelgröße bestimmt den kleinsten Pixelbereich, in dem die Shading-Dichte getrennt von anderen Kacheln geändert werden kann. Bei den meisten GPUs beträgt diese Kachelgröße 8×8 Pixel. Sie können die Kachelgröße anzeigen, indem Sie Godot mit dem Kommandozeilenargument --verbose
ausführen, da sie in den VRS-Debugging-Informationen ausgegeben wird.
Daher wird empfohlen, eine relativ niedrige Auflösung wie 256×256 (quadratisch) oder 480×270 (16:9) zu wählen. Je nach Anwendungsfall kann eine quadratische Textur besser geeignet sein als eine Textur, die dem in Ihrem Projekt am häufigsten verwendeten Viewport-Seitenverhältnis entspricht (z. B. 16:9).
Tipp
Wenn Sie Variable Rate Shading verwenden, können Sie einen negativen Textur-Mipmap LOD-Bias verwenden, um die Unschärfe in Bereichen mit reduzierter Shading-Rate zu reduzieren.
Beachten Sie, dass der LOD-Bias der Textur global eingestellt wird, so dass sich dies auch auf Bereiche des Viewports mit voller Shading-Rate auswirkt. Verwenden Sie keine zu niedrigen Werte, sonst wirken die Texturen körnig.
Performance-Vergleich¶
Um eine Vorstellung davon zu vermitteln, wie sehr VRS die Performance theoretisch verbessern kann, hier ein Performance-Vergleich mit der texturierten Beispielszene, die oben auf dieser Seite gezeigt wird. Es wird das VRS-Dichtekartenbeispiel auf dieser Seite verwendet.
Die Ergebnisse wurden auf einer GeForce RTX 4090 mit dem NVIDIA-Treiber 525.60.11 ermittelt.
Auflösung |
VRS deaktiviert |
VRS aktiviert |
Verbesserung der Performance |
---|---|---|---|
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% |
Was die Performance betrifft, so ist Variable Rate Shading bei höheren Auflösungen vorteilhafter. Auch die Verschlechterung der visuellen Qualität ist bei hohen Auflösungen weniger spürbar.
Bemerkung
Für Nicht-VR-Spiele müssen Sie wahrscheinlich eine weniger aggressive VRS-Textur als die in diesem Beispiel verwendete verwenden. Infolgedessen werden die effektiven Performance-Gewinne geringer ausfallen.