Analyse der Grafiken von Red Dead Redemption 2

Eines meiner Lieblingsspiele, Red Dead Redemption , ist 2018 mit einem Prequel für Konsolen zurück. Im Jahr 2019 wurde es für den PC veröffentlicht, und ich habe es endlich geschafft, es zu spielen; Ich war sofort von ihren Grafiken beeindruckt. Ich war jedoch verärgert: Ich habe es kaum geschafft, mit 25 FPS auf der Desktop-GPU 1050Ti mit durchschnittlichen Einstellungen zu spielen. Ich verstehe, meine Maschine ist nicht sehr leistungsfähig, aber 25 FPS bei mittleren Einstellungen?



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


Schlammkarte: R16_UNORM2048x2048



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 .



EnvironmentMapAlbedo


Die Gesichter der kubischen Karte der Umgebung (Albedo): RGBA8_SRGB



EnvironmentMapNormal


Gesichter einer Würfelumgebungskarte (Normalen): RGBA8_UNORM



EnvironmentMapDepth


Umgebungswürfelkanten (Tiefe): DasD32S8



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.



EnvironmentMapBakedAO


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.



EnvironmentMapFinal


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.



BakedEnvironmentMapAlbedo


Gebackene Gesichter einer kubischen Karte der Umgebung (Albedo): BC3_SRGB(Gebackene AO ​​wird im Alphakanal gespeichert)



BakedEnvironmentMapNormal


Die gebackenen Flächen der Würfelumgebungskarte (Normalen): BC3_UNORM



BakedEnvironmentMapDepth


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
AlbedoTarget
AlbedoTargetA




  • 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
NormalTarget
NormalTargetA


  • 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
MaterialTarget
MaterialTargetA


  • 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
Material2TargetR
Material2TargetB


  • 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
MotionBlurTarget


  • RG16_FLOAT: Dieser Puffer enthält die Geschwindigkeit im Bildschirmbereich zum Implementieren von Bewegungsunschärfe.


GBuffer 5 Depth GBuffer 5 Stencil
DepthTarget
StencilTarget


  • 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
BakedAO
MysteryTarget


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).



Schattenkaskaden


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.



LightPass1


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.



Lightpass2


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.



Bloommask


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_FLOAT7-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.



All Articles