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:

Variable Rate Shading in texturierter Szene deaktiviert

Variable Rate Shading in texturierter Szene deaktiviert

Variable Rate Shading in texturierter Szene aktiviert (geringere Qualität, aber höhere Performance)

Variable Rate Shading in texturierter Szene aktiviert (geringere Qualität, aber höhere Performance)

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:

Variable Rate Shading in untexturierter Szene deaktiviert

Variable Rate Shading in untexturierter Szene deaktiviert

Variable Rate Shading in untexturierter Szene aktiviert (geringere Qualität, aber höhere Performance)

Variable Rate Shading in untexturierter Szene aktiviert (geringere Qualität, aber höhere Performance)

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)

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

Wird von den meisten Geräten nicht unterstützt.

8×4

rgb(255, 170, 0) - #ffaa00

Wird von den meisten Geräten nicht unterstützt.

8×8 (niedrigste Detailstufe)

rgb(255, 255, 0) - #ffff00

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:

Beispiel einer VRS-Dichtekartentextur, die Foveated Rendering simuliert

Beispiel einer VRS-Dichtekartentextur, die Foveated Rendering simuliert

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.