Up to date

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

3D Beleuchtung und Schatten

Einführung

Lichtquellen emittieren Licht, das sich mit den Materialien vermischt und ein sichtbares Ergebnis erzeugt. In einer Szene kann das Licht von verschiedenen Quellen stammen:

  • Vom Material selbst, in Form der Emissionsfarbe (obwohl sie sich nicht auf nahe gelegene Objekte auswirkt, es sei denn, gebackene oder indirekte Beleuchtung im Screen-Space ist aktiviert).

  • Beleuchtungs-Nodes: DirectionalLight3D, OmniLight3D und SpotLight3D.

  • Umgebungslicht in der Environment oder Reflection-Probes.

  • Global Illumination (LightmapGI, VoxelGI oder SDFGI).

Die Emissionsfarbe ist eine Materialeigenschaft. Sie können mehr darüber im Standardmaterial 3D und ORM-Material 3D-Tutorial lesen.

Siehe auch

Sie können verschiedene Arten von Lichtern in Aktion vergleichen, indem Sie das 3D Lights and Shadows Demo-Projekt verwenden.

Beleuchtungs-Nodes

Es gibt drei Arten von Licht-Nodes: DirectionalLight3D, OmniLight3D und SpotLight3D. Werfen wir einen Blick auf die allgemeinen Parameter für Lichter:

../../_images/light_params.png

Jede Property hat eine bestimmte Funktion:

  • Farbe: Grundfarbe für emittiertes Licht.

  • Energie: Energie-Multiplikator. Dies ist nützlich, um Lichter zu sättigen oder mit Beleuchtung mit hohem Dynamikbereich (HDR) zu bearbeiten.

  • Indirekte Energie: Sekundärer Multiplikator, der bei indirektem Licht (Licht-Abprälle) verwendet wird. Dies funktioniert mit Verwenden der Lightmap-Global Illumination, VoxelGI oder SDFGI.

  • Volumetrische Nebel-Energie: Sekundärer Multiplikator, der bei volumetrischem Nebel verwendet wird. Dies hat nur einen Effekt, wenn volumetrischer Nebel aktiviert ist.

  • Negativ: Das Licht wird subtraktiv statt additiv. Manchmal ist es sinnvoll, dunkle Ecken manuell zu kompensieren.

  • Specular: Beeinflusst die Intensität des spiegelnden Flecks in Objekten, die von diesem Licht betroffen sind. Bei Null wird dieses Licht zu einem rein diffusen Licht.

  • Backmodus: Legt den Backmodus für das Licht fest. Siehe Verwenden der Lightmap-Global Illumination.

  • Cull-Maske: Objekte, die sich in den ausgewählten Ebenen darunter befinden, werden von diesem Licht beeinflusst. Beachten Sie, dass Objekte, die über diese Ausblendungsmaske deaktiviert werden, trotzdem Schatten werfen. Wenn Sie nicht möchten, dass deaktivierte Objekte Schatten werfen, stellen Sie die Property Schatten werfen der GeometryInstance3D auf den gewünschten Wert ein.

Siehe auch

Siehe Physikalische Licht- und Kamera-Einheiten, wenn Sie die Intensität und Farbtemperatur Ihrer Lichter in Einheiten der realen Welt konfigurieren möchten.

Grenzwerte für die Anzahl von Lichtern

Bei Verwendung des Forward+-Renderers verwendet Godot einen Cluster-Ansatz für die Echtzeitbeleuchtung. Es können so viele Lichter wie gewünscht hinzugefügt werden (solange die Performance dies zulässt). Es gibt jedoch immer noch eine Standardgrenze von 512 Cluster-Elementen, die in der aktuellen Kameraansicht vorhanden sein können. Ein Cluster-Element ist ein Rundumlicht, ein Spotlight, ein Decal oder eine Reflexions-Probe. Diese Grenze kann durch Anpassen der erweiterten Projekteinstellung Rendering > Limits > Cluster Builder > Max. geclusterte Elemente erhöht werden.

