Dynamisch wechselnde Tageszeiten, unterschiedliche Wettereffekte und viele erforschbare Biomes machen das Raytracing in Echtzeit zu einer großartigen Wahl für The Riftbreaker
Eine kurze Tour durch Raytracing
Die Welt von The Riftbreaker ist völlig dynamisch und zerstörbar. Fast alle Objekte, die in der Umgebung vorhanden sind, können vom Spieler beeinflusst werden. Die Vegetation kann gebogen, verbrannt und aufgelöst werden. Tausende von Kreaturen können um den Spieler herumschwärmen und den Bildschirm vollständig ausfüllen. Diese Art des Spielens erfordert einen speziellen Ansatz zum Rendern voll dynamischer Schatten.
Zuvor verwendeten sie zur Erzeugung von Schatten in der Schmetterling 2.0-Engine die Echtzeit-Schattenkartenmethode (ohne die vorberechneten Schattenkarten selbst). Diese Lösung war aufgrund der volldynamischen Geometrie der Szene am optimalsten. Es war jedoch nicht möglich, vorberechnete Lichtkarten zu verwenden, da diese nicht genau dieser Geometrie entsprachen. Deshalb waren dynamische Schattenkarten lange Zeit die einzige wirkliche Lösung. Obwohl sie in der gesamten Branche weit verbreitet sind, weisen sie eine Reihe von Einschränkungen auf.
Fragment der Bossschlacht. Am Boss ist ein Schattenwurflicht angebracht, das der Szene visuelle Wiedergabetreue verleiht.
Die neuesten GPU-Generationen sind leistungsstark genug, um Raytracing-Berechnungen in Echtzeit durchzuführen. Und das Aufkommen neuer Grafikkarten hat es dem Studio ermöglicht, endlich Raytrace-Schatten einzuführen, die gegenüber herkömmlichen Shadow-Mapping-Methoden überlegene Ergebnisse liefern.
Das Grundprinzip der Schattenverfolgung besteht darin, dass wir die Szene nicht aus der Sicht der Lichtquelle betrachten und nicht nach allen Arten von Schattenkasten suchen, wie dies bei Schattenkarten der Fall ist. Mit Raytracing können Sie einfach Strahlen in eine Lichtquelle feuern. Wenn der Strahl auf ein Hindernis trifft, wird es nicht direkt beleuchtet. Wenn es die Lichtquelle erreicht, werden keine Schatten hinzugefügt. Dieser Algorithmus ist recht einfach, liefert jedoch hervorragende Ergebnisse und bietet Lösungen für häufig auftretende Probleme beim Rendern von Schatten. Die GPU-Leistung ist jedoch sehr wählerisch.
Jedes Element der dynamischen Geometrie der Szene kann einen Schatten werfen. Die Herausforderung bestand darin, diese Schatten so genau wie möglich erscheinen zu lassen und gleichzeitig die Leistung aufrechtzuerhalten.
Das Hinzufügen einer völlig neuen Rendering-Technologie zu Ihrer eigenen Spiel-Engine ist keine leichte Aufgabe. Im Fall von The Riftbreaker hat die Zusammenarbeit des Studios mit AMD sehr geholfen. Sie stellten eine proprietäre GPUOpen RT Shadows-Bibliothek zur Verfügung, die sowohl Raytracing- als auch Rauschunterdrückungslösungen enthielt, um die Raytracing-Pass-Ergebnisse zu bereinigen. Bevor ich diese Bibliothek verwenden konnte, musste ich jedoch einen DirectX 12-Renderer für die Spiel-Engine entwickeln. Der Grund dafür war die DirectX Raytracing API (auch bekannt als DXR), die im DirectX 12 Ultimate-Standard eingeführt wurde. Diese API ermöglicht die neuen Shader- und Hardware-Raytracing-Funktionen moderner GPUs.
The Riftbreaker . .
Ein weiterer Vorteil der Arbeit mit AMD ist der Open Source Code ihrer Lösungen. Auf diese Weise kann eine Technologie implementiert werden, die mit den neuesten Gaming-Plattformen auf dem Markt kompatibel ist, einschließlich Konsolen der nächsten Generation. Es ist auch erwähnenswert, dass die Plattformkompatibilität die Auswahl- und Rendering-API beeinflusst hat. Es wurden zwei Optionen in Betracht gezogen: Vulkan und DirectX 12. Obwohl Vulkan Raytracing enthält, ist diese API auf Xbox oder PlayStation nicht verfügbar, und zum jetzigen Zeitpunkt wird sie nur von Nvidia auf dem PC unterstützt. Durch die Umstellung auf DirectX 12 erhalten Xbox- und Windows-PCs native Raytracing-Unterstützung, sodass Sie Hardware von jedem Hersteller verwenden können.
Wenn sich die Wetterbedingungen ändern, ändert sich auch der Halbschatten. In diesem Beispiel können Sie sehen, wie die Schatten bei Regen weicher und bei Sonnenschein schärfer werden.
Die Vorteile der Implementierung von Raytrace-Schatten können je nach Implementierungsszenario variieren. Im Fall von The Riftbreaker sind die wichtigsten Funktionen:
- "Unendliche" Schattenauflösung: Die Qualität des Schattens hängt im Gegensatz zu herkömmlichen Schattenabbildungsmethoden nicht von der Entfernung vom Motiv zur Kamera ab. Jedes Pixel auf dem Bildschirm hat eine individuell berechnete Schattierung, was zu genaueren und stabileren Schatten ohne flackernde Artefakte führt.
- Halbschatten verschieben: Raytrace-Schatten simulieren dynamisch Situationen wie den Übergang von einem bewölkten Himmel bei Regen zu einem hellen Mittag.
- Geringe Kosten für die Berechnung zusätzlicher Lichtquellen, die Schatten werfen. Mit der aktuellen Implementierung von Raytrace-Schatten in The Riftbreaker können bis zu 4 Schattenwerflichter gleichzeitig ohne signifikante Leistungseinbußen berechnet werden. Die Kosten für das Hinzufügen zusätzlicher Lichter bei Schattenkarten sind viel höher.
Alle diese Vorteile gehen zu Lasten eines erheblichen Leistungsverlusts. Selbst mit den neuesten GPUs, die hardwarebeschleunigtes Raytracing unterstützen, können FPS-Werte mit allen aktivierten Raytracing-Effekten bis zu halb so hoch sein, wenn dieselbe Szene ohne Raytracing verglichen wird.
Raytrace-Schatten implementieren
Das Hinzufügen von Raytrace-Schatten zu einer Szene ist ein komplexer Vorgang, der zu einer äußerst detaillierten Karte von beleuchteten und nicht beleuchteten Pixeln führt. Während des ersten Durchlaufs der Strahlverfolgung ist es erforderlich, die Position aller Pixel im sichtbaren Bereich des Bildschirms wiederherzustellen und die Strahlen von diesen Pixeln auf alle Lichtquellen zu lenken, die sie beeinflussen. Diese Koordinaten werden aus dem Tiefenpuffer entnommen. Wenn der Strahl die Lichtquelle erreicht, wird die Oberfläche direkt beleuchtet. Wenn der Strahl auf seinem Weg auf ein Hindernis trifft, wird die Oberfläche schattiert. Um den Prozess zu optimieren, werden alle Oberflächenstrahlen mit normalen Karten geworfen, die von der Lichtquelle weg weisen. Der nächste Durchgang definiert den Shadertyp, der auf den Schnittpunkt von Strahl und Oberfläche angewendet wird. Die DXR-API verwendet den Shader für die Verarbeitung.basierend auf dem Ergebnis der Raytracing-Methode und vergleicht es mit der vorhandenen Shader-Tabelle.
Beispielspielszene mit
Raytracing - Weiche Schatten und Umgebungsokklusion aktiviert Die Grafikkarten der Radeon RX 6000-Serie, mit denen Raytracing in The Riftbreaker entwickelt wurde, sind leistungsstark und können Millionen von Strahlen pro Sekunde auslösen. Es werden jedoch noch mehr Informationen benötigt, um eine genaue Vorstellung davon zu erhalten, wie sich Licht in der Spielwelt verhält. Beim Offline-Rendering bedeutet dies normalerweise, dass für jedes Pixel Tausende von Strahlen in alle Richtungen geworfen werden. Keine moderne Hardware ist in der Lage, diese Berechnungen in Echtzeit durchzuführen, geschweige denn 60 Mal pro Sekunde. Sie müssen also irgendwie eine genaue Schattenkarte mit unvollständigen Daten erstellen.
. , .
Das Fehlen genauer Daten führt zu vielen Problemen und kann zu einer Verschlechterung der visuellen Qualität der Szene führen. Während wir die meisten Informationen haben, die zum Rendern von Objekten benötigt werden, verschwimmen Details wie Pfade, Kanten und weiche Schatten und verschmelzen miteinander. Eine begrenzte Anzahl von Strahlen pro Bild führt zu verrauschten Schatten. Dann kommt eine weitere Open-Source-GPU-Bibliothek ins Spiel - AMDs FidelityFX Denoiser. Das Entfernen von Rauschen ist ein komplexer Prozess, der dank der weit verbreiteten Verwendung zeitlicher Methoden möglich geworden ist, mit denen vergangene Frames analysiert und zu neuen kombiniert werden. Mit AMD NR können Sie schnell die Durchschnittswerte der verfügbaren Daten ermitteln und festlegen, welche Eigenschaften auf ein bestimmtes Pixel angewendet werden sollen, um ein klares Bild ohne sichtbare Kompromisse zu erhalten.
Die gleiche Szene nach dem Entfernen von Rauschen
, . .
Natürlich stellte sich heraus, dass die Implementierung von Raytrace-Schatten keine so einfache Aufgabe war, dass sie sich auf die Verwendung einiger vorgefertigter Bibliotheken beschränkte. Der Riftbreaker stellt seine eigenen einzigartigen Herausforderungen, die spezifische Lösungen erfordern.
Das erste derartige Problem war die große Anzahl dynamischer Objekte in der Spielwelt. In The Riftbreaker übernehmen Sie die Rolle eines Wissenschaftlers, der einen Exoplaneten erforscht, in dem zahlreiche fremde Arten von Flora und Fauna leben. Der Spieler wird ab und zu von Horden von Tausenden außerirdischen Kreaturen angegriffen. Jeder von ihnen muss seinen eigenen Schatten werfen. In Kombination mit einem dynamischen Vegetationssystem, das auf Wind, Stoßwellen und Biegekräfte anderer Objekte reagiert, ist dies zu einem großen Optimierungsproblem geworden.
Tausende von Entitäten interagieren in Echtzeit miteinander
Das Hauptproblem wurde durch die Art und Weise verursacht, wie das obere Beschleunigungsgerüst für Raytracing die Daten verarbeitet. Diese Struktur speichert Informationen über Objekte in der Szene, die während des Raytracing-Durchlaufs verwendet werden. Diese Daten können nur als vorgebackene Beschleunigungsstruktur niedrigerer Ebene gespeichert werden, die Informationen zu den Scheitelpunkten des Objekts enthält. Dies ist kein Problem, wenn es um Felsen oder Gebäude geht, aber alle Einheiten mit skelettartigen, dynamisch gemischten Animationen und dynamischer Vegetation stimmen nicht mit der Annahme vorgebackener Daten überein.
«» . , . : , .
Es mussten einige ernsthafte Schritte unternommen werden, um dem Beschleunigungsrahmen alle erforderlichen Daten zur Verfügung zu stellen. Jedes dynamische Objekt in der Szene wird einzeln in ein völlig neues statisches Modell eingebrannt, das während des Raytracing-Durchgangs verarbeitet werden kann. Um die Genauigkeit aufrechtzuerhalten, muss dieser Vorgang in jedem Frame wiederholt werden. Die Komplexität dieser Aufgabe wird durch die Tatsache erhöht, dass The Riftbreaker über ein dynamisches Wettersystem verfügt. Aus diesem Grund ist es möglich, dass sich die Lichtquelle in einem Winkel befindet, aufgrund dessen das Objekt einen Schatten in den Rahmen wirft, ohne direkt sichtbar zu sein. Dies bedeutet, dass Sie während des Backvorgangs nicht nur Objekte im sichtbaren Teil des Bildschirms, sondern auch außerhalb des Bildschirms berücksichtigen müssen.
Ein Bild der gesamten Beschleunigungsstruktur wurde in nur einem Rendering-Frame erstellt
Das Vorbereiten von Beschleunigungsstrukturen ist im Hinblick auf CPU-Berechnungen sehr umständlich und kann leicht zu einem Engpass für den gesamten Renderer werden. Die Schmetterling Engine 2.0 reduziert die Belastung der Zentraleinheit durch intensive Parallelisierung aller Prozesse, die zur Vorbereitung einer Szene für die Strahlverfolgung erforderlich sind. Durch die Verteilung der Operationen zwischen der CPU und der GPU konnte die Verarbeitungsleistung ermittelt werden, die erforderlich ist, um alle diese Operationen in jedem Frame auszuführen. Bei einem Testszenario mit etwa 6.000 Kreaturen, die die Basis des Spielers angreifen, konnte die Renderzeit durch Parallelisierung von CPU-abhängigen Aufgaben (unter Verwendung einer AMD Ryzen 9 3900X-CPU und einer Vorabversion der Radeon 6800XT) von 60 ms auf 17 ms reduziert werden.
The Riftbreaker. , , , .
-
Eine weitere einzigartige Herausforderung, die Ingenieure bei der Implementierung von Raytracing-Techniken in The Riftbreaker lösen mussten, stellte sich als mit dem Vegetationssystem verbunden heraus, wenn auch auf etwas andere Weise. Die vom Laub verwendeten Texturen sind normalerweise Alpha-getestet und haben oft transparente Bereiche. Für Raikast spielt es jedoch keine Rolle. Sobald der Strahl auf ein transparentes Pixel in der Textur trifft, gibt er den normalen "Treffer" zurück. Dies bedeutet nicht unbedingt, dass das Pixel, aus dem wir die Strahlen erzeugen, mit Schatten bedeckt sein muss, denn wenn das von uns getroffene Texel transparent ist, muss sich der Strahl weiter in Richtung der Lichtquelle bewegen. Es gibt viele solcher Texturen im Spiel, daher war es notwendig, eine Lösung für dieses Problem zu finden und dem AnyHit-Shader Unterstützung für Alpha-Tests hinzuzufügen.
- . , .
Der Ansatz des Studios bestand darin, eine Lösung zu verwenden, die in traditionellen Rendering-Techniken verwendet wird. Wenn wir auf die Oberfläche treffen, erhalten wir die Schwerpunktkoordinaten des Dreiecks am Schnittpunkt. Diese Koordinaten reichen nicht aus, um zu bestimmen, welches Pixel der Textur der Strahl getroffen hat, und Sie können nur die Position des Schnittpunkts im Dreieck ermitteln. In diesem Stadium können wir jedoch bestimmen, welche Peaks berücksichtigt werden sollten. Jedem Scheitelpunkt des Dreiecks sind vom Grafikdesigner während der Texturierung eine Reihe von UVW-Koordinaten zugewiesen. Wenn wir wissen, in welches Dreieck wir gefallen sind, die Koordinaten des Schnittpunkts innerhalb dieses Dreiecks und welcher Teil der Textur es bedecken soll, können wir einen Alpha-Test durchführen.
Die Polygone unter den Vegetationstexturen sind für die Strahlen undurchsichtig. Ich musste eine zusätzliche Methode einführen, um zu überprüfen, ob sie an die Stelle auf der Textur fallen, die wirklich undurchsichtig war.
Bevor all dies geschieht, muss die Beschleunigungsstruktur jedoch Informationen über Texturen und ihre Positionen weitergeben. Dazu benötigen wir eine Shader-Tabelle, die im Wesentlichen eine Datenbank für die GPU ist. Es listet die in der Szene verwendeten Texturen und die ihnen in den Index- und Scheitelpunktpuffern zugewiesenen Werte auf. Mit der Shader-Tabelle können Sie schnell alle Modell- und Texturdaten abrufen, die Sie zum Ausführen nachfolgender Schattierungsschritte benötigen.
Da The Riftbreaker in einer unbewohnten fremden Welt spielt, gibt es hier viele wilde Tiere
Wenn das Ergebnis „undurchsichtig“ ist, werden die Schattierungsdaten angewendet und der Prozess endet für diesen bestimmten Strahl. Bei undurchsichtigen Treffern wird ein Alpha-Test durchgeführt. Wie bereits erwähnt, können Sie von hier aus die Schwerpunktkoordinaten des Punkts im Dreieck erhalten, mit dem er kollidiert, wenn ein Strahl eine Oberfläche überquert. Wenn Sie diese Koordinaten kennen und sich auf den Indexpuffer beziehen, können Sie die Indizes der Eckpunkte des angegebenen Dreiecks abrufen. Dadurch werden die UVW-Koordinaten abgerufen. Mit den vom Indexpuffer bereitgestellten Daten können Sie jetzt im Scheitelpunktpuffer Informationen darüber finden, wo diese Scheitelpunkte auf die Textur fallen. Erst nach all diesen Aktionen erhalten wir eine Antwort auf die Frage, ob der Strahl mit einer undurchsichtigen oder transparenten Oberfläche kollidierte. Wenn der Alpha-Wert am Schnittpunkt unter dem Transparenzschwellenwert liegt, schneidet der Strahl die Szene weiterhin.
Auf diese Weise erhalten wir in jedem Frame das genaue Ergebnis. Klicken Sie auf das Bild für eine größere Ansicht.
Alpha-Tests erhöhen die Materialkosten in Bezug auf Raytrace-Schattenberechnungen im Vergleich zu herkömmlichen Methoden, sodass sie nach Möglichkeit am besten vermieden werden. In einem Dschungelszenario sind die Kosten für das Senden eines solchen Strahls etwa 20% höher als die eines Strahls, der auf ein undurchsichtiges Objekt trifft. Um die Anzahl der Strahlen zu verringern, die auf transparente Oberflächen treffen, sind Optimierungen erforderlich, indem die Oberfläche aller transparenten Objekte begrenzt wird. Die Kameraansicht in The Riftbreaker ist isometrisch, sodass die Anzahl der gleichzeitig sichtbaren Polygone natürlich begrenzt ist und wir die Polygon-Renderzeit der meisten Objekte problemlos verlängern können, ohne die GPU-Leistung zu beeinträchtigen.
Fazit
Die Verwendung von Raytracing durch den Riftbreaker hat nur profitiert. Die Welt des Spiels ist glaubwürdiger geworden, was zu einem besseren Eintauchen in sie beiträgt. Die kleinen Details, die mit Raytracing hinzugefügt wurden, tragen definitiv zur Verbesserung der Wahrnehmung bei. Einen hellen Kometen am Himmel zu sehen, der Schatten auf dynamische Objekte auf der Erde wirft, ist ein wirklich schöner Anblick. Bewölkte Tage wiederum begrüßen den Spieler mit weichen Schatten und einer gedämpften Farbpalette. Der Riftbreaker wird sicherlich seinen wohlverdienten Platz in der Aufstellung der Spiele der nächsten Generation einnehmen.
Der Riftbreaker kommt 2021 auf PC und Konsolen.