Virtuelle Shadow-Maps (VSMs) ist die neue Shadow-Mapping-Methode für konsistente, hochauflösende Schatten, die mit Assets in Filmqualität und großen, dynamisch beleuchteten offenen Welten unter Verwendung der Nanite Virtualized Geometry der Unreal Engine 5 funktioniert, mit Lumen Global Illumination and Reflections und World Partition.
Ziele von Virtual Shadow Maps
Virtual Shadow Maps wurden mit den folgenden Zielen entwickelt:
Deutliche Erhöhung der Schattenauflösung zur Anpassung an die hochdetaillierte Nanite-Geometrie
Plausible weiche Schatten mit vernünftigen, kontrollierbaren Leistungskosten
Bereitstellung einer einfachen Lösung, die standardmäßig funktioniert und nur wenige Anpassungen erfordert
Ersatz der vielen stationären Lichtschattierungstechniken durch einen einzigen, vereinheitlichten Pfad
Vom Konzept her sind Virtual Shadow Maps einfach sehr hoch aufgelöste Schattenkarten. In ihrer derzeitigen Implementierung haben sie eine virtuelle Auflösung von 16k x 16k Pixeln. Clip-Maps werden verwendet, um die Auflösung für gerichtete Lichter weiter zu erhöhen. Um die Leistung bei vertretbaren Speicherkosten hoch zu halten, unterteilen VSMs die Shadow Map in Kacheln (oder Seiten) mit einer Größe von jeweils 128x128. Die Seiten werden nur dann zugewiesen und gerendert, wenn dies aufgrund einer Analyse des Tiefenpuffers erforderlich ist, um Pixel auf dem Bildschirm abzuschatten. Die Seiten werden zwischen den Frames zwischengespeichert, sofern sie nicht durch sich bewegende Objekte oder Licht ungültig gemacht werden, was die Leistung weiter verbessert.
Nanite unterstützt viele der Stationärlicht-Schattentechniken nicht, wie z. B. Vorschatten und Schatten pro Objekt (oder Inset). Während einige der dynamischeren Teile des Stationärlicht-Schattens funktionieren - wie die kaskadierten Schattenkarten in der Nähe des Kamerabetrachters - werden Nanite und Stationärlichter mit herkömmlichen Schattenkarten nicht unterstützt. Wenn du Nanite in deinem Projekt verwendest, musst du entweder bewegliche Lichter oder Virtual Shadow Maps verwenden.
Virtual Shadow Maps aktivieren
In den Projekteinstellungen unter Engine > Rendering im Abschnitt Schatten können Sie einstellen, welche Shadow-Map-Methode Ihr Projekt unterstützt, ob Virtual Shadow Maps oder die konventionellen Shadow Maps, die in früheren Versionen der Unreal Engine verwendet wurden.
Vorhandene Projekte müssen über die Projekteinstellung oder die Konsolenvariable r.Shadow.Virtual.Enable aktiviert werden. Neue Projekte verwenden standardmäßig Virtual Shadow Maps.
Was passiert mit bestehenden Schattenmethoden, wenn VSMs aktiviert sind?
Wenn VSMs aktiviert sind, ersetzen sie eine Vielzahl von bestehenden Schattenmethoden in der Unreal Engine:
Stationäre vorberechnete Schatten, einschließlich 2D-Distanzfeld und Schattenfaktor-„Shadow Maps“
Vorschatten
Pro-Objekt-Schatten/Inset-Schatten
Cascaded Shadow Maps (CSMs)
Bewegliche dynamische Schatten für lokale Lichter
Vollständig per Bake-Vorgang erzeugte Schatten von statischen Lichtern funktionieren weiterhin wie bisher (wenn kein Lumen verwendet wird). Ihre Beiträge werden vollständig in den per Bake-Vorgang erzeugten Lightmaps dargestellt, und es wird überhaupt keine Beleuchtung zur Laufzeit bewertet. Stationäre Lichter verwenden den indirekten diffusen Beitrag von allen per Bake-Vorgang erzeugten Lichtkarten, aber ihre direkte Beleuchtung und Schatten werden dynamisch ausgewertet (wie bei beweglichen Lichtern), wenn VSMs aktiviert sind.
Distance Field Shadows werden nicht ersetzt und können zusammen mit virtuellen Shadow-Maps für gerichtetes Licht verwendet werden. Distanzfeldschatten werden für Nicht-Nanite-Geometrien jenseits des dynamischen Schattenabstands von beweglichen Lichtern übernommen – festgelegt für ein gerichtetes Licht mit der Cascaded-Shadow-Map-Eigenschaft Dynamischer Schattenabstand bewegliches Licht. Die Verwendung von Distanzfeldschatten ist ein nützliches Werkzeug, um die Laufzeitkosten in komplexen Szenen zu reduzieren, z. B. bei Szenen mit viel Nicht-Nanite-Laub.
Nanite-Geometrie wird unabhängig von der Entfernung immer auf die Virtual Shadow Map gerendert, da dies die leistungsfähigste Option ist und die höchste Qualität bietet. Es ist möglich, Nicht-Nanite-Geometrien durch die Konsolenvariable r.Shadow.Virtual.UseFarShadowCulling 0 auf die gleiche Weise wie Nanite-Geometrien zu behandeln.
Lokale Lichter (Punkt- und Spot-Lichter) sind davon nicht betroffen, und die Auswahl von Abstandsfeldschatten für diese Lichter setzt weiterhin die aktive Shadow-Map-Methode außer Kraft.
Aufgrund der hohen Auflösung und Genauigkeit von VSM ist die Funktion „Kontaktschatten“, die über die Eigenschaft „Kontaktschattenlänge“ gesteuert wird, nicht mehr erforderlich, um scharfe Kontaktschatten zu erzielen. Sie kann immer noch nützlich sein, wenn man billigere Schatten von Objekten aufnimmt, die nicht in Shadow Maps gerendert werden sollen, wird aber ansonsten nicht empfohlen, da sie weniger genau ist als die Schatten, die VSMs erzeugen.
Raytracing-Schatten haben nach wie vor Vorrang vor VSMs, da sie im Allgemeinen die qualitativ beste Lösung darstellen.
Weiche Schatten mit Shadow Map Ray Tracing
Shadow Map Ray Tracing (SMRT) ist ein Sampling-Algorithmus, der mit Virtual Shadow Maps verwendet wird, um plausiblere weiche Schatten und Kontakthärtung zu erzeugen. Objekte, die Schatten in größerer Entfernung werfen, haben weichere Schatten als Objekte, die näher an der schattenempfangenden Fläche liegen. Das unten abgebildete Mesh zum Beispiel ist hoch und wirft seinen Schatten über eine große Entfernung. Schatten in der Nähe des Sockels sind schärfer als in größerer Entfernung.
Frühere Methoden, die auf Percentage-Closer Filtering (PCF) basieren, würden die visuelle Wirkung von hochauflösender Geometrie und Schatten übermäßig verwischen und reduzieren.
Der SMRT-Algorithmus schießt eine Reihe von Strahlen auf die Lichtquelle, aber anstatt die Schnittpunkte mit der Geometrie auszuwerten – wie es beim herkömmlichen Ray-Tracing der Fall ist – wird eine Reihe von Mustern entlang des Strahls projiziert und mit der virtuellen Schattenkarte verglichen, um weiche Schatten und Kontakthärtung zu erreichen. Schattenstrahlen werden auf der Grundlage des Lichts mit Quellenradius bei lokalen Lichtern oder Quellenwinkel bei gerichteten Lichtern verteilt.
Lokale Lichter haben standardmäßig keinen Quellenradius, im Gegensatz zu gerichteten Lichtern, die mit einem niedrigen Quellenwinkel beginnen. Wenn beide mit einem geeigneten Wert eingestellt sind, erzeugt SMRT weiche Schatten mit Kontakthärtung in Echtzeit, wie im folgenden Beispiel mit einem Punktlicht mit einem Quellenradius von 10.
Steuerung der Penumbra-Schattenqualität
Die Weichheit und Qualität des Penumbra-Schattens wird über Konsolenvariablen für lokale und gerichtete Lichter eingestellt. Sie verfügen über eigene Skalierbarkeitseinstellungen, die im Allgemeinen für die meisten Szenen gut geeignet sind.
Das Rauschen des Penumbra-Schattens wird durch die Anzahl der verwendeten Strahlen beeinflusst, und sowohl lokale als auch gerichtete Lichter verwenden standardmäßig acht Strahlen, wenn die Skalierbarkeit für Schatten auf Episch eingestellt ist.
Verwende die Konsolenvariablen r.Shadow.Virtual.SMRT.RayCountLocal und r.Shadow.Virtual.SMRT.RayCountDirectional, um die Anzahl der Strahlen anzupassen. Weniger Strahlen zeigen sichtbares Rauschen in der Penumbra. Wenn die zugehörige Konsolenvariable auf 0 gesetzt wird, wird SMRT deaktiviert und zu Single-Sample Hard Shadows zurückgekehrt.
Außerdem kann die Anzahl der Schattenproben, die entlang jedes Strahlengangs genommen werden, sowohl für lokale als auch für gerichtete Lichter eingestellt werden, um die maximale Weichheit zu steuern. Weniger Shadow-Map-Samples sind billiger zu rendern, schränken aber die Penumbra-Weichheit ein, die durch die Schatten des Lichts erreicht werden kann.
Für eine feinere Kontrolle als die Schatten-Skalierbarkeitseinstellungen und die Konsolenvariablen r.Shadow.Virtual.SMRT.SamplesPerRayLocal und r.Shadow.Virtual.SMRT.SamplesPerRayDirectional, um die Anzahl der verwendeten Samples anzupassen. Die Verwendung von Werten zwischen 4 und 8 Samples funktioniert gut.
Durch Ziehen des Schiebereglers wird angezeigt, was passiert, wenn ein gerichtetes Licht mit einem Quellwinkel von 5,0 Schattenkartenbeispiele mit den Nummern 0, 2 und 8 (Standard) verwendet.
Einschränkungen des Shadow Map Ray Tracing
Die Qualität von SMRT ist mit der Standardeinstellung im Allgemeinen gut, aber es gibt Einschränkungen, die sich aus der Verwendung der Daten einer einzigen Shadow-Map-Projektion ergeben, anstatt sie mit der echten Geometrie zu vergleichen.
Penumbra-Größeneinschränkungen
Die Penumbra des Schattens wird für lokale und gerichtete Lichter begrenzt, um eine Abweichung des Samples vom Strahlenursprung zu vermeiden, der im Vergleich zum idealen Test entlang des Strahls selbst zunehmend „verbogen“ werden kann. Durch die Verwendung angemessener Werte für den Quellenradius bei lokalen Lichtern und den Quellenwinkel bei gerichteten Lichtern werden zu extreme Ergebnisse vermieden, da sie das Ausmaß begrenzen, in dem der Strahl auf verschiedene Arten abweichen kann. Zu große Werte können sich sowohl auf die Leistung auswirken als auch dazu führen, dass sich die Penumbrae visuell verzerren, wenn sich die Kamera ihnen nähert.
Lokale und gerichtete Lichter können die Konsolenvariablen r.Shadow.Virtual.SMRT.MaxRayAngleFromLight und r.Shadow.Virtual.SMRT.RayLengthScaleDirectional verwenden, um die Grenzen zu lockern oder zu verstärken.
Inkonsistente Penumbra
Da die Virtual Shadow Map nur die erste Tiefenebene speichert und bei der naiven Iteration Überschneidungen mit dahinter liegenden Okkludern nicht berücksichtigt werden, kann es an den Stellen, an denen sich die Okkluder überschneiden, zu einer Vielzahl von Lichtleck-Artefakten kommen. Diese Arten von Lichtlecks werden mit Hilfe einer Heuristik zur Lückenfüllung gelöst, die die Tiefen hinter dem ersten Okkluder auf der Grundlage der vor dem Okklusionspunkt gesehenen Tiefen extrapoliert.
Dies funktioniert gut bei der Auflösung von Lichtlecks, führt aber dazu, dass die Penumbrae auf Oberflächen, die parallel zum Licht liegen, kleiner werden. Es gibt derzeit keine direkte Möglichkeit, diesem Effekt entgegenzuwirken, außer die Größe der Penumbra angemessen zu halten.
Penumbra-Artefakte
Standardmäßig garantiert Virtual Shadow Maps nur, dass die Samples um den Strahlenursprung (das Empfängerpixel) vorhanden sind. Wenn der Algorithmus den Strahl durchläuft, kann er auf nicht abgebildete Seiten stoßen, auf denen keine Schattendaten vorhanden sind. Es gibt eine Reihe von Techniken, um die Auswirkungen dieses Problems zu verringern, z. B. das leichte Erweitern der Seitenzuordnungen und das Vorhandensein verschiedener Fallbacks während der Iteration. Dennoch kann es gelegentlich zu Artefakten kommen, die auf fehlende Seiten zurückzuführen sind, vor allem an den Rändern des Bildschirms, wenn auf weiche Halbschatten gezoomt wird. Diese Artefakte zeigen sich als verrauschte Lichtlecks in schattigen Bereichen. Wie auch bei anderen Einschränkungen von VSM lassen sich Probleme meist dadurch vermeiden, dass man die Größe des Schattenbereichs vernünftig hält und nicht so weit hineinzoomt, dass er große Teile des Bildschirms verdeckt.
Clip-Maps für gerichtetes Licht
Eine einzelne Virtual Shadow Map bietet nicht genügend Auflösung, um große Gebiete abzudecken. Gerichtete Lichter verwenden eine Clip-Map-Struktur mit sich ausdehnenden Bereichen um die Kamera herum, wobei jede Clip-Map-Ebene ihre eigene 16K-VSM hat. Jede Clip-Map-Ebene hat die gleiche Auflösung, deckt aber den doppelten Radius der vorherigen Ebene ab.
Standardmäßig werden den Clip-Map-Ebenen 6 bis 22 Virtual-Shadow-Map-Seitentabellen zugewiesen. Das bedeutet, dass bei den Standardeinstellungen die detaillierteste Clip-Map 64 cm (2^6 cm) von der Kameraposition entfernt ist und die breiteste Clip-Map etwa 40 Kilometer (2^22 cm) abdeckt. Die Kosten für virtuelle Clip-Map-Ebenen sind unbedeutend, wenn in ihnen nichts vorhanden ist, so dass diese Standardeinstellungen gut geeignet sind, um sehr große Szenen mit ziemlich hoher Auflösung in der Nähe der Kamera abzudecken.
Die erste und die letzte Ebene können mit den Konsolenvariablen r.Shadow.Virtual.Clipmap.FirstLevel und r.Shadow.Virtual.Clipmap.LastLevel eingestellt werden.
Die Auflösung, die einem bestimmten Pixel zugewiesen wird, ist eine Funktion der Entfernung vom Ursprung der Clip-Map – der Kamera. Dies wird durch die Schatten-Skalierbarkeit mit der Konsolenvariable r.Shadow.Virtual.ResolutionLodBiasDirectional festgelegt. Bei einem Wert von 0 wird die erforderliche Auflösung auf der Grundlage der perspektivischen Projektion der Kamera ausgewählt.
Projektives Aliasing – wenn ein Schatten auf eine Oberfläche geworfen wird, die fast parallel zur Lichtrichtung liegt – ist auch bei hohen Auflösungen noch möglich, kann aber teilweise durch Biasing der Auflösung reduziert werden. Ähnlich wie beim Mip-Biasing in Texturen verdoppelt ein Absenken des Wertes um -1 die Auflösung von Schatten mit den damit verbundenen Leistungseinbußen. Der Standardwert von -1,5 für epische Schatten-Skalierbarkeit bietet für viele Szenen einen angemessenen Ausgleich.
Lokale Lichter
Bei Spotlichtern wird eine einzelne 16k-VSM mit einer Mip-Kette anstelle von Clip-Maps verwendet, um den Detailgrad der Schatten zu steuern. In ähnlicher Weise verwenden Punktlichter eine Würfelkarte mit 16k-VSMs, eine für jede Fläche.
Lokale Lichter bieten im Vergleich zu herkömmlichen Shadow Maps eine deutlich höhere Auflösung. Es ist möglich, dass die virtuelle Auflösung bei sehr großen lokalen Lichtern nicht mehr ausreicht, und es sollte darauf geachtet werden, in diesen Fällen möglichst gerichtete Lichter zu verwenden.
Geeignete Mip-Levels werden ausgewählt, indem die Größe der Bildschirmpixel in den Schattenkartenraum projiziert wird. Wie bei gerichteten Lichtern ist es möglich, die Auflösung mit den Einstellungen für die Skalierbarkeit des Schattens oder mit der Konsolenvariablen r.Shadow.Virtual.ResolutionLodBiasLocal zu beeinflussen.
Steuerelemente für die Auflösung pro Licht sind nicht verfügbar, werden aber möglicherweise in einer zukünftigen Version hinzugefügt.
Bewegliche Lichter
Stationäre Lichtquellen sind größtenteils aus dem Cache und können als Ergebnis eine viel höhere Auflösung verwenden als sich bewegende Lichter. Um diese Differenzierung zwischen stationären und sich bewegenden Lichtern zu berücksichtigen, sollten bewegliche Lichtquellen einen anderen LOD-Bias als stationäre Lichtquellen haben. Wenn ein Licht aufhört, sich zu bewegen, wird ein langsamer Übergang zur ursprünglichen Ausrichtung durchgeführt. Sie können den LOD-Bias für das Bewegung von Lichtern mit den folgenden Skalierbarkeit-Konsolenvariablen steuern:
r.Shadow.Virtual.ResolutionLodBiasLocalMovingr.Shadow.Virtual.ResolutionLodBiasDirectionalMoving
Transluzente Oberflächen
Virtuelle Shadow-Maps unterstützen hochwertige Schatten für transluzente Oberflächen mit Substrate und Vorgängerpfaden. Das ist eine global Opt-in-Funktion, die Sie mit der Konsolenvariable r.Shadow.Virtual.TranslucentQuality aktivieren können. Diese Konsolenvariable steuert die Qualität der Schatten für beleuchtete, transluzente Oberflächen. Dies wird auf alle transluzenten Oberflächen angewendet und hat einen hohen Einfluss auf die Performance. Einstellungen für r.Shadow.Virtual.TranslucentQuality:
Beliebiger Wert Größer als 1: Hohe Schattenqualität für beleuchtete transluzente Oberfläche.
0: (Standard) Schatten mit normaler Qualität für beleuchtete transluzente Oberfläche.
Grobe Seiten
Die Tiefenpufferanalyse wird als primäre Methode zur Markierung von Seiten verwendet, die zum Rendern benötigt werden. Es gibt jedoch einige Systeme, die Schatten an willkürlicheren Stellen abtasten müssen, z. B. Volumetrischer Nebel und vorwärtsgerenderte Transluzenz. Die meisten Systeme benötigen nur niedrig aufgelöste Schattendaten, die durch andere Datenstrukturen gefiltert und verwischt werden.
Um der Abschattung in diesen Situationen Rechnung zu tragen, wird Grobe Seiten markiert, um sicherzustellen, dass zumindest niedrig aufgelöste Schattendaten über den gesamten Bereich für das Sampling verfügbar sind. Lokale Lichter markieren einfach die Stamm-Mip-Seite, während Richtungslichter eine Reihe von Seiten auf verschiedenen niedrigen Detailstufen markieren können, um einige grobe Clip-Maps zu bilden. Je nach Szene können grobe Seiten zu Leistungsproblemen führen. Dies gilt insbesondere für dynamische Geometrien, die nicht von Nanite stammen, da diese effektiv Schatten mit niedriger Auflösung über große Bereiche des Raums rendern, was zu Engpässen bei den Draw Calls führen kann.
Es wird empfohlen, mit der Deaktivierung der Darstellung von Nicht-Nanite-Objekten in den groben Seiten zu experimentieren, indem Sie die Konsolenvariable r.Shadow.Virtual.NonNanite.IncludeInCoarsePages 0 verwenden.
Viele Szenen – insbesondere solche, die hauptsächlich aus Nanite-Geometrie bestehen – benötigen keine Nicht-Nanite-Objekte, die Schatten auf volumetrischen Nebel und ähnliche Dinge werfen. Die Deaktivierung dieser Funktion kann zu einer erheblichen Leistungssteigerung führen.
Lokallicht-Grobseiten können mit r.Shadow.Virtual.MarkCoarsePagesLocal abgeschaltet werden, wenn sie nicht benötigt werden.
Direktionallicht-Grobseiten können mit r.Shadow.Virtual.MarkCoarsePagesDirectional ausgeschaltet werden, oder der Bereich der Clipmap-Ebenen, in dem Grobseiten markiert werden, kann mit r.Shadow.Virtual.FirstCoarseLevel und r.Shadow.Virtual.LastCoarseLevel geändert werden.
In einer zukünftigen Version wäre eine elegantere Möglichkeit, einige dieser Effekte für lokalisierte Seiten direkt im Voraus zu markieren, anstatt die gegenwärtig verwendeten, allzu konservativen Grobseiten zu verwenden.
Visualization
Die Visualisierungsoptionen für Virtual Shadow Maps sind im Level-Viewport über das Dropdown-Menü Ansichtsmodi und die Auswahl Virtual Shadow Map zugänglich.
Visualisierungsoptionen umfassen:
| Visualisierungsname | Beschreibung |
|---|---|
Schattenmaske | Die endgültige Schattenmaske, die bei der Schattierung verwendet wird. |
Clipmap-/Mip-Level | Der gewählte Clip-Map- (für Richtungslichter) oder Mip-Level (für lokale Lichter). |
Virtuelle Seite | Visualisierung der virtuellen Seitenadresse. |
Zwischengespeicherte Seite | Zwischengespeicherte Seiten sind grün eingefärbt, nicht zwischengespeicherte Seiten sind rot. Seiten, bei denen nur die statische Seite zwischengespeichert wird (dynamische Seite nicht zwischengespeichert), sind blau. |
Standardmäßig zeigen die Visualisierungen der Virtual Shadow Map Ergebnisse für das gerichtete Licht an. Wenn Sie ein Licht im Outliner auswählen, können Sie Visualisierungen für dieses Licht sehen.
Du kannst auch die Visualisierung über die Konsole aktivieren (außer in Auslieferungs-Builds), was für das Profiling und Debugging eines Live-Spiels nützlich ist. Wenn eine dieser Einstellungen im Editor vorgenommen wird, hat sie Vorrang vor der über die Benutzeroberfläche des Editors vorgenommenen Modusauswahl.
| Visualisierungsname | Beschreibung |
|---|---|
| Wenn der Ansichtsmodus Visualisierung über das Ebenenfenster oder den Konsolenbefehl auf Virtual Shadow Map eingestellt ist, gibt dieser Befehl an, welcher der Kanäle angezeigt werden soll. Verwenden Sie die folgenden Namen anstelle von „[Modus]“, um die jeweilige Visualisierung zu aktivieren. Cache und vPage sind zwei typische, die für die Visualisierung verwendet werden, und keine deaktiviert die vsm-Visualisierung.
|
| Aktiviert die Visualisierung der Virtual Shadow Map, wenn ein Visualisierungsmodus angegeben ist. |
| Wähle ein Layout für die Visualisierung der Virtual Shadow Map.
|
| Gibt eine Liste der aktuellen Lichter mit virtuellen Shadow-Maps an die Konsole aus. In einigen Build-/Laufzeit-Konfigurationen kann sich der Name der Lichter von ihren Namen im Editor unterscheiden. |
| Geben Sie ein Licht anhand seines Namens an. Teilweise oder vollständige Übereinstimmungen werden akzeptiert. Um ein Licht von der Auswahl durch diese Konsolenvariable zu löschen, geben Sie einen Lichtnamen an, der keinem Namen entspricht. Die Verwendung von zwei Anführungszeichen (“) ist ein akzeptabler Weg, um es auf kein bestimmtes Licht zurückzusetzen. |
Die Aktivierung der Visualisierungsmodi hat eine kleine, aber messbare Auswirkung auf die Leistung von Virtual Shadow Maps. Achte darauf, die Visualisierung vor der Performanceprofil-Erstellung zu deaktivieren.
Caching
Die Wiederverwendung von Shadow-Map-Seiten aus vorherigen Frames ist der Schlüssel zur Aufrechterhaltung einer hohen Leistung mit Virtual Shadow Maps, insbesondere in komplexen Szenen. Die Zwischenspeicherung ist standardmäßig aktiviert, kann aber zu Debugging-Zwecken mit der Konsolenvariable r.Shadow.Virtual.Cache 0 deaktiviert werden. Virtuelle Shadow-Maps respektieren den Nanite-Ausblendungsabstand, wenn Caching aktiviert wird.
Da Seiten nur für Pixel auf dem Bildschirm gerendert werden, kann eine Änderung der Kamerasichtbarkeit aufgrund der Bewegung des Ausschlusses neue Seiten zum Vorschein bringen, die gerendert werden müssen. Solange die Kamerabewegung relativ gleichmäßig verläuft, ist sie im Allgemeinen keine große Quelle für neue Seiten. Andererseits solltest du auf sehr schnelle Bewegungen in der Nähe von Objekten, große Verdeckungen und Kameraschnitte achten.
In den meisten Szenen entsteht der größte Arbeitsaufwand durch Shadow-Map-Seiten, die aufgrund von Änderungen der Szenengeometrie neu gezeichnet werden müssen. Häufige Ursachen für die Ungültigkeit von Cache-Seiten sind:
Jede Lichtbewegung oder -drehung macht alle zwischengespeicherten Seiten für dieses Licht ungültig.
Geometrien, die Schatten werfen und sich bewegen oder der Szene hinzugefügt oder entfernt werden, machen alle Seiten ungültig, die ihren Begrenzungsrahmen aus der Perspektive des Lichts überlappen.
Dies kann Objekte wie Blueprints einschließen, die Eigenschaften für Grundkörper-Komponenten festlegen, die eine Invalidierung des Renderstatus auslösen, auch wenn sie sich nicht tatsächlich bewegen.
Geometrie mit Materialien, die Netzpositionen verändern können, z. B. Welt-Positionsversatz (World Position Offset, WPO) oder Pixeltiefenversatz (Pixel Depth Offset, PDO)
In Fällen, in denen sich das Licht langsam bewegt oder sich das Richtungslicht je nach Tageszeit ändert, werden VSM-Seiten nicht zwischengespeichert. In Situationen, in denen sich die Tageszeit ändert, empfiehlt es sich, die Änderungen um einen kleinen Betrag zu quantisieren, damit die im Cache gespeicherten Seiten eine gewisse Anzahl von Frames überdauern können, da die winzigen Unterschiede in der Richtung nicht auffallen.
In einer zukünftigen Version soll die Zwischenspeicherung verbessert werden, indem ein Prioritätssystem und Budgets für die Aktualisierung pro Frame hinzugefügt werden, um eine bessere Kontrolle über die Kosten für das Rendern von Schatten zu ermöglichen. So kann beispielsweise die Schattenauflösung vorübergehend verringert werden, wenn zu viele Seiten aktualisiert werden müssen.
Cache-Invalidierungen verwalten
Die Verringerung von Cache-Invalidierungen erfolgt am besten, indem man zunächst die Invalidierungen sichtbar macht und dann die Ursachen dafür findet und reduziert. Die Cache-Seite-Visualisierung ist ein guter Ausgangspunkt.
In dieser Visualisierung sind Seiten, die vollständig im Cache gespeichert sind, grün schattiert. Seiten, die neu sind oder für ungültig erklärt wurden, sind rot schattiert. Wenn du die Kamera bewegst, solltest du kleine rote Ringe in der Nähe von Bildschirmrändern, Clipmap-Grenzen und ausgeschlossener Geometrie sehen. Bei einer statischen Kamera stammen die meisten neuen Seiten aus Cache-Invalidierungen.
Wenn die separate statische Zwischenspeicherung aktiviert ist (siehe unten), werden Seiten, die teilweise zwischengespeichert werden (wobei nur der statische Teil gültig ist), als blau angezeigt.
Sobald Problembereiche gefunden wurden, ist es oft zusätzlich nützlich, eine Visualisierung der Objektgrenzen einzuschalten, die zu den Ungültigkeitserklärungen führen, indem man die Konsolenvariable r.Shadow.Virtual.Cache.DrawInvalidatingBounds 1 verwendet. Untersuche diese Objekte und Begrenzungen, um sicherzustellen, dass es sich tatsächlich um Objekte handelt, von denen erwartet wird, dass sie Schatten ungültig machen, und dass ihre Begrenzungen so eng wie möglich sind. Da alle Seiten, die ein ungültig machendes Objekt innerhalb seiner Grenzen potenziell überlappen könnte, ungültig gemacht werden müssen, können selbst mäßig aufgeblähte Grenzen in Kombination mit niedrigen Lichtwinkeln viele unnötige Ungültigkeitserklärungen verursachen.
Invalidierungen, die vollständig im Schatten von Nanite-Objekten liegen, können übersprungen werden, dies gilt jedoch nicht für Nicht-Nanite-Objekte. Aus diesem Grund ist es besonders wichtig, sicherzustellen, dass große schattenwerfende Objekte – wie Gebäude – Nanite verwenden.
Triggern Sie die Virtuelle Shadow-Map-Invalidierung bei Nanite LOD Streaming-Änderungen mit der Konsolenvariable r.Nanite.VSMInvalidateOnLODDelta. Cluster, die nicht in den LOD gestreamt werden, der der berechneten Nanite-LOD-Schätzung entspricht, lösen eine VSM-Ungültigkeitserklärung aus, sodass sie nach Abschluss des Streamings neu gerendert werden. Diese Funktion ist experimentell. Wir raten davon ab, Projekte mit experimentellen Funktionen auszuliefern, und diese Funktion kann sich ändern.
In komplexen Szenen kann es manchmal schwierig sein, die Ursache für Ungültigkeitserklärungen selbst mit diesen Visualisierungen festzustellen. Ein weiteres Hilfsmittel ist der Visualisierungsmodus Nur Geometrie zeichnen, die VSM-Invalidierung verursacht, der im Level-Viewport unter Anzeigen > Visualisieren zu finden ist.
Wenn diese Funktion aktiviert ist, werden alle Geometrien, die keine Ungültigkeitserklärungen im Cache verursachen, ausgeblendet.
Aufgrund von Implementierungsdetails zeigt der Modus Nur Geometrie zeichnen, die VSM-Invalidierung verursacht gelegentlich Objekte an, die nicht mit der Schattenbildung in Verbindung stehen (z. B. Partikel und visuelle Effekte), die einen separaten Rendering-Durchgang durchlaufen und darüber gezeichnet werden.
Die Statistiken sind bei Verwendung dieser Visualisierung nicht zuverlässig, da sich das unterschiedliche Rendern der Hauptszene darauf auswirkt, welche Seiten abgebildet und ungültig gemacht werden. Es ist besser, mit anderen visualization modes zu beginnen und diesen zur Überprüfung zu verwenden.
Es gibt ein bekanntes Problem mit Scene Capture Components, das dazu führen kann, dass der gesamte Cache ungültig wird.
Sie können das Standard-Engine-Verhalten für Schatten mit der Grundkörper-Aufzählungsklasse Shadow Cache Invalidation Behavior überschreiben. Dies ist nützlich, um Invalidierungen durch statischen Welt-Positionsversatz (WPO) zu verhindern. Nachfolgend siehst du die Optionen:
Auto: (Standard) Invalidiert basierend auf Welt-Positionsversatz-Material und Transformieren-Änderungen.
Immer: Schatten immer ungültig machen, kann verwendet werden, um einen Grundkörper zu kennzeichnen, der eine Animationsmethode verwendet, die dem System nicht bekannt ist.
Starr: Unterdrückt Invalidierungen, die andernfalls z. B. durch den Welt-Positionsversatz generiert würden.
Static: Verhindert zusätzlich zum Verhalten als Festkörper auch eine Ungültigkeit aufgrund von Transformationsänderungen. Hinzufügen/Entfernen löst weiterhin Invalidierungen aus. Wenn der Grundkörper verschoben oder animiert wird, ist das visuelle Ergebnis undefiniert.
Nicht-Nanite-Deformation und Laub
Geometrie, die mit Skelett-Animation oder Materialien mit Welt-Positionsversatz oder Pixeltiefenversatz verformt werden kann, macht die zwischengespeicherten Seiten immer bei jedem Frame ungültig. Definitionsgemäß müssen diese Fälle auch Nicht-Nanite sein – was teurer ist – und daher ist es äußerst wichtig, dass diese Merkmale sorgfältig genutzt und die Grenzen unter Kontrolle gehalten werden.
In einigen Fällen, z. B. bei Gras und manchmal auch bei Laub, ist die Verwendung von Contact Shadows ein ausreichender Ersatz für hochauflösende Shadow-Maps. In Fällen, in denen Schatten mit hoher Detailgenauigkeit im Vordergrund erforderlich sind, solltest du Folgendes in Betracht ziehen, um die Leistungskosten zu verringern:
Nicht-Nanite-Objekte respektieren weiterhin die regulären Schatten-CPU-Culling-Einstellungen, wie z. B.
r.Shadow.RadiusThreshold. Mit diesen kannst du die Kosten für das Rendern dieser Objekte in Virtual Shadow Maps kontrollieren.In Szenen mit viel Laub ist es sehr empfehlenswert, Nicht-Nanite-Objekte in groben Seiten mit
r.Shadow.Virtual.NonNanite.IncludeInCoarsePages 0zu deaktivieren. Oder erwägen Sie, disabling coarse pages entirely, wenn sie nicht benötigt werden.Verwende Mesh LODs, um bei Entfernungen, bei denen der Effekt nicht mehr offensichtlich ist, zu Materialien zu wechseln, die kein WPO/PDO verwenden. In einigen Fällen kann es möglich sein, den dynamischen Schattenwurf für diese Objekte in der Ferne auszuschalten und sich ganz auf den Kontaktschatten im Bildschirm zu verlassen.
Für gerichtete Lichter gibt es zusätzliche Optionen:
Distanzfeldschatten werden für Nicht-Nanite-Geometrien über den Dynamischen Schattenabstand bewegliches Licht hinaus übernommen, der im Abschnitt Cascaded Shadow Maps des Lichts festgelegt wurde. Der Wechsel zu Abstandsfeldschatten für Nicht-Nanite in der Ferne kann eine große Leistungsverbesserung darstellen, da diese Geometrie nicht über die feinkörnige LOD-Skalierung verfügt, die Nanite bietet.
Separate statische Zwischenspeicherung
Diese Funktion wird als experimentell betrachtet.
Viele Szenen bestehen aus einer großen Menge statischer Geometrie, die sich nie bewegt, und einer wesentlich kleineren Menge dynamischer (oder beweglicher) Geometrie. Standardmäßig bedeutet dies, dass die relativ billige dynamische Geometrie Seiten ungültig macht, die dann dazu führen, dass die teure statische Geometrie neu gerendert werden muss, nur um den dynamischen Teil zu aktualisieren.
Um in diesen Fällen eine bessere Optimierung zu erreichen, kann ein optionales Separates statisches Caching mit r.Shadow.Virtual.Cache.StaticSeparate 1 aktiviert werden. Dieser Modus verdoppelt die Größe des physischen Seitenpools, so dass die statische Geometrie in einer bestimmten Seite getrennt von der dynamischen Geometrie zwischengespeichert werden kann. Selbst wenn sich die dynamische Geometrie bewegt, ist es nicht erforderlich, die statische Geometrie neu zu zeichnen. Stattdessen kann die zwischengespeicherte statische Seite kostengünstig überlagert werden. In Fällen wie dem Beispielprojekt Valley of the Ancients kann dies eine erhebliche Leistungsoptimierung darstellen, da das statische Terrain sehr teuer ist, während die dynamischen Elemente relativ günstig sind.
Bei der Verwendung dieses Modus ist es wichtig, die Beweglichkeit der Actors in der Szene genau einzustellen. Besonders, wenn sich ein Actor, der auf statische Mobilität eingestellt ist, bewegt – oder sogar ein Material mit Welt-Positionsversatz oder ähnlich nicht unterstützte Materialien verwendet – werden sowohl die dynamischen als auch die statischen Cache-Seiten ungültig, was zu reinem Overhead ohne Gewinn führt. Umgekehrt, wenn zu viel der teuren Geometrie auf bewegliche Mobilität eingestellt ist, kann es wenig Nutzen bringen, sie separat zu speichern.
Die Virtual Shadow Map-Statistiken sind eine gute Möglichkeit, sich einen Überblick darüber zu verschaffen, wie gut das statische Caching funktioniert. Insbesondere sollte die Zahl der „ungültig gemachten“ statischen Seiten gegen 0 gehen. Das schnelle Auffinden von Instanzen, die den statischen Cache ungültig machen, und deren Wechsel zu Beweglich ist eine wichtige Maßnahme, um sicherzustellen, dass der statische Cache gültig bleibt.
Nanite verfügt über einen fortschrittlichen Visualisierungsmodus, um die Mobilität von Objekten in der Welt zu bestimmen, was auch für Virtual Shadow Maps nützlich ist.
Dieser Visualisierungsmodus kann auf zwei Arten aktiviert werden:
Aktiviere die erweiterten Visualisierungsoptionen von Nanite mit
r.Nanite.Visualize.Advanced 1und benutze dann den Level-Viewport, um Ansichtsmodus > Nanite-Visualisierung zu wählen und wähle Virtuelle Shadow-Map Statisch aus der Liste der Visualisierungsoptionen.Alternativ können Sie die statische Visualisierung der Virtual Shadow Map mit dem Befehl
r.Nanite.Visualize vsmstaticaktivieren.
GPU-Profiling und -Optimierung
Die Unreal Engine bietet Werkzeuge, mit denen Sie die Leistung Ihrer Projekte überprüfen können, und der GPU Profiler (oder ein plattformspezifisches Tool) ist ein guter Ausgangspunkt für die Fehlersuche und das Debugging von Leistungsproblemen.
Es gibt zwei Hauptleistungsbereiche, in denen sich VSM-Kosten bemerkbar machen werden: Schattentiefen und Schattenprojektion (unter Lichtern). Die Kompromisse in jeder ihrer Kategorien sind relativ unabhängig voneinander.
Beachte, dass Befehle, die zur Auflistung von Statistiken verwendet werden, wie z.B. stat gpu und zugehörige Zähler, unzuverlässige Zeitangaben liefern können, insbesondere wenn die Leistung deines Projekts CPU-abhängig ist.
Schattentiefen
Die Kategorie Schattentiefen bezieht sich auf die Kosten für das Rendern von Geometrie in Schattenkarten.
RenderVirtualShadowMaps(Nanite) enthält das gesamte Rendering der Nanite-Geometrie in VSMs. Alle direktionalen Lichter werden in einem einzigen Nanite-Durchgang gerendert, und alle lokalen Lichter werden in einem zweiten Durchgang erstellt.
RenderVirtualShadowMaps(Non-Nanite) behandelt das Rendering von Nicht-Nanite-Geometrie. Jedes sichtbare Licht hat einen separaten Durchgang mit individuellen Zeichenaufrufen für verschiedene Objekte und Instanzen, genau wie beim konventionellen Rendering von Shadow Maps.
Atlas und Cubemap sowie andere ähnliche Durchläufe, die auf die VSM-Durchläufe folgen, rendern konventionelle Shadow-Mapn. Es gibt immer noch eine kleine Anzahl von Geometrietypen, die noch nicht im Pfad für Virtual Shadow Maps unterstützt werden, und diese folgen dem alten Pfad. Wenn es keine nicht unterstützte Geometrie gibt, die Schatten wirft, werden diese Durchläufe nicht ausgeführt oder weisen Schattenkartenspeicher zu. Diese Durchläufe und der damit verbundene Overhead können mit der Konsolenvariable
r.Shadow.Virtual.ForceOnlyVirtualShadowMaps 1komplett ausgeschaltet werden. In diesem Fall werden alle nicht unterstützten Geometrietypen einfach keinen Schatten werfen.
Die Kosten des Schattentiefen-Durchlaufs mit VSMs hängen direkt davon ab, wie viele Schattenseiten gerendert werden müssen und wie viel Geometrie in sie hinein gerendert werden muss. Das Rendern von Nicht-Nanite-Geometrien in VSMs ist wesentlich teurer als das Rendern von Nanite-Geometrien. Aus diesem Grund wird empfohlen, Nanite auf allen unterstützten Geometrien zu aktivieren, einschließlich Low-Poly-Meshs. Die einzige Ausnahme bilden Funktionen, die von Nanite-virtualisierter Geometrie noch nicht unterstützt werden.
Verstehen der Anzahl der gezeichneten Seiten
Die Bildschirmstatistik für die verwendeten VSM-Seiten gibt Aufschluss darüber, wie viele Seiten verwendet werden und wo mögliche Probleme zu suchen sind.
Verwende die folgenden Konsolenvariablen nacheinander, um Statistiken zu aktivieren:
r.ShaderPrintEnable 1r.Shadow.Virtual.ShowStats 1(oder 2, um nur die Seitenstatistiken anzuzeigen)
| Statistikname | Beschreibung |
|---|---|
Physische Seiten | Die maximale Anzahl der physischen Seiten, die Virtual Shadow Maps verwenden können. | |
Zugewiesen | Die Gesamtzahl der von der aktuellen Ansicht angeforderten Shadow-Map-Seiten. Der Wert sollte immer kleiner als Max Seiten sein, da es sonst zu Beschädigungen kommen kann. (Siehe den Abschnitt Probleme und Einschränkungen weiter unten.) |
Gelöscht | Die Anzahl der neuen Seiten, die im aktuellen Frame gelöscht wurden. |
Zwischengespeichert | Die Anzahl der Seiten, die sich bereits im Seitencache der virtuellen Schattenkarte befinden und die im aktuellen Frame nicht gerendert werden müssen. Zwischengespeicherte Seiten sind sehr kostengünstig und haben fast keine Auswirkungen auf die Leistung. Wenn die separate statische Zwischenspeicherung aktiviert ist, wird diese weiter aufgeteilt in zwischengespeicherte statische Seiten und zwischengespeicherte dynamische Seiten. |
Ungültig gemacht | Die Anzahl der ansonsten zwischengespeicherten Seiten, die durch dynamische Geometrie im vorherigen Frame für ungültig erklärt wurden. Diese Seiten müssen neu gerendert werden, weil sich etwas bewegt hat, das sie verdeckt. Bei der Verwendung einer separaten statischen Zwischenspeicherung sollte die Anzahl der Ungültigkeitserklärungen statischer Seiten idealerweise null oder sehr nahe daran liegen. Wenn eine große Anzahl statischer Seiten für ungültig erklärt wird, sollte der Actor, der die Ungültigkeitserklärung verursacht, auf Beweglich umgestellt werden. |
Zusammengeführt | Wenn die getrennte statische Zwischenspeicherung aktiviert ist, ist dies die Anzahl der Seiten, bei denen die dynamische und die statische Seite zusammengeführt wurden (weil die eine oder die andere Seite nicht zwischengespeichert wurde). |
Die Gesamtzahl der Seiten ist eine Funktion der durchschnittlichen Anzahl der Lichter, die jedes Pixel auf dem Bildschirm beeinflussen. Sie können verringert werden, indem man die Bildschirmauflösung, die Schattenauflösung (unter Verwendung der Konsolenvariablen für die Auflösungs-LOD-Verzerrung), die Lichtextensität oder die Anzahl der schattenwerfenden Lichter reduziert.
Schlechte Leistung in Schattentiefen ist typischerweise mit einer hohen Anzahl von verwendeten Seiten und vielen dynamischen Invalidierungen verbunden, was zu einer schlechten Zwischenspeicherung von VSMs führt. Im Abschnitt Caching finden Sie weitere Details zur Diagnose und Reduzierung von Cache-Invalidierungen.
Verbesserung Nicht-Nanite-Leistung
Neben der Verbesserung der Zwischenspeicherung gibt es eine Reihe von Möglichkeiten, die Leistung des Nicht-Nanite-Schattenrenderings zu verbessern.
Beachte Folgendes, um die Leistung von Nicht-Nanite-Objekten zu verbessern:
Aktivieren Sie Nanite auf so viel Geometrie wie möglich für Ihr Projekt.
Nanite-Geometrie wird weitaus effizienter in Virtual Shadow Maps gerendert und sollte in jedem Fall bevorzugt werden, unabhängig von der Polygonanzahl.
Nanite-Geometrien können Nicht-Nanite-Geometrien verdecken und verhindern, dass der Cache ungültig wird. Die einzigen Nicht-Nanite-Objekte sollten also solche sein, die von Nanite selbst nicht unterstützt werden, wie z. B. deformierende Objekte (geskinnte Meshes) oder Materialien, die Welt-Positionsversatz (WPO) und Pixeltiefenversatz (PDO) verwenden.
Für Nicht-Nanite-Objekte sollten vollständige Mesh-LOD-Hierarchien eingerichtet sein.
Es ist wichtig, dass Meshes, die nicht aus Nanite bestehen, LODs haben, da sie sonst beim Rendern in kleine Seiten extrem teuer werden.
Wenn möglich, ist es ratsam, ab einer Entfernung, bei der der Effekt offensichtlich ist, zu nicht verformenden Maschen (keine WPO/PDO-Materialien) zu wechseln.
Die CPU-Ausblenden-Konsolenvariable ist immer noch nützlich für Nicht-Nanite-Meshes, die in Virtual Shadow Maps gerendert werden.
Passen Sie die Werte für das CPU-Ausblenden bei Nicht-Nanite-Objekten, die in Virtual Shadow Maps gerendert werden, mit der Konsolenvariable
r.Shadow.RadiusThresholdan. Dadurch lassen sich die Kosten für kleine Objekte in der Ferne besser kontrollieren.
Benutzung von Distanzfeldschatten für entfernte Beschattung von Nicht-Nanite-Objekten
Bei gerichteten Lichtern ist es oft notwendig, ab einem gewissen Bereich auf Distanzfeldschatten umzuschalten, wie bei Cascaded Shadow Maps. Bei Virtual Shadow Maps wird nur Nicht-Nanite-Geometrie auf die Verwendung von Abstandsfeldschatten umgestellt, während Nanite-Geometrie weiterhin Volldetailschatten hat.
Die Deaktivierung von Nicht-Nanite-Geometrien in Grobseiten kann die Leistung erhöhen.
Die Deaktivierung von Nicht-Nanite-Geometrien in Grobseiten kann oft zu einem großen Leistungsgewinn führen, da Nicht-Nanite-Geometrien im Allgemeinen nicht effizient in großen Seiten gerendert werden können.
Die Statistiken der Virtual Shadow Maps können einen Einblick in die Anzahl der Nicht-Nanite-Instanzen geben:
| Statistikname | Beschreibung |
|---|---|
Gesamt | Gesamtzahl der Nicht-Nanite-Instanzen, die in das GPU-Ausblenden eingehen. Die Instanzen werden für jede virtuelle Schattenkarten-Mip-/Clip-Map-Ebene getrennt ausgewertet. Zum Beispiel kann eine einzelne Statisches-Mesh-Instanz zu 48 Instanzen (8 Mip-Level * 6 Cubemap-Oberflächen) für jedes Punktlicht führen, das sie schneidet, 17 Instanzen für jedes gerichtete Licht (in der Standardkonfiguration gibt es 17 Clip-Map-Level) und so weiter. |
Gezeichnet | Anzahl der Instanzen, die nach dem Ausblenden tatsächlich in alle virtuellen Schattenkarten gezeichnet wurden. |
HZB ausgeblendet | Anzahl der Instanzen, die entfernt wurden, weil sie aus der Perspektive des Lichts verdeckt wurden (durch Nanite-Geometrie). |
Seitenmaske ausgeblendet | Anzahl der Instanzen, die entfernt wurden, weil sie sich nicht mit den erforderlichen Seiten überschneiden. Dies repräsentiert zum Beispiel statische Meshs, die beim Zeichnen in bereits zwischengespeicherte Bereiche verworfen werden. |
Leeres Rechteck ausgeblendet | Anzahl der Instanzen, die entfernt wurden, weil sie sich nicht mit den erforderlichen Seiten überschneiden. Dies steht beispielsweise für statische Meshs, die beim Zeichnen in bereits zwischengespeicherte Bereiche verworfen werden. |
Frustum ausgeblendet | Anzahl der Instanzen, die sich außerhalb des Ansichtsfrustums befanden. |
Schattenprojektion
Die Kategorie Schattenprojektion umfasst die Kosten für das Sampling von Schattenkarten unter Verwendung von Shadow Map Ray Tracing. Diese Durchläufe befinden sich unter Lichter | DirectLighting | UnbatchedLights und es gibt normalerweise einen VSM-Projektionsdurchlauf pro zugehörigem Licht. Der teuerste Durchlauf ist normalerweise die SMRT-Hauptschleife in VirtualShadowMapProjection. Der Rest dürfte relativ kostengünstig sein.
Wenn der Projektionsdurchlauf mit RayCount:Static anstelle von RayCount:Adaptive gekennzeichnet ist, wird ein langsamer Pfad eingeschlagen.
Der in diesem Abschnitt beschriebene VSM-Projektionsdurchlauf unterscheidet sich von der im nächsten Abschnitt beschriebenen experimentellen Projektion in einem Durchlauf.
Die Schattenprojektion ist eine reine Funktion der Gesamtzahl der Shadow Map Samples, die über den Bildschirm erfasst werden, und die Leistung hängt nicht von der Anzahl der Seiten oder dem Caching ab.
Wenn SMRT verwendet wird, besteht es aus:
Durchschnittliche Lichter pro Pixel
Je mehr Lichter große Teile des Bildschirms berühren, desto teurer wird das Rendering. Lichter, die nur eine geringe Anzahl von Bildpunkten auf dem Bildschirm abdecken, sind billiger, obwohl es immer noch einige feste Kosten pro Licht gibt.
Es sollte darauf geachtet werden, dass die Mehrzahl der Pixel auf dem Bildschirm nicht von mehreren großen Lichtern eingenommen wird.
Strahlen pro Pixel
Die sichtbare Weichheit der Schatten beeinträchtigt die Leistung aufgrund der adaptiven Strahlenzahl. Versuche, den Quellradius von lokalen Lichtern oder den Quellwinkel von gerichteten Lichtern zu reduzieren, bevor du die Anzahl der Strahlen und Samples reduzierst.
Samples pro Strahl
Diese Einstellungen werden durch die Skalierbarkeitseinstellung Schatten festgelegt, können aber bei Bedarf weiter angepasst werden. Weitere Informationen findest du im Abschnitt Shadow Map Ray Tracing auf dieser Seite.
Im Allgemeinen sind die Kosten für die Schattenprojektion viel leichter zu kontrollieren (Abwägung mit Qualität und Rauschen) als die Kosten für die Schattentiefe.
Projektion in einem Durchlauf
Diese Funktion wird als experimentell betrachtet. Die Namen der Konsolenvariablen in diesem Abschnitt werden sich wahrscheinlich ändern.
Auch wenn die Kosten für kleinere Lichter niedriger sind, so haben sie doch einige feste Kosten für den Durchlauf. Dieses Problem wird durch die Entwicklung einer Lösung für die Schattenprojektion in einem Durchlauf angegangen, bei der die Mehrzahl der lokalen Lichter in einer Szene in einem Durchlauf effizient ausgewertet werden kann. Der schattierte Beitrag dieser Lichter kann dann mit Hilfe von gebündelten Schattierungen auf einmal angewendet werden.
Dieser Pfad wird durch die Konsolenvariablen r.UseClusteredDeferredShading 1 und r.Shadow.Virtual.OnePassProjection 1 aktiviert. Bei Szenen mit vielen kleinen lokalen Lichtern kann dies zu erheblichen Leistungsverbesserungen führen.
Die Verwendung bestimmter Lichtfunktionen verhindert, dass ein Licht gemischt wird, selbst wenn die Projektion in einem Durchlauf aktiviert ist:
Texturprofile
Lichtfunktionen
Beleuchtungskanäle
Rechteck-Lichter
Gerichtete Lichter (es gibt keinen Vorteil, wenn diese gebündelt werden, da sie den gesamten Bildschirm abdecken)
In den Aufnahmen unten zeigt die linke Seite einen Schattenprojektionsdurchlauf pro Licht im Vergleich zur Projektion in einem Durchlauf auf der rechten Seite.
Bild für Großansicht anklicken.
Im Standardpfad auf der linken Seite wird jedes lokale Licht einzeln mit mehreren Durchgängen pro Licht akkumuliert. Dies ist bei kleinen Lichtern, die nur einen kleinen Bildschirmbereich abdecken, ineffizient.
In dem neuen Pfad auf der rechten Seite werden alle schattierten lokalen Lichter in einem einzigen gebündelten Schattierungsdurchlauf (BatchedLights) zusammengefasst. Das gerichtete Licht wird nach wie vor in einem separaten Durchlauf bearbeitet; es deckt den gesamten Bildschirm ab und ist daher nicht von Vorteil, wenn es gestapelt wird.
Jedes lokale Licht wird weiterhin separat in das Transluzenzvolumen injiziert. Dies ist weniger ein Problem für die Leistung als für die Projektion, wird aber wahrscheinlich auch in Zukunft gebündelt werden.
Wenn die Projektion in einem Durchlauf aktiviert ist, ist es möglich, die Anzahl der schattierten Lichter, die pro Pixel vollständig gefiltert werden, zu begrenzen, indem der Standardwert von 16 auf r.Shadow.Virtual.OnePassProjection.MaxLightsPerPixel eingestellt wird. Dies ist sowohl für die Leistungskontrolle als auch für die Einsparung eines geringen Anteils an temporärem Grafikspeicher nützlich.
Wenn die Anzahl der beschatteten Lichter in einem bestimmten Pixel (oder in der Praxis in einer gebündelten Kachel mit aufgeschobener Schattierung) das Maximum übersteigt, werden zusätzliche Lichter mit Hilfe eines kostengünstigen einzelnen harten Nachschlagens von Schatten beschattet. Dies kann zu visuellen Diskontinuitäten führen, wenn der Wert zu aggressiv eingestellt ist, ist aber im Allgemeinen nachsichtiger als die vollständige Deaktivierung von Schatten für Lichter jenseits des Maximums.
Dieser Durchlauf befindet sich noch in der Entwicklung und ist nicht standardmäßig aktiviert. Der Hauptvorbehalt besteht darin, dass in Fällen, in denen ein lokales Licht sowohl eine Virtual Shadow Map als auch eine klassische Shadow Map hat (aufgrund eines nicht unterstützten Geometrietyps in der Szene), der Pfad für Projektionen in einem Durchlauf letztere ignoriert, wodurch diese Schatten verschwinden.
Wenn Sie bereits r.Shadow.Virtual.ForceOnlyVirtualShadowMaps verwenden, sollte es sicher sein, auch die Projektion in einem Durchlauf zu aktivieren. Sobald die derzeitigen Beschränkungen beseitigt sind, wird dies wahrscheinlich der Standardpfad werden.
Unterstützte Plattformen
Virtual Shadow Maps werden derzeit auf PlayStation 5, Xbox Series S|X und PCs mit Grafikkarten unterstützt, die diesen Spezifikationen entsprechen und die neuesten Treiber mit DirectX 12 verwenden:
NVIDIA: Karten der Maxwell-Generation oder neuer
AMD: Karten der GCN-Generation oder neuer
Alle neueren Versionen von Windows 10 (neuer als Version 1909.1350) und Windows 11 mit Unterstützung für DirectX 12 Agility SDK werden unterstützt.
Windows 10 Version 1909 – Die Revisionsnummer sollte größer oder gleich .1350 sein.
Windows 10 Version 2004 und 20H2 – Die Revisionsnummer sollte größer oder gleich .789 sein.
DirectX 12 (mit Shader Model 6.6 Atomics) oder Vulkan (VK_KHR_shader_atomic_int64).
Apple Silicon M2 oder neuer.
Linux mit einer NVIDIA GeForce 2080 oder neuer.
Neueste Grafikkarten-Treiber
Weitere Informationen zu den von Epic Games empfohlenen Hardware- und Software-Spezifikationen finden Sie unter Hardware and Software Specifications.
Probleme und Einschränkungen
Virtual Shadow Maps befinden sich noch in der Entwicklung. Derzeit gibt es eine Reihe von bekannten Problemen und Einschränkungen bei der Verwendung, und sie sind derzeit auf High-End-Desktops und Konsolen der nächsten Generation ausgerichtet.
Leistung bei mehreren Lichtern
Die Leistung in Szenen mit vielen kleinen lokalen Lichtern ist noch nicht ganz ausgereift. Im Moment ist die beste Strategie, die Projektion in einem Durchlauf zu aktivieren und sehr vorsichtig mit Invalidierungen zu sein, um so viele Seiten wie möglich im Cache zu behalten. Mehrere lokale Lichter werden bei Nanite-Geometrie viel besser funktionieren als bei Nicht-Nanite-Geometrie, so dass ein aggressives Ausblenden oder Deaktivieren des Schattenwurfs auf Nicht-Nanite-Geometrie in der Ferne sehr hilfreich sein kann. In einigen Fällen kann es wünschenswert sein, den dynamischen Schattenwurf auf weit entfernte Lichter vollständig zu deaktivieren und sich ausschließlich auf den Contact Shadows im Bildschirmbereich zu verlassen.
In Zukunft wird es bessere Kontrollmöglichkeiten geben, um algorithmische und qualitätsbezogene Kompromisse zu schließen und Aktualisierungen in solchen Situationen zu drosseln.
Low-Poly-Geometrie
Low-Poly-Geometrie mit starker Krümmung und glatten Normalen kann Artefakte aufweisen. Dies ist als „Schatten-Terminator-Problem“ bekannt. Dies tritt auch beim Ray Tracing und anderen hochpräzisen Sichtbarkeitsabfragen auf. Das Problem ergibt sich aus der Diskrepanz zwischen der realen Low-Poly-Geometrie und den „glatten“ Schattierungsnormalen: In der Nähe des Terminators liegen einige dieser Flächen geometrisch im Schatten, aber die nicht geometrischen Schattierungsnormalen sind leicht zum Licht hin ausgerichtet. Es ist üblich, dieses Artefakt mit einem auf Normalen basierenden Biasing beim Nachschlagen von Schatten zu umgehen. Dieses besondere Artefakt kann bei Virtual Shadow Maps stärker auffallen, da diese standardmäßig so eingestellt sind, dass sie sehr detaillierte Schatten von Nanite-Geometrien liefern.
Die beste Möglichkeit, dies zu beheben, ist die Erhöhung der Polygonanzahl in diesen Objekten/Regionen. Die Begrenzung der Divergenz zwischen den geometrischen und den Schattierungsnormalen reduziert oder beseitigt diese Artefakte, ohne die Schattenqualität an anderer Stelle zu beeinträchtigen. Mit Nanite ist das Hinzufügen weiterer Polygone einfach und im Allgemeinen kostengünstig. Wenn die betroffenen Objekte kein Nanite verwenden können, hilft oft auch das Hinzufügen eines höheren Detailgrads (LOD), da diese Artefakte meist sichtbar sind, wenn sich die Objekte in der Nähe der Kamera befinden.
Wenn es nicht möglich ist, mehr Geometrie hinzuzufügen, kann die Normalverzerrung der virtuellen Shadow-Map mit r.Shadow.Virtual.NormalBias (Standardwert 0,5) erhöht werden. Dies sollte nur dann in Erwägung gezogen werden, wenn eine Anpassung der Inhalte nicht möglich ist, da sich dies negativ auf die Qualität der Schatten in der gesamten Szene auswirkt, insbesondere aber in Bereichen mit feinen Details.
In den folgenden Beispielen sind Artefakte auf einer Kugel mit geringer Polygonzahl in der Nähe der Kamera und einer detailreichen Geometrie im Hintergrund sichtbar. Das Hinzufügen von Polygonen zur Kugel verbessert die Artefakte, ohne die detaillierte Landschaft im Hintergrund zu beeinträchtigen.
Die Anpassung der Verzerrung verbessert auch die Artefakte, aber feine Details gehen in der Hintergrundgeometrie sichtbar verloren.
Virtuelle Realität
Virtuelle Realität wird von Virtual Shadow Maps noch nicht vollständig unterstützt. Bei gerichteten Lichtern im rechten Auge kann es zu Artefakten kommen.
Geteilter Bildschirm
Der geteilte Bildschirm wurde nur minimal getestet und kann eine schlechte Leistung aufweisen.
Überlauf des physischen Seitenpools
Mit Virtual Shadow Maps werden alle Schattendaten in der Szene für alle Lichter in einem einzigen großen Textur-Pool gespeichert. Die Standard-Poolgröße wird von der Skalierbarkeitseinstellung Schatten beeinflusst, muss aber möglicherweise in Szenen mit vielen Lichtern, die Schatten mit hoher Auflösung verwenden, angepasst werden.
Es kann aber auch sein, dass sie auf leistungsschwächerer Hardware angepasst werden muss, um Videospeicher zu sparen.
Die Größe des Seitenpools kann mit r.Shadow.Virtual.MaxPhysicalPages angepasst werden. Das Aktivieren von Virtual Shadow Map-Statistiken mit r.ShaderPrintEnable 1 und r.Shadow.Virtual.ShowStats 2 zeigt nacheinander Statistiken über die aktuelle Nutzung des Seitenpools an.
Wenn die Anzahl der Seiten den Wert von Max Seiten überschreitet, kommt es zu einer Beschädigung, die sich manchmal als Schachbrettmuster oder als beschädigte oder fehlende Schatten äußert. Wenn der Schattenseitenpool überläuft, wird eine Warnung auf dem Bildschirm und im Protokoll angezeigt.
In diesem Fall solltest du die Größe des Seitenpools erhöhen oder die Schattenauflösung bzw. die Anzahl der Licht-werfenden Virtual Shadow Maps verringern.
Szenenerfassung
In einigen Fällen können Komponenten der Szenenerfassung dazu führen, dass der gesamte Virtual Shadow Map-Cache ungültig wird. Die Symptome hierfür zeigen sich in der Regel darin, dass die Invalidierungen in der Virtual Shadow Map-Statistik niedrig sind, die Cache-Seiten jedoch ebenfalls niedrig (oder manchmal sogar null) sind und die Visualisierung der Cache-Seiten einheitlich rot ist.
In diesem Fall kannst du versuchen, alle Actors der Szenenerfassung in der Szene auszublenden/zu entfernen, um zu prüfen, ob sie das Problem verursachen.
Derzeit gibt es keine andere Lösung als die Deaktivierung von Szenenerfassung, wenn dieses Problem auftritt.
Materialien
Es werden nur einfache Subsurface-Materialien unterstützt. Subsurface-Profil und Übertragung sind noch nicht implementiert. Wenn sie von einem Material verwendet werden, wird dieses Material schattiert, als ob es undurchsichtig wäre.
Schatten-Auflösung
Virtual Shadow Maps bieten im Vergleich zu herkömmlichen Shadow Maps eine deutlich höhere Auflösung, aber flache Lichtwinkel (oder projektives Aliasing) und sehr große lokale Lichter können die verfügbare virtuelle Auflösung erschöpfen. Je nach Oberfläche der Geometrie kann sich dies in Form von kastenförmigen Schatten und Verzerrungsproblemen äußern.
Clip-Maps mit gerichteten Lichtern sind viel weniger anfällig für Auflösungsmängel, aber sehr schmale Kamera-Sichtfelder können auch diese irgendwann erschöpfen.
Es gibt keine einfache Lösung für das projektive Aliasing mit Shadow Maps. Auch bei Virtual Shadow Maps ist eine gewisse Vorsicht geboten, um die schlimmsten Fälle zu vermeiden und ein Gleichgewicht zwischen Auflösung und Leistung herzustellen.
Kartenprüfungswarnungen
Virtual Shadow Maps verursachen einige Ungenauigkeitswarnungen bei der Kartenprüfung:
Die Meldung Beleuchtung muss neu erstellt werden erscheint nicht, wenn virtuelle Shadow-Maps aktiviert sind, auch wenn die Beleuchtung tatsächlich neu erstellt werden muss, wenn die Funktionen Lumen Global Illumination and Reflections nicht verwendet werden. Während die stationäre direkte Beleuchtung bei aktivierten Virtual Shadow Maps dynamisch ist, durchläuft die stationäre indirekte Beleuchtung weiterhin den Bake-Vorgang.
Warnungen bezüglich preshadows können ignoriert werden, da sie bei der Verwendung von virtuellen Shadow-Maps nicht relevant sind.