Wenn Sie den Forward Mobile Renderer verwenden, gibt es eine Begrenzung von 8 OmniLights + 8 SpotLights pro Mesh-Ressource. Es gibt auch eine Begrenzung von 256 OmniLights + 256 SpotLights, die in der aktuellen Kameraansicht gerendert werden können. Diese Grenzen können derzeit nicht geändert werden.

Wenn Sie den Kompatibilitäts-Renderer verwenden, können bis zu 8 OmniLights + 8 SpotLights pro Mesh-Ressource gerendert werden. Diese Grenze kann in den erweiterten Projekteinstellungen durch Anpassen von Rendering > Limits > OpenGL > Max. renderbare Lichter und/oder Rendering > Limits > OpenGL > Max Lichtinstanzen pro Object auf Kosten der Performance und längerer Shader-Kompilierungszeiten erhöht werden. Der Grenzwert kann auch verringert werden, um die Shader-Kompilierungszeiten zu reduzieren und die Performance leicht zu verbessern.

Bei allen Rendering-Methoden können bis zu 8 DirectionalLights gleichzeitig sichtbar sein. Jedes zusätzliche DirectionalLight mit aktivierten Schatten reduziert jedoch die effektive Schattenauflösung jedes DirectionalLights. Dies liegt daran, dass der Shadow-Atlas für alle Lichter gemeinsam genutzt wird.

Wenn die Rendering-Grenze überschritten wird, beginnen sich die Lichter während der Kamerabewegung an und auszuschalten, was ablenkend wirken kann. Die Aktivierung von Fernausblendung auf Light Nodes kann helfen, dieses Problem zu reduzieren und gleichzeitig die Leistung zu verbessern. Das Aufteilen von Meshes in kleinere Teile kann ebenfalls helfen, insbesondere bei der Level-Geometrie (was auch die Effizienz des Culling verbessert).

Wenn Sie mehr Lichter rendern müssen, als in einem bestimmten Rendering-Backend möglich ist, sollten Sie gebackene Lightmaps verwenden, wobei der Back-Modus der Lichter auf Statisch gesetzt ist. Dies ermöglicht es, Lichter vollständig zu backen, wodurch sie auch viel schneller gerendert werden können. Sie können auch emittierende Materialien mit jeder beliebigen Technik der Global Illumination als Ersatz für Licht-Nodes verwenden, die Licht über einen großen Bereich emittieren.

Shadow-Mapping

Lichter können optional Schatten werfen. Dies verleiht ihnen mehr Realismus (das Licht erreicht keine verdeckten Bereiche), kann aber auch zu größeren Leistungseinbußen führen. Es gibt eine Liste allgemeiner Schattenparameter, von denen jeder auch eine spezifische Funktion hat:

  • Aktiviert: Wählen Sie diese Option, um Shadow-Mapping bei diesem Licht zu aktivieren.

  • Deckkraft: Verdeckte Bereiche werden mit diesem Deckkraftfaktor abgedunkelt. Schatten sind standardmäßig vollständig undurchsichtig, aber dies kann geändert werden, um Schatten für ein bestimmtes Licht durchsichtig zu machen.

  • Bias: Wenn dieser Parameter zu niedrig ist, kommt es zu Selbstschattenbildung. Wenn er zu hoch ist, trennen sich die Schatten von den Werfern. Tweaken Sie es so, wie es am besten für Sie funktioniert.

  • Normalen-Bias: Wenn dieser Parameter zu niedrig ist, kommt es zur Selbstabschattung. Wenn er zu hoch ist, erscheinen die Schatten von den Schattenwerfern falsch ausgerichtet. Tweaken Sie es so, wie es am besten für Sie funktioniert.

  • Transmittance-Bias: Wenn dieser Parameter zu niedrig ist, tritt bei Materialien mit aktivierter Transmittance eine Selbstabschattung auf. Wenn er zu hoch ist, wirken sich Schatten nicht auf Materialien aus, bei denen die Transmittance durchgängig aktiviert ist. Tweaken Sie es so, wie es am besten für Sie funktioniert.

  • Face-Culling umkehren: Einige Szenen funktionieren besser, wenn das Schatten-Mapping mit umgekehrtem Face-Culling gerendert wird.

  • Blur: Multipliziert den Radius des Schatten-Blurs für dieses Licht. Dies funktioniert sowohl mit traditionellem Shadow-Mapping als auch mit kontakthärtenden Schatten (Lichter mit Winkeldistanz oder Größe größer als 0.0). Höhere Werte resultieren in weicheren Schatten, die auch bei sich bewegenden Objekten zeitlich stabiler zu sein scheinen. Der Nachteil einer Erhöhung der Schattenunschärfe ist, dass das körnige Muster, das für die Filterung verwendet wird, stärker auffällt. Siehe auch Schattenfilter-Modus.

