Heute werden wir uns einige Beispiele für Aufnahmen aus dem Spiel ansehen und die im Spiel verwendeten Grafiktechniken analysieren.
Vorwort
Dies ist eine inoffizielle Analyse des Spiels. Ich habe gerade das Frame Grabbing mit RenderDoc analysiert . Wenn Sie Informationen von den Entwicklern selbst erhalten möchten, können Sie die Folien aus dem Bericht über Fabian Bayers SIGGRAPH lesen . Folien (unten auf der Seite), Video (beginnt um 1:58:00 Uhr).
Sie können auch die Analyse der GTA5- Grafiken von Adrian Correge [ Übersetzung auf Habré] lesen . Da sowohl RDR2 als auch GTA5 von derselben Firma erstellt wurden und dieselbe Engine verwenden, sind auch hier einige der Tricks von GTA5 vorhanden.
Ein weiterer wichtiger Punkt: Ich bin kein erfahrener Grafikprogrammierer und noch neu in diesem Bereich. Daher ist mir vieles unverständlich. Wenn Sie Fehler oder Dinge finden, die verbessert werden können,schreiben Sie mir . Lass uns gehen!
Analysieren Sie den Rahmen
Hier ist unser Hauptrahmen für die Analyse:
Der Frame wurde auf einem PC mit mittleren Einstellungen aufgenommen.
In Spielen wie RDR2 ist es fast unmöglich, alle Bewegungen auf einmal zu erkunden. Ihre Arbeit wird zwischen mehreren Frames übertragen. Also habe ich ein paar Bilder aufgenommen, aber das oben gezeigte wird das Hauptbild sein. Es enthält viele Eigenschaften, einschließlich: Scheinwerfer und Scheinwerfer, Richtungsbeleuchtung (es ist sehr klein, aber es ist), Gebäude, NPCs, Pferde, Bäume, Vegetation, Wolken usw. Darin können Sie die meisten im Spiel verwendeten Rendering-Techniken zeigen.
RDR2 ist ein Open-World-Spiel, daher wird immer Daten gestreamt. Folglich beginnt das Framing mit einer Reihe von Aufgaben wie dem Erstellen und Entfernen von Texturen, dem Scannen von Shader-Ressourcen, zufälligen Scans, dem Aktualisieren von Deskriptoren, Puffern usw.
Land- / Feldkarte
Schmutz spielt eine große Rolle. Schmutz ist nicht nur ein Spielmechaniker, sondern macht die Umgebung auch realistischer. Das Spiel rendert die Texturen von Menschen- und Pferdespuren zusammen mit den Texturen der Wagenradspuren in eine Verschiebungskarte. Diese akkumulierte Textur wird für das Parallax Occlusion Mapping beim Rendern von Gelände verwendet.
Schlammkarte:
R16_UNORM
2048x2048
Himmel und Wolken
Nach dem Durchlauf der Schmutzberechnung erledigt das Spiel eine Menge GPU-Berechnungsarbeit. Sie beziehen sich hauptsächlich auf den Himmel und die Wolken. Wolken, Nebel und Umgebungslicht sind einige der bekanntesten RDR2-Effekte. Weitere Informationen zu diesem Schritt finden Sie auf Fabians Folien. Er erklärt das alles viel detaillierter als ich.
Umgebungskarte
Umgebungskarten sind die Hauptquelle für Reflexionen sowohl für RDR2 als auch für GTA5.
Wie GTA5 generiert RDR2 aus der Kameraposition eine Umgebungswürfelkarte. Die Spiel-Engine generiert eine dünne Umgebungskarte GBuffer ähnlich der in Far Cry 4 verwendeten .
Die Gesichter der kubischen Karte der Umgebung (Albedo):
RGBA8_SRGB
Gesichter einer Würfelumgebungskarte (Normalen):
RGBA8_UNORM
Umgebungswürfelkanten (Tiefe): Das
D32S8
Generieren von Umgebungswürfelkarten in jedem Frame kann eine sehr umständliche Aufgabe sein. RDR2 verwendet Optimierungen, um die Rechenkosten zu senken. Beispielsweise rendert das Spiel nur statische und undurchsichtige Objekte, führt vor dem Rendern jedes Gesichts eine Kegelstumpf-Keulung durch und rendert niedrigere LOD-Versionen der Modelle. Ich fand jedoch heraus, dass die Anzahl der Reliefpolygone für Umgebungskarten immer noch sehr hoch ist.
Nach dem Passieren von G-Buffer wird eine kubische Karte der Himmelsumgebung unter Verwendung einer Paraboloidkarte des Himmels und der Wolkentexturen erzeugt. Der nächste Schritt ist die Faltung. Für die bildbasierte Beleuchtung verwendet die RDR2-Engine die Split-Sum-Approximation. Diese Methode verwendet eine vorgefilterte Umgebungskarte zusammen mit LUT BRDF-Umgebungen. Zum Filtern reduziert das Spiel die kubische Karte der Umgebung und speichert minimierte Versionen in den Mip-Textur-Ebenen der kubischen Karte.
Bevor RDR2 einen Lichtdurchgang für die Würfelbestrahlungskarte durchführt, wird die eingebrannte großflächige Umgebungsokklusion in eine andere Würfelstruktur umgewandelt. Das Spiel verwendet die Umgebungsokklusion des Bildschirmbereichs, aber SSAO hilft nur in kleinen Maßstäben. Die gebackene Umgebungsokklusion hilft, eine Verdunkelung in größerem Maßstab durchzuführen, z. B. Verdunkelung von Terrassen und Innenräumen.
Facetten von Umgebungswürfeln (gebackene AO):
R8_UNORM
Das Spiel verwendet das verzögerte Rendern von Kacheln , um die Beleuchtung der Umgebungskarten zu berechnen . Light Culling und Lighting werden zusammen in einem Compute Shader Pass für jede Seite der Umgebungskarte berechnet. (Dank an @benoitvimont für diesen Tipp .) Auch für gebackene Beleuchtung verwendet das Spiel eine Top-Down-Welt-Lightmap-Technik , die der in Assassins Creed III verwendeten ähnelt .
Für jede Seite der Würfelkarte rendert RDR2 die endgültige Farbe über der Textur der Himmelsumgebung. Dann filtert das Spiel die kubische Karte der Umgebungen auf die gleiche Weise wie die kubische Karte der Umgebungen des Himmels.
Facetten der Umgebungswürfelkarte (endgültig):
R11G11B10_FLOAT
Wenn sich der Spieler in der Nähe eines Gebäudes befindet, lädt RDR2 Umgebungskarten, die sich im Inneren der Gebäude befinden. Es gibt auch kubische G-Buffers-Karten, die von der Festplatte gestreamt werden.
Gebackene Gesichter einer kubischen Karte der Umgebung (Albedo):
BC3_SRGB
(Gebackene AO wird im Alphakanal gespeichert)
Die gebackenen Flächen der Würfelumgebungskarte (Normalen):
BC3_UNORM
Gebackene Kanten des Umgebungswürfels (Tiefe):
R16_UNORM
Das Spiel berechnet die Beleuchtung dieser Karten und filtert sie wie die vorherigen. Es wird jeweils nur eine gebackene Umgebungskarte berechnet und nur dann wiedergegeben, wenn sich die Tageszeit ändert. Alle Umgebungskarten werden in einem Array von Texturwürfelkarten gespeichert. Es wird keine Umwandlung einer kubischen Karte in eine Doppelparaboloidkarte durchgeführt.
G-Buffer Pass
Diese Phase beginnt mit einem vorläufigen Spaziergang durch die Tiefen des Reliefs. Anschließend wird die Szene in G-Buffers gerendert.
GBuffer 0 RGB |
GBuffer 0 A |
---|---|
RGBA8_SRGB
- Dieser Puffer enthält die Albedo in den RGB-Kanälen (Grundfarbe). Ich verstehe nicht ganz, wofür die Alphakanaldaten bestimmt sind, aber sie werden während der Anti-Aliasing-Phase verwendet.
GBuffer 1 RGB |
GBuffer 1 A |
---|---|
RGBA8_UNORM
: RGB-Kanäle enthalten Normalen und Alpha-Kanäle enthalten etwas, das mit Stoff und Haaren zu tun hat.
GBuffer 2 RGB |
GBuffer 2 A |
---|---|
RGBA8_UNORM
: Dieses Ziel wird für Materialeigenschaften verwendet.
- R: Reflexionsvermögen (f0)
- G: Glätte
- B: Metallisch
- A: enthält Schattierungen (dieser Kanal wird in den folgenden Schritten als Schattenmaske verwendet)
GBuffer 3 R |
GBuffer 3 B |
---|---|
RGBA8_UNORM
: Der rote Kanal enthält Hohlräume. Es gibt wieder einige mysteriöse Daten im blauen Kanal. Und der Alpha-Kanal enthält Daten zu Haaren. Ich konnte im grünen Kanal nichts finden.
GBuffer 4 RG |
---|
RG16_FLOAT
: Dieser Puffer enthält die Geschwindigkeit im Bildschirmbereich zum Implementieren von Bewegungsunschärfe.
GBuffer 5 Depth |
GBuffer 5 Stencil |
---|---|
D32S8
: Wie GTA5 verwendet RDR2 das inverse z für die Tiefe und den Schablonenpuffer, um einer bestimmten Gruppe von Netzen Werte zuzuweisen.
Ein weiteres Ziel wird aus den gebackenen Daten generiert:
GBuffer 6 R |
GBuffer 6 G |
---|---|
Dieser Puffer enthält im roten Kanal dieselbe gebackene Umgebungsokklusion wie in der Umgebungskartenphase. Es gibt aber auch andere Kanäle in dieser Textur. Der grüne Kanal enthält Daten, die den Daten im blauen Kanal von GBuffer 3 ähneln. Auch hier verstehe ich nicht, wofür diese Daten verwendet werden. In den aufgenommenen Frames konnte ich keine Daten im blauen und Alpha-Kanal finden. Ich werde dies genauer untersuchen.
Schattenkartengenerierung
Nach der G-Buffer-Phase beginnt das Spiel mit dem Rendern von Schattenkarten. Es werden 2D-Texturarrays für Punktquellen-Schattenkarten und kubische Texturarrays für Spotlight-Quellenschattenkarten verwendet.
Einige Spiele verwenden eine große Schattenatlas-Textur für die Schattenkarten ( wie DOOM ). Einer der Vorteile dieser Methode besteht darin, dass die Größe der Schattenkarte je nach Entfernung stark variieren kann. Bei der Verwendung von Textur-Arrays geht diese Flexibilität verloren, da alle Texturen im Array dieselbe Größe haben müssen. In RDR2 gibt es drei verschiedene Texturarrays für verschiedene Qualitätsstufen. Zum Beispiel haben Suchscheinwerferquellen:
- 512x768 D16 für entfernte Quellen
- 1024x1536 D16 ( — )
- 2048x3072 D16 ( / )
Punktquellen werfen Schatten in alle Richtungen. Um diese Aufgabe zu bewältigen, verwenden Spiele eine Technik namens Omnidirectional Shadow Mapping , bei der die Szene von der Kameraposition aus in eine Würfeltiefenkarte gerendert wird. Mit dieser Technik werden Schatten von einem Feuer und Schatten von einer Laterne Arthur gerendert. Wie Scheinwerfer haben Scheinwerfer drei verschiedene Arrays für unterschiedliche Qualitätseinstellungen.
Die meisten statischen Punktquellen im Spiel haben Würfelschattenkarten gebacken.
Daher verwendet das Spiel nach Möglichkeit gebackene Schatten und generiert nur dann eine Schattenkarte, wenn sich der Spieler in der Nähe des Lichtvolumens befindet. Aber es ist tatsächlich noch interessanter.
Die meisten Wandleuchten sind Scheinwerfer, aber das Spiel generiert keine omnidirektionale Schattenkarte für sie. Stattdessen wird eine Schattenkarte generiert und der Speicher dieser Schattenkarte in das Cube-Array der Punktquellen-Schattenkarte kopiert.
Auf der linken Seite befindet sich eine 1024 x 1536-Spotlight-Schattenkarte, auf der rechten Seite befinden sich dieselben Bilddaten in einem 512 x 512-Würfel-Texturformat
Beachten Sie, dass lineares z in lokalen Schattenkarten gespeichert ist.
Dies erklärt, warum die Entwickler keine quadratische Schattenkarte für die Scheinwerfer verwendeten. Die Anzahl der Pixel in der Schattenkarte der Suchscheinwerferquellen und der kubischen Karte der Punktquellen muss gleich sein. Sie haben wahrscheinlich gesehen, dass das richtige Bild in Stücke geschnitten ist. Dies geschah, weil die Breite der Schattenkarte der Scheinwerfer- und Punktquellen unterschiedlich ist.
Beachten Sie auch, dass diese Textur keine 360 Grad abdeckt. Glücklicherweise haben Quellen an Gebäuden normalerweise eine Wand auf der Rückseite, und gebackene Schattenkarten verdecken sie.
Ein weiterer interessanter Punkt ist, dass der Prozess umgekehrt ist. Nehmen wir zum Beispiel Saint-Denis - eine der größten Städte im Spiel. Das Spiel generiert omnidirektionale Schattenkarten für die Scheinwerfer und kopiert diese Daten in eine Reihe von Schattenkarten für Scheinwerfer. Ich weiß nicht, warum in RDR2 das Shadowing auf diese Weise erfolgt. Ich konnte solche Tricks im Internet nicht finden.
Die Überlagerung der Schattenrichtungsbeleuchtung in RDR2 ist fast genauso implementiert wie in GTA5 . Dies ist Cascaded Shadow Mapping mit vier Kaskaden. Als Kaskade wird jede Kachel der Größe 1024 x 1024 aus der Textur 1024 x 4096 verwendet (mit durchschnittlichen Grafikeinstellungen).
Spotlight Shadow Atlas:
R16_UNORM
Bühnenbeleuchtung
Schließlich ist es Zeit, all diese Umgebungskarten, Gbuffer, Schattenkarten und ua Puffer zu kombinieren.
Diese Phase besteht aus zwei Durchgängen: dem ersten für die globale Beleuchtung (Sonne / Mond) und dem zweiten für lokale Quellen.
Global Lighting Pass
Das Spiel rendert ein Quad im Vollbildmodus, um die Richtungsbeleuchtung zu berechnen, die in unserem Rahmen Mondlicht ist. Gebackene Beleuchtung wird auch von der oben genannten "Weltbeleuchtungskarte von oben" verwendet.
Lokaler Lichtdurchgang
In diesem Durchgang rendert das Spiel eine niedrige polykugelförmige Form für Punktquellenvolumina und ein Achteck für Scheinwerfervolumina. Die Beleuchtung wird durch additive Mischung von hinten nach vorne gerendert.
Um unnötige Shader - Anrufe zu vermeiden, verwendet das Spiel Tiefe begrenzten Tests - ein zusätzliches Merkmal von OpenGL / D3D11, die sie heimisch in Vulkan / D3D12. Sie verwendet auch Schablonentests, um Pixel zu verwerfen, die von durchscheinenden Objekten wie Fensterscheiben absorbiert werden. Diese Objekte werden während eines direkten Durchlaufs gerendert.
Wasser und Reflexionen rendern
In diesem Beitrag werde ich nicht über das Rendern von Wasser sprechen, da es einen separaten Beitrag verdient, aber ich werde ein wenig über Reflexionen sagen:
- Wie oben erwähnt, sind Umgebungskarten die Hauptquelle für Reflexionen. Für Standardreflexionen. Zum Beispiel verwendet das Spiel sie für Fensterreflexionen.
- Spiegel werden mit planaren Reflexionen gerendert, wodurch die Szene aus der Richtung der Reflexion neu gerendert wird. Dieser Vorgang erfolgt ebenfalls durch verzögertes Rendern.
- Reflexionen im Wasser verwenden Reflexionen des Bildschirmraums in Kombination mit der am Anfang des Rahmens erzeugten Reflexionskarte.
Direkte Beschattungsstufe
Einer der Nachteile der verzögerten Rendering-Pipeline besteht darin, dass es nicht möglich ist, durchscheinende Materialien mit GBuffers richtig zu rendern. Um dieses Problem zu lösen, rendert das Spiel durchscheinende Materialien von hinten nach vorne mit direkter Schattierung, wie die meisten verzögerten Renderings.
Ein direkter Pass kann jedoch kostspielig sein:
- , .
, , , . ( ), .
- .
, . - . - (, ) .
- , .
Die Förderzustände müssen geändert werden, um zwischen dem Trimmen der Vorder- und Hinterkante wechseln zu können. Und solche Änderungen können kostspielig sein.
Zu diesem Zeitpunkt wird ein weiteres Renderziel für den Bloom-Effekt generiert. Dieses Ziel speichert die Helligkeit der Blüte. Wie Sie auf dem Bild sehen können, sind durchscheinende Objekte heller.
Zielluminanzblüte:
R8_UNORM
Beachten Sie, dass die Blütenhelligkeit über große Entfernungen zunimmt, sodass neblige Bereiche stärker leuchten.
Nachbearbeitung
In diesem Stadium werden zeitliches Anti-Aliasing, Bloom, Bewegungsunschärfe, Tiefenschärfeeffekt und andere Effekte ausgeführt. Nachbearbeitung, ich plane, einen separaten Beitrag zu widmen. Deshalb werden wir hier nicht besonders darauf eingehen, aber ich möchte ein paar Worte über die Blüte sagen. Dank der volumetrischen Beleuchtung leuchtet das Hauptputzziel bereits die Lichtquellen.
Die Bloom-Implementierung in RDR2 ist der in Post Processing der nächsten Generation in Call of Duty: Advanced Warfare beschriebenen Implementierung sehr ähnlich .
- Ziel ohne Schwellenwerte wird als Eingabe genommen,
- Rendere Ziellevel
R11G11B10_FLOAT
7-mip, - Bilinearer Filter 13. Ordnung für Downsampling, 3x3-Zeltfilter für Upscaling.
Das Spiel kombiniert dann dieses gefilterte Ziel des Blüteeffekts mit dem Hauptziel sowie mit der Zielhelligkeit der Blüte.
Schlussfolgerungen
Es gibt noch viel mehr zu sagen, aber ich möchte nicht, dass dieser Beitrag zu lang ist. Ich möchte meine Erkenntnisse über all dies sowie einige der Kuriositäten, die ich während der Analyse entdeckt habe, mitteilen.
- , — . , . ( , .) bloom: - , , - , . GPU? ?
- , RDR2 . , (, GBuffers). ? ?
- : ( ) . SSAO, SSR, . target SSAO ?
Versteh mich nicht falsch, ich beschuldige niemanden (obwohl ... ich bin ein wenig verärgert über die niedrige Bildrate), ich versuche nur zu verstehen, wie solche Entscheidungen getroffen wurden. Immerhin haben viele Leute hart an diesem Spiel gearbeitet . Sie hatten wahrscheinlich nicht genug Zeit, um das Spiel weiter zu optimieren.
Nachwort
Das ist alles! RDR2 ist ein großartig aussehendes Spiel, nicht nur wegen der verwendeten Grafik, sondern auch wegen der Kunst und Beleuchtung. alles sieht einfach phänomenal aus. Ich habe mich in die Farbpalette dieses Spiels verliebt. Besonders nachts erinnert es mich daran, wie feige Robert Ford Jesse James, kein Land für alte Männer, und andere 35-mm-Western getötet hat.