Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

3D-Render-Beschränkungen

Einführung

Echtzeit-Rendering-Engines haben aufgrund ihrer Ausrichtung auf Performance viele Einschränkungen. Der Renderer von Godot ist da keine Ausnahme. Um mit diesen Einschränkungen effektiv arbeiten zu können, müssen Sie diese verstehen.

Beschränkung der Texturgröße

Auf Desktops und Laptops älterer Generation werden Texturen größer als 8192 × 8192 möglicherweise nicht unterstützt. Sie können die Einschränkungen Ihrer Ziel-GPU auf GPUinfo.org überprüfen.

Mobile GPUs sind normalerweise auf 4096x4096 Texturen limitiert. Nicht jede mobile GPU unterstützt Tiled-Texturen, deren Größe keine Zweierpotenz aufweist. Deshalb sollte für eine korrekte Darstellung auf allen Plattformen diese Regel beachtet sowie die Nutzung von Texturen vermieden werden, die größer sind als 4096x4096.

Um die Größe einer bestimmten Textur zu begrenzen, die möglicherweise zu groß zum Rendern ist, können Sie die Importoption Prozess > Größenbegrenzung auf einen Wert größer als 0 setzen. Dadurch werden die Abmessungen der Textur beim Import reduziert (unter Beibehaltung des Seitenverhältnisses), ohne die Quelldatei zu verändern.

Color-Banding

Bei Verwendung der Render-Methoden Forward+ oder Forward Mobile rendert die 3D-Engine von Godot intern in HDR. Die Render-Ausgabe wird jedoch auf einen niedrigen Dynamikbereich gemappt, damit sie auf dem Bildschirm angezeigt werden kann. Dies kann zu sichtbarem Banding führen, insbesondere bei der Verwendung von unstrukturierten Materialien. Aus Performancegründen ist die Farbgenauigkeit bei der Forward Mobile-Rendering-Methode im Vergleich zu Forward+ ebenfalls geringer.

Bei der Render-Methode "Kompatibilität" wird HDR nicht verwendet und die Farbgenauigkeit ist die niedrigste aller Render-Methoden. Dies gilt auch für das 2D-Rendering, bei dem bei der Verwendung von Texturen mit glatten Gradienten Banding sichtbar sein kann.

Es gibt im Wesentlichen zwei Möglichkeiten, Banding zu mindern:

  • Wenn Sie die Render-Methoden Forward+ oder Forward Mobile verwenden, aktivieren Sie Debanding verwenden in den erweiterten Projekteinstellungen. Dies wendet einen Fullscreen-Debanding-Shader als Post-Processing-Effekt an und ist sehr kostengünstig.

  • Alternativ können Sie auch etwas Rauschen in Ihre Texturen einbauen. Dies ist vor allem in 2D effektiv, z.B. für Vignettierungseffekte. In 3D können Sie auch einen Custom Debanding Shader" verwenden, der auf Ihre Materialien angewendet wird. Diese Technik funktioniert auch, wenn Ihr Projekt mit geringer Farbpräzision gerendert wird, d. h. sie funktioniert auch, wenn Sie die Rendering-Methoden Mobile und Kompatibilität verwenden.

Vergleich von Color-Banding (erhöhter Kontrast für bessere Sichtbarkeit)

Vergleich von Color-Banding (erhöhter Kontrast für bessere Sichtbarkeit)

Siehe auch

Siehe Banding in Games: A Noisy Rant (PDF) für weitere Details über Banding und Möglichkeiten, es zu bekämpfen.

Tiefenpuffer-Präzision

Um Objekte im 3D-Raum zu sortieren, stützen sich Rendering-Engines auf einen Tiefenpuffer (auch Z-Puffer genannt). Dieser Puffer hat eine endliche Genauigkeit: 24 Bit auf Desktop-Plattformen, manchmal 16 Bit auf mobilen Plattformen (aus Leistungsgründen). Wenn zwei verschiedene Objekte auf demselben Pufferwert landen, kommt es zu Z-Konflikten. Dies äußert sich in Form von hin- und herflackernden Texturen, wenn sich die Kamera bewegt oder dreht.