../../_images/lights_and_shadows_blur.webp

Optimieren des Schatten-Bias

Unten sehen Sie ein Bild, das zeigt, wie die Anpassung des Bias aussieht. Die Default-Werte funktionieren in den meisten Fällen, aber im Allgemeinen hängt es von der Größe und Komplexität der Geometrie ab.

Wenn der Schattenbias oder Schattennormalen-Bias für ein bestimmtes Licht zu niedrig eingestellt ist, wird der Schatten auf die Objekte "verschmiert". Dies führt dazu, dass das beabsichtigte Aussehen des Lichts verdunkelt wird, und wird als Schattenakne bezeichnet:

../../_images/lights_and_shadows_acne.webp

Ist dagegen der Schatten-Bias oder Schatten-Normalen-Bias für ein bestimmtes Licht zu hoch eingestellt, kann der Schatten vom Objekt abgekoppelt erscheinen. Dies wird als Peter-Panning bezeichnet:

../../_images/lights_and_shadows_peter_panning.webp

Im Allgemeinen ist eine Erhöhung des Schatten-Normalen-Bias einer Erhöhung des Schatten-Bias vorzuziehen. Die Erhöhung von Schatten-Normalen-Bias verursacht nicht so viel Peter-Panning wie die Erhöhung von Schatten-Bias, kann aber immer noch die meisten Probleme mit Schattenakne effizient lösen. Der Nachteil einer Erhöhung des Schatten-Normalen-Bias ist, dass der Schatten bei bestimmten Objekten dünner erscheinen kann.

Jede Art von Verzerrungsproblemen kann durch Erhöhung der Auflösung der Shadow-Map behoben werden, allerdings auf Kosten einer geringeren Performance.

Bemerkung

Das Optimieren der Shadow-Mapping-Einstellungen ist eine Kunst - es gibt keine perfekten Einstellungen für alle Anwendungsfälle. Um ein optimales Ergebnis zu erzielen, müssen Sie möglicherweise für jedes einzelne Licht unterschiedliche Werte für den Schatten-Bias verwenden.

Note on Appearance Changes: When enabling shadows on a light, be aware that the light's appearance might change compared to when it's rendered without shadows in the compatibility renderer. Due to limitations with older mobile devices, shadows are implemented using a multi-pass rendering approach so lights with shadows are rendered in sRGB space instead of linear space. This change in rendering space can sometimes drastically alter the light's appearance. To achieve a similar appearance to an unshadowed light, you may need to adjust the light's energy setting.

Gerichtetes Licht

Dies ist die häufigste Art von Licht und stellt eine sehr weit entfernte Lichtquelle dar (z. B. die Sonne). Es ist auch das am günstigsten zu berechnende Licht und sollte wann immer möglich verwendet werden (obwohl es nicht die am günstigsten zu berechnende Schatten hat, aber dazu später mehr).

Gerichtetes Licht modelliert eine unendliche Anzahl von parallelen Lichtstrahlen, von denen die gesamte Szene abgedeckt wird. Der Node für gerichtetes Licht wird durch einen großen Pfeil dargestellt, der die Richtung der Lichtstrahlen angibt. Die Position des Nodes hat jedoch keinerlei Einfluss auf die Beleuchtung und kann beliebig sein.

../../_images/light_directional.png

Every face whose front-side is hit by the light rays is lit, while the others stay dark. Unlike most other light types, directional lights don't have specific parameters.

Das gerichtete Licht bietet auch eine Winkeldistanz-Property zur Bestimmung der Winkelgröße des Lichts in Grad. Wenn Sie diesen Wert über 0.0 erhöhen, werden die Schatten bei größeren Entfernungen vom Schattenwerfer weicher, während sie auch das Aussehen der Sonne in prozeduralen Himmelsmaterialien beeinflussen. Dies wird als Kontakthärtender Schatten bezeichnet (auch bekannt als PCSS).

Zum Vergleich: Die Winkeldistanz der Sonne von der Erde aus gesehen beträgt ungefähr 0,5. Diese Art von Schatten sind teuer, daher sollten Sie die Empfehlungen in PCSS-Empfehlungen nachschlagen, wenn Sie diesen Wert über 0.0 auf Lichter mit aktiviertem Schatten setzen.

Gerichtetes Schatten-Mapping

Zur Berechnung von Shadow-Maps wird die Szene (nur die Tiefe) aus einem orthogonalen Blickwinkel gerendert, der die gesamte Szene (oder bis zur maximalen Entfernung) abdeckt. Bei diesem Ansatz gibt es jedoch ein Problem, da Objekte, die sich näher an der Kamera befinden, Schatten mit geringer Auflösung erhalten, die blockartig erscheinen können.

To fix this, a technique named Parallel Split Shadow Maps (PSSM) is used. This splits the view frustum in 2 or 4 areas. Each area gets its own shadow map. This allows small areas close to the viewer to have the same shadow resolution as a huge, far-away area. When shadows are enabled for DirectionalLight3D, the default shadow mode is PSSM with 4 splits. In scenarios where an object is large enough to appear in all four splits, it results in increased draw calls. Specifically, such an object will be rendered five times in total: once for each of the four shadow splits and once for the final scene rendering. This can impact performance, understanding this behavior is important for optimizing your scene and managing performance expectations.

../../_images/lights_and_shadows_pssm_explained.webp

Damit werden die Schatten detaillierter:

../../_images/lights_and_shadows_directional_mode.webp

Zur Steuerung von PSSM werden eine Reihe von Parametern angezeigt:

../../_images/lights_and_shadows_directional_shadow_params.webp

Jede Teilungsdistanz wird relativ zur Kamera-Near gesteuert (oder zur Max-Distanz des Schattens, wenn diese größer als 0.0 ist). 0.0 ist die Augenposition und 1.0 ist der Punkt, an dem der Schatten in der Entfernung endet. Die Abstände liegen dazwischen. Die voreingestellten Werte funktionieren im Allgemeinen gut, aber es ist üblich, die erste Teilung ein wenig zu verändern, um nahen Objekten (wie einer Figur in einem Third-Person-Spiel) mehr Details zu verleihen.

Stellen Sie immer sicher, dass Sie den Max-Abstand des Schattens so einstellen, wie es die Szene erfordert. Ein geringerer maximaler Abstand führt zu besser aussehenden Schatten und besserer Leistung, da weniger Objekte in das Schatten-Rendering einbezogen werden müssen. Sie können auch Verblassungsstart einstellen, um zu kontrollieren, wie aggressiv das Ausblenden des Schattens in einer bestimmten Entfernung sein soll. Bei Szenen, in denen Max-Abstand die Szene an einer bestimmten Kameraposition vollständig abdeckt, können Sie Verblassungsstart auf 1.0 erhöhen, um das Ausblenden des Schattens in der Entfernung zu verhindern. Dies sollte nicht in Szenen gemacht werden, in denen Max-Abstand die Szene nicht vollständig abdeckt, da der Schatten in der Ferne plötzlich abgeschnitten erscheint.

Manchmal kann der Übergang zwischen einer Teilung und der nächsten schlecht aussehen. Um dies zu beheben, kann die Option Teilungen überblenden aktiviert werden, die Details und Performance opfert um weichere Übergänge zu erhalten:

../../_images/blend_splits.png

Der Parameter Schatten > Normalen-Bias kann verwendet werden, um spezielle Fälle von Selbstüberschattung zu beheben, wenn Objekte senkrecht zum Licht stehen. Der einzige Nachteil ist, dass der Schatten dadurch etwas dünner wird. Ziehen Sie in den meisten Situationen eine Erhöhung von Schatten > Normalen-Bias in Betracht, bevor Sie Schatten > Bias erhöhen.

Schließlich ist Pancake-Größe eine Property, die angepasst werden kann, um fehlende Schatten zu beheben, wenn große Objekte mit ungeteilten Meshes verwendet werden. Ändern Sie diesen Wert nur, wenn Sie fehlende Schatten bemerken, die nicht auf Probleme mit der Schatten-Bias zurückzuführen sind.

Omni-Licht

Omni-Licht ist eine Punktlichtquelle, die ihr Licht bis zu einem bestimmten Radius kugelförmig in alle Richtungen abstrahlt.

../../_images/light_omni.png

Im echten Leben ist die Lichtabschwächung eine Umkehrfunktion, was bedeutet, dass Rundumlichter keinen Radius haben. Das ist ein Problem, denn es bedeutet, dass die Berechnung mehrerer Rundumlichter anspruchsvoll werden würde.

Um dieses Problem zu lösen, wird ein Parameter Bereich zusammen mit einer Dämpfungsfunktion eingeführt.

../../_images/light_omni_params.png

Mit diesen beiden Parametern lässt sich die visuelle Darstellung optimieren, um ästhetisch ansprechende Ergebnisse zu erzielen.

../../_images/light_attenuation.png

In OmniLight3D gibt es auch einen Parameter Größe. Wenn Sie diesen Wert erhöhen, wird das Licht langsamer ausgeblendet und die Schatten erscheinen unschärfer, wenn sie weit vom Schattenwerfer entfernt sind. Auf diese Weise können Sie in gewissem Umfang Flächenlichter simulieren. Dies wird als Kontakthärtender Schatten bezeichnet (auch als PCSS bekannt). Diese Art von Schatten ist teuer, daher sollten Sie die Empfehlungen in PCSS-Empfehlungen überprüfen, wenn Sie diesen Wert über 0.0 auf Lichter mit aktivierten Schatten setzen.

../../_images/lights_and_shadows_pcss.webp

Omni-Shadow-Mapping

Omni-Licht-Shadow-Mapping ist relativ einfach. Das Hauptproblem, das berücksichtigt werden muss, ist der Algorithmus, mit dem es gerendert wird.

Omni-Schatten können entweder als Dual Paraboloid oder Cube gerendert werden. Dual Parabolid rendert schnell, kann aber Verformungen verursachen, während Cube korrekter, aber langsamer ist. Die Standardeinstellung ist Cube, aber für Lichter, bei denen es keinen großen visuellen Unterschied macht, sollten Sie Dual Parabolid wählen.

../../_images/lights_and_shadows_dual_parabolid_vs_cubemap.webp

Wenn die gerenderten Objekte meist unregelmäßig und unterteilt sind, ist Dual Paraboloid normalerweise ausreichend. Da diese Schatten in einem Shadow-Atlas zwischengespeichert werden (mehr dazu am Ende), macht dies für die meisten Szenen keinen Unterschied in der Leistung.

Omni-Lichter mit aktivierten Schatten können Projektoren verwenden. Die Projektor-Textur multipliziert die Farbe des Lichts mit der Farbe an einem bestimmten Punkt der Textur. Daher erscheinen Lichter in der Regel dunkler, wenn eine Projektor-Textur zugewiesen ist; Sie können Energie erhöhen, um dies auszugleichen.

Omni-Lichtprojektor-Texturen erfordern ein spezielles 360°-Panorama-Mapping, ähnlich den PanoramaSkyMaterial-Texturen.

Mit der unten angegebenen Projektortextur erhält man folgendes Ergebnis:

../../_images/lights_and_shadows_omni_projector_example.webp ../../_images/lights_and_shadows_omni_projector.webp

Tipp

Wenn Sie Omniprojektoren in Form von Cubemap-Bildern vorliegen haben, können Sie dieses webbasierte Konvertierungstool verwenden, um sie in ein einziges Panoramabild umzuwandeln.

Spot-Licht

Spotlichter sind ähnlich wie Omni-Lichter, allerdings strahlen sie das Licht nur in einen Kegel (oder "Cutoff") ab. Sie sind nützlich, um Taschenlampen, Autolichter, Reflektoren, Scheinwerfer usw. zu simulieren. Diese Art von Licht wird auch in die entgegengesetzte Richtung, in die es zeigt, abgeschwächt.

Spotlichter haben die gleichen Parameter Bereich, Dämpfung und Größe wie OmniLight3D und fügen zwei zusätzliche Parameter hinzu:

  • Winkel: Der Blendenwinkel des Lichts.

  • Winkeldämpfung: Die Kegeldämpfung, die dazu beiträgt, die Kegelränder abzuschwächen.

Punktlicht-Shadow-Mapping

Spots verfügen über die gleichen Parameter wie Omni-Lights für die Shadow-Mapping. Das Rendern von Spot-Shadow-Maps ist im Vergleich zu Omnilichtern deutlich schneller, da nur eine Schattentextur gerendert werden muss (statt 6 Flächen oder 2 im Dual-Parabolid-Modus zu rendern).

Spotlichter mit aktivierten Schatten können Projektoren verwenden. Die Projektor-Textur multipliziert die Farbe des Lichts mit der Farbe an einem bestimmten Punkt der Textur. Daher erscheinen Lichter in der Regel dunkler, wenn eine Projektor-Textur zugewiesen wurde; Sie können Energie erhöhen, um dies auszugleichen.

Im Gegensatz zu Omni-Licht-Projektoren muss die Textur eines Punktlicht-Projektors keinem speziellen Format folgen, um korrekt auszusehen. Sie wird ähnlich wie ein Decal abgebildet.

Mit der unten angegebenen Projektortextur erhält man folgendes Ergebnis:

../../_images/lights_and_shadows_spot_projector_example.webp ../../_images/lights_and_shadows_spot_projector.webp

Bemerkung

Bei Spot-Lichtern mit weitem Winkel ist die Qualität der Schatten geringer als bei Spot-Lichtern mit engem Winkel, da die Shadow-Map über eine größere Fläche verteilt wird. Bei einem Winkel von mehr als 89 Grad funktionieren die Schatten von Spot-Lichtern überhaupt nicht mehr. Wenn Sie Schatten für breitere Lichter benötigen, verwenden Sie stattdessen ein Omni-Licht.

Shadow-Atlas

Im Gegensatz zu gerichteten Lichtern, die über eine eigene Schattentextur verfügen, werden Omni- und Punktlichter den Slots eines Shadow-Atlasses zugewiesen. Dieser Atlas kann in den erweiterten Projekteinstellungen konfiguriert werden (Rendering > Lichter und Schatten > Positionsschatten).

Die Auflösung gilt für den gesamten Shadow-Atlas. Dieser Atlas ist in vier Quadranten unterteilt:

../../_images/lights_and_shadows_shadow_quadrants.webp

Jeder Quadrant kann unterteilt werden, um eine beliebige Anzahl von Shadow-Maps zuzuweisen; die folgende Unterteilung ist die Default-Unterteilung:

../../_images/lights_and_shadows_shadow_quadrants2.webp

Der Shadow-Atlas weist den Platz wie folgt zu:

  • Die größte Shadow Map-Größe (wenn keine Unterteilung verwendet wird) stellt ein Licht in der Größe des Bildschirms (oder größer) dar.

  • Unterteilungen (kleinere Karten) stellen Schatten für Lichter dar, die weiter vom Blickpunkt entfernt und proportional kleiner sind.

Bei jedem Frame wird das folgende Verfahren für alle Lichter durchgeführt:

  1. Prüfen Sie, ob sich das Licht auf einem Slot der richtigen Größe befindet. Wenn nicht, rendern Sie es neu und verschieben Sie es in einen größeren/kleineren Slot.

  2. Prüfen Sie, ob sich ein Objekt, das die Shadow-Map beeinflusst, geändert hat. Wenn ja, rendern Sie das Licht neu.

  3. Ist keiner der beiden Fälle eingetreten, wird nichts unternommen und der Schatten bleibt unverändert.

Wenn die Slots in einem Quadranten voll sind, werden die Lichter je nach Größe und Entfernung in kleinere Slots zurückgeschoben. Wenn alle Slots in allen Quadranten voll sind, können einige Lichter keine Schatten rendern, selbst wenn Schatten für sie aktiviert sind.

Die Standardstrategie für die Schattenzuweisung ermöglicht das Rendern von bis zu 88 Lichtern mit aktiviertem Schatten im Kamera-Frustum (4 + 4 + 16 + 64):

  1. Der erste und detaillierteste Quadrant kann 4 Schatten speichern.

  2. Der zweite Quadrant kann 4 weitere Schatten speichern.

  3. Der dritte Quadrant kann 16 Schatten speichern, allerdings mit weniger Details.

  4. Der vierte und am wenigsten detaillierte Quadrant kann 64 Schatten speichern, die noch weniger detailliert sind.

Die Verwendung einer höheren Anzahl von Schatten pro Quadrant ermöglicht es, eine größere Anzahl von Lichtern mit aktivierten Schatten zu unterstützen und gleichzeitig die Leistung zu verbessern (da die Schatten mit einer geringeren Auflösung für jedes Licht gerendert werden). Die Erhöhung der Anzahl der Schatten pro Quadrant geht jedoch einher mit einer geringeren Schattenqualität.

In manchen Fällen kann es sinnvoll sein, eine andere Zuweisungsstrategie zu verwenden. In einem Top-Down-Spiel, in dem alle Lichter in etwa gleich groß sind, sollten Sie zum Beispiel alle Quadranten gleich unterteilen, damit alle Lichter Schatten mit einer ähnlichen Qualitätsstufe haben.

Abwägung zwischen Performance und Qualität

Das Schattenrendering ist ein wichtiges Thema bei der 3D-Rendering-Performance. Es ist wichtig, hier die richtigen Entscheidungen zu treffen, um Bottlenecks zu vermeiden.

Die Einstellungen für die Qualität von gerichteten Schatten können während der Laufzeit durch den Aufruf der entsprechenden RenderingServer-Methoden geändert werden.

Die Einstellungen für die Qualität von Positionsschatten (Omni/Spot) können zur Laufzeit auf dem Root Viewport geändert werden.

Größe der Shadow-Map

Hohe Schattenauflösungen führen zu schärferen Schatten, aber zu einem erheblichen Performance-Verlust. Es sollte auch beachtet werden, dass schärfere Schatten nicht immer realistischer sind. In den meisten Fällen sollte der Standardwert von 4096 beibehalten oder auf 2048 für Low-End-GPUs reduziert werden.

Wenn Positionsschatten nach einer Verringerung der Größe der Shadow Map zu unscharf werden, können Sie dem entgegenwirken, indem Sie die Shadow-Atlas-Quadranten so anpassen, dass sie weniger Schatten enthalten. Dadurch kann jeder Schatten mit einer höheren Auflösung gerendert werden.

Schattenfilter-Modus

Hier können mehrere Qualitätseinstellungen für die Shadow Map gewählt werden. Die Standardeinstellung Soft Low ist eine gute Balance zwischen Leistung und Qualität für Szenen mit detaillierten Texturen, da die Texturdetails dazu beitragen, dass das Dithering-Muster weniger auffällt.

In Projekten mit weniger detaillierten Texturen kann das Schatten-Dithering-Muster jedoch deutlicher sichtbar sein. Um dieses Muster auszublenden, können Sie entweder Temporales Antialiasing (TAA), AMD FidelityFX Super Resolution 2.2 (FSR2), Fast Approximate Antialiasing (FXAA) aktivieren oder die Qualität des Schattenfilters auf Soft Medium oder höher erhöhen.

Mit der Einstellung Soft Very Low wird die Schattenunschärfe automatisch verringert, um Artefakte aufgrund der geringen Abtastrate weniger sichtbar zu machen. Umgekehrt erhöhen die Einstellungen Soft High und Soft Ultra automatisch die Schattenunschärfe, um die erhöhte Anzahl von Samples besser zu nutzen.

../../_images/lights_and_shadows_filter_quality.webp

16-bits versus 32-bit

Standardmäßig verwendet Godot 16-Bit-Tiefentexturen für das Rendering von Shadow Maps. Dies wird in den meisten Fällen empfohlen, da es ohne merklichen Qualitätsunterschied zu einer besseren Performance führt.