Um den Tiefenpuffer über den gerenderten Bereich präziser zu machen, sollten Sie die Property Near des Kamera-Nodes erhöhen. Seien Sie jedoch vorsichtig: Wenn Sie den Wert zu hoch einstellen, können die Spieler durch die nahe gelegene Geometrie hindurchsehen. Sie sollten auch die Property Far des Kamera-Nodes auf den niedrigsten zulässigen Wert für Ihren Anwendungsfall verringern, aber bedenken Sie, dass dies die Präzision nicht so stark beeinflusst wie die Eigenschaft Near.

Wenn Sie eine hohe Präzision nur dann benötigen, wenn der Spieler weit sehen kann, können Sie sie dynamisch je nach Spielbedingungen ändern. Wenn der Spieler zum Beispiel ein Flugzeug betritt, kann die Eigenschaft Near vorübergehend erhöht werden, um Z-Konflikte in der Ferne zu vermeiden. Sobald der Spieler das Flugzeug verlässt, kann sie wieder verringert werden.

Abhängig von der Szene und den Sichtverhältnissen können Sie die am Z-Konflikt beteiligten Objekte auch weiter voneinander entfernen, ohne dass der Unterschied für den Spieler sichtbar wird.

Z-Konflikt-Vergleich (vor und nach der Optimierung der Szene durch Versetzen des Label3D vom Boden weg)

Z-Konflikt-Vergleich (vor und nach der Optimierung der Szene durch Versetzen des Label3D vom Boden weg)

Transparenz-Sortierung

In Godot werden transparente Materialien nach undurchsichtigen Materialien gezeichnet. Transparente Objekte werden vor dem Zeichnen von hinten nach vorne sortiert, basierend auf der Position des Node3D, nicht auf der Position des Vertex im World-Space. Aus diesem Grund können sich überlappende Objekte oft in der falschen Reihenfolge sortiert werden. Um falsch sortierte Objekte zu korrigieren, ändern Sie die Property Render-Priorität des Materials oder die Property Sortier-Offset des Nodes. Renderpriorität erzwingt, dass bestimmte Materialien vor oder hinter anderen transparenten Materialien erscheinen, während Sortier-Offset das Objekt zum Zwecke der Sortierung nach vorne oder hinten verschiebt. Aber selbst das ist manchmal nicht ausreichend.

Einige Rendering-Engines verfügen über reihenfolge-unabhängige Transparenz-Techniken, um dieses Problem zu lösen, aber das ist auf der GPU sehr kostspielig. Godot bietet diese Funktion derzeit nicht. Es gibt noch mehrere Möglichkeiten, dieses Problem zu vermeiden:

  • Machen Sie Materialien nur dann transparent, wenn Sie es wirklich brauchen. Wenn ein Material nur einen kleinen transparenten Teil hat, sollten Sie es in ein separates Material aufteilen. Dadurch kann der undurchsichtige Teil Schatten werfen und die Leistung wird verbessert.

  • Wenn Ihre Textur hauptsächlich aus vollständig deckenden und vollständig transparenten Bereichen besteht, können Sie anstelle von Alpha-Blending auch Alpha-Tests verwenden. Dieser Transparenzmodus ist schneller zu rendern und leidet nicht unter Transparenzproblemen. Aktivieren Sie Transparenz > Transparenz auf Alphaschere in StandardMaterial3D, und passen Sie Transparenz > Alphascherenschwelle bei Bedarf entsprechend an. Beachten Sie, dass MSAA kein Antialiasing auf den Kanten der Textur anwendet, es sei denn, Alpha-Antialiasing ist in den Materialeigenschaften aktiviert. FXAA, TAA und Supersampling sind jedoch in der Lage, Antialiasing auf den Kanten der Textur anzuwenden, unabhängig davon, ob Alpha-Antialiasing für das Material aktiviert ist.

  • Wenn Sie halbtransparente Bereiche der Textur rendern müssen, ist Alphaschere nicht geeignet. Stattdessen kann es manchmal funktionieren, die Property Transparenz > Transparenz von StandardMaterial3D auf Tiefen-Vordurchlauf zu setzen (mit Performanceeinbußen). Sie können auch den Modus Alpha-Hash ausprobieren.

  • Wenn Sie möchten, dass ein Material mit der Entfernung verblassen soll, verwenden Sie den StandardMaterial3D-Fernausblendungsmodus Pixel-Dither oder Objekt-Dither anstelle von Pixel-Alpha. Dadurch wird das Material undurchsichtig, was auch das Rendern beschleunigt.

Vergleich der Transparenzsortierung (Alpha-Blending-Materialien links, Alpha-Scherenmaterialien rechts)

Vergleich der Transparenzsortierung (Alpha-Blending-Materialien links, Alpha-Scherenmaterialien rechts)

Multisample Anti-Aliasing

Siehe auch

Antialiasing wird auf der Seite 3D-Antialiasing im Detail erklärt.

Multi-Sample-Antialiasing (MSAA) führt beim Rendern von Objekten mehrere Verdeckungs-Abtastungen an den Kanten von Polygonen durch. Es erhöht nicht die Anzahl der Farb-Abtastungen, die zum Rendern einer Szene verwendet werden. In der Praxis bedeutet dies Folgendes:

  • Die Ränder von Meshes werden schön geglättet (wie es auch beim Supersampling der Fall wäre).

  • Transparente Materialien, die Alpha-Tests (1-Bit-Transparenz) verwenden, werden nicht geglättet.

  • Spiegel-Aliasing ("Funkeln", das auf reflektierenden Oberflächen auftritt) wird nicht reduziert.

Es gibt mehrere Möglichkeiten, diese Einschränkung abhängig von Ihrem Performance-Budget zu umgehen:

  • Um das spiegelnde Aliasing weniger auffällig zu machen, öffnen Sie die Projekteinstellungen und aktivieren Sie Rendern > Qualität > Kantenglättung > Screen-Space-Grobheitsbegrenzer. Dieser Filter hat moderate Auswirkungen auf die Performance, daher sollte er nur aktiviert werden, wenn Sie ihn tatsächlich benötigen.

  • Aktivieren Sie zusätzlich zu (oder anstelle von) MSAA schnelles approximatives Antialiasing (FXAA). Da es sich bei FXAA um eine Antialiasing-Methode für den Screen-Space handelt, wird damit alles geglättet. Der Nachteil ist, dass FXAA die Szene unschärfer erscheinen lässt, insbesondere bei Auflösungen unter 1440p. Bei FXAA fehlen auch zeitliche Informationen, was bedeutet, dass die Auswirkungen auf das Specular-Aliasing begrenzt sind.

  • Aktivieren Sie temporales Antialiasing (TAA) zusätzlich zu (oder anstelle von) MSAA. Da TAA eine Antialiasing-Methode für den Screen-Space ist, glättet es alles. Der Nachteil ist, dass TAA die Szene unschärfer erscheinen lässt, insbesondere bei Auflösungen unter 1440p. TAA bietet im Vergleich zu FXAA eine bessere Qualität und kann effektiv gegen Specular-Aliasing vorgehen. Allerdings hat TAA im Vergleich zu FXAA einen höheren Performance-Aufwand, und TAA kann bei schnellen Bewegungen Geisterbilder erzeugen.

  • Rendern Sie die Szene mit einer höheren Auflösung, indem Sie die Projekteinstellung 3D-Skalierung > Skalierung über 1.0 erhöhen. Diese Technik wird Supersample Antialiasing (SSAA) genannt und ist sehr langsam. Ihre Verwendung wird im Allgemeinen nur für Offline-Rendering empfohlen.