Wenn 16 Bits deaktiviert ist, werden stattdessen 32-Bit-Tiefentexturen verwendet. Dies kann zu weniger Artefakten in großen Szenen und großen Lichtern mit aktivierten Schatten führen. Allerdings ist der Unterschied oft kaum sichtbar, was jedoch zu erheblichen Performance-Einbußen führen kann.

Entfernungs-Fading bei Licht und Schatten

OmniLight3D und SpotLight3D bieten mehrere Propertys, um entfernte Lichter auszublenden. Dies kann die Leistung in großen Szenen mit Dutzenden von Lichtern oder mehr erheblich verbessern.

  • Aktiviert: Legt fest, ob das Entfernungs-Fading (eine Form von LOD) aktiviert ist. Das Licht wird über Beginn + Länge ausgeblendet, danach wird es aussortiert und nicht mehr an den Shader gesendet. Verwenden Sie dies, um die Anzahl der aktiven Lichter in einer Szene zu reduzieren und so die Leistung zu verbessern.

  • Beginn: Die Entfernung von der Kamera, bei der das Licht zu verblassen beginnt (in 3D-Einheiten).

  • Schatten: Die Entfernung von der Kamera, bei der ein Schatten zu verblassen beginnt (in 3D-Einheiten). Dies kann verwendet werden, um Schatten im Vergleich zum Licht früher auszublenden, was die Performance weiter verbessert. Nur verfügbar, wenn Schatten für das Licht aktiviert sind.

  • Länge: Die Entfernung, über die Licht und Schatten verblassen (in 3D-Einheiten). Das Licht wird über diese Strecke langsam transparenter und ist am Ende völlig unsichtbar. Höhere Werte führen zu einem weicheren Fade-Out-Übergang, der besser geeignet ist, wenn sich die Kamera schnell bewegt.

PCSS-Empfehlungen

Percentage-closer soft shadows (PCSS) bieten ein realistischeres Schattenbild, wobei die Größe des Halbschattens vom Abstand zwischen dem Schattenwerfer und der Oberfläche, die den Schatten empfängt, abhängt. Dies geht mit einem hohen Leistungsaufwand einher, insbesondere bei gerichteten Lichtern.

Um Performance-Probleme zu vermeiden, empfiehlt sich Folgendes:

  • Verwenden Sie jeweils nur eine Handvoll Lichter mit aktivierten PCSS-Schatten. Der Effekt ist im Allgemeinen bei großen, hellen Lichtern am deutlichsten. Sekundäre Lichtquellen, die schwächer sind, profitieren in der Regel nicht sehr von der Verwendung von PCSS-Schatten.

  • Bieten Sie eine Einstellung für Benutzer an, um PCSS-Schatten zu deaktivieren. Bei gerichteten Lichtern kann dies erreicht werden, indem die Property light_angular_distance des DirectionalLight3D in einem Skript auf 0.0 gesetzt wird. Bei Positionslichtern kann dies erreicht werden, indem man in einem Skript die Property light_size von OmniLight3D oder SpotLight3D auf 0.0 setzt.

Projektionsfilter-Modus

Die Art und Weise, wie Projektoren gerendert werden, wirkt sich ebenfalls auf die Leistung aus. Mit der erweiterten Projekteinstellung Rendern > Texturen > Lichtprojektoren > Filter können Sie steuern, wie Projektortexturen gefiltert werden sollen. Bei Nearest/Linear werden keine Mipmaps verwendet, wodurch sie schneller gerendert werden können. Allerdings sehen die Projektoren aus der Entfernung körnig aus. Nearest/Linear Mipmaps sehen aus der Entfernung glatter aus, aber die Projektoren sehen aus schrägen Winkeln unscharf aus. Dies kann durch die Verwendung von Nearest/Linear Mipmaps Anisotropic behoben werden, dem qualitativ hochwertigsten, aber auch teuersten Modus.

Wenn Ihr Projekt einen Pixel-Art-Stil hat, sollten Sie den Filter auf einen der Nearest-Werte einstellen, damit die Projektoren die Filterung nach dem Nearest-Neighbor-Prinzip verwenden. Bleiben Sie ansonsten bei Linear.