Vorwort
Beginnen wir wie in meinen anderen Studien mit der Einführung. Heute schauen wir uns das neueste Spiel des französischen Entwicklers Asobo Studio an. Das erste Mal, dass ich letztes Jahr ein Video von diesem Spiel gesehen habe, als ein Kollege einen
16-minütigen Gameplay-Trailer mit mir geteilt hat. Die Mechanik von "Ratte gegen das Licht" erregte meine Aufmerksamkeit, aber ich wollte dieses Spiel nicht wirklich spielen. Nach seiner Veröffentlichung begannen viele zu sagen, dass es so aussieht, als ob es mit der Unreal-Engine hergestellt wurde, aber das ist nicht so. Ich war gespannt, wie das Rendern funktioniert und wie sehr Entwickler von Unreal im Allgemeinen inspiriert wurden. Ich war auch an dem Prozess des Renderns einer Rattenherde interessiert, da es im Spiel sehr überzeugend aussah und außerdem eines der Schlüsselelemente des Gameplays ist.
Als ich anfing, das Spiel festzuhalten, dachte ich, ich müsste aufgeben, weil nichts funktionierte. Obwohl das Spiel DX11 verwendet, das jetzt von fast allen Analysetools unterstützt wird, konnte ich keines davon zum Laufen bringen. Als ich versuchte, RenderDoc zu verwenden, stürzte das Spiel beim Start ab, und das gleiche passierte mit PIX. Ich weiß immer noch nicht, warum dies passiert, aber zum Glück konnte ich mehrere Aufnahmen mit NSight Graphics machen. Wie üblich habe ich alle Parameter auf das Maximum angehoben und nach Frames gesucht, die für die Analyse geeignet sind.
Rahmenbruch
Nachdem ich einige Aufnahmen gemacht hatte, entschied ich mich, eine der ersten Aufnahmen für die Frame-Analyse zu verwenden. Es gibt keinen großen Unterschied zwischen den Griffen und außerdem kann ich Spoiler vermeiden.
Beginnen wir wie gewohnt mit dem letzten Frame:
Das erste, was mir auffiel, war ein völlig anderes Gleichgewicht in diesem Spiel des Renderns von Ereignissen als in anderen Spielen zuvor. Hier gibt es viele Draw Calls, was normal ist, aber überraschenderweise werden nur wenige für die Nachbearbeitung verwendet. In anderen Spielen durchläuft der Frame nach dem Rendern von Farben, um das Endergebnis zu erhalten, viele weitere Phasen. In A Plague Tale: Innocence ist der Nachbearbeitungsstapel jedoch sehr klein und nur für wenige Rendering- / Computerereignisse optimiert.
Das Spiel beginnt mit dem Erstellen eines Frames, indem GBuffer mit sechs Renderzielen gerendert wird. Interessanterweise haben alle diese Renderziele ein 32-Bit-Ganzzahlformat ohne Vorzeichen (mit Ausnahme von einem) anstelle von RGBA8-Farben oder anderen für solche Daten spezifischen Formaten. Dies war schwierig, da ich jeden Kanal manuell mit der Custom Shader-Funktion von NSight dekodieren musste. Ich habe viel Zeit damit verbracht herauszufinden, welche Werte in 32-Bit-Zielen codiert sind, aber es ist möglich, dass ich trotzdem etwas verpasst habe.
GBuffer 0Das erste Ziel enthält einige Schattierungswerte in 24 Bit und einige andere Werte für Haare in 8 Bit.
GBuffer 1Das zweite Ziel sieht aus wie ein traditionelles RGBA8-Ziel mit unterschiedlichen Materialkontrollwerten in jedem Kanal. Soweit ich weiß, ist der rote Kanal Metallizität (es ist nicht ganz klar, warum einige Blätter damit markiert sind), der grüne Kanal sieht aus wie ein Rauheitswert und der blaue Kanal ist die Maske der Hauptfigur. Keine der von mir gemachten Aufnahmen verwendete den Alpha-Kanal.
GBuffer 2Das dritte Ziel sieht ebenfalls aus wie RGBA8 mit Albedo in den RGB-Kanälen, und der Alpha-Kanal in jedem von mir erstellten Capture war vollständig weiß, sodass ich nicht ganz verstehe, was diese Daten tun sollen.
GBuffer3Das vierte Ziel ist neugierig, weil es bei allen meinen Aufnahmen fast vollständig schwarz ist. Die Werte sehen aus wie eine Maske eines Teils der Vegetation und aller Haare / Pelze. Vielleicht hat das etwas mit Transluzenz zu tun.
GBuffer 4Das fünfte Ziel ist wahrscheinlich eine Art normale Codierung, da ich sie nirgendwo anders gesehen habe und der Shader normale Karten abzutasten und dann an dieses Ziel auszugeben. Vor diesem Hintergrund habe ich nicht herausgefunden, wie ich sie richtig visualisieren kann.
Tiefe von GBuffer 5Maske aus GBuffer 5Das letztere Ziel ist eine Ausnahme, da es ein 32-Bit-Gleitkommaformat verwendet. Der Grund dafür ist, dass es die lineare Tiefe des Bildes enthält und das Vorzeichenbit eine andere Maske codiert, die wiederum das Haar und einen Teil der Vegetation maskiert.
Nachdem die GBuffer-Erstellung abgeschlossen ist, wird die Auflösung der Tiefenkarte im Computational Shader reduziert, und dann werden Schattenkarten (gerichtete kaskadierende Schattenkarten von der Sonne und kubische Tiefenkarten von Punktlichtquellen) gerendert.
DämmerungsstrahlenNachdem Sie die Schattenkarten ausgefüllt haben, können Sie die Beleuchtung berechnen. Zuvor werden die Gottstrahlen jedoch in ein separates Ziel gerendert.
SSAOIn der Beleuchtungsberechnungsphase wird ein Berechnungsshader ausgeführt, um die SSAO zu berechnen.
Beleuchtete undurchsichtige GeometrieDie Beleuchtung erfolgt über kubische Karten und lokale Lichtquellen. Alle diese verschiedenen Lichtquellen bilden zusammen mit den oben gerenderten Zielen ein beleuchtetes HDR-Bild.
Proaktive RenderelementeElemente, die beim proaktiven Rendern gerendert werden, werden über der beleuchteten undurchsichtigen Geometrie hinzugefügt, sind jedoch in dieser Szene nicht besonders auffällig.
Nach der Anhäufung aller Farben sind wir fast fertig, es gibt nur wenige Nachbearbeitungsvorgänge und die Benutzeroberfläche.
Die Farbauflösung wird im Computational Shader reduziert und dann erhöht, um einen sehr schönen und weichen Blüteeffekt zu erzielen.
Nachdem wir alle vorherigen Ergebnisse zusammengesetzt, Kameraschmutz, Farbkorrekturen und schließlich die Tonbildkorrektur hinzugefügt haben, erhalten wir die Farben der Szene. Das UI-Overlay gibt uns ein Bild vom Anfang des Artikels.
Erwähnenswert sind einige interessante Dinge zum Rendern:
- Die Instanzierung (Duplizierung der Geometrie) wird nur für einzelne Netze verwendet (anscheinend nur für die Vegetation). Alle anderen Objekte werden in separaten Zeichenaufrufen gerendert.
- Es sieht so aus, als ob Objekte mit wenigen Ausnahmen ungefähr von vorne nach hinten sortiert sind.
- Es scheint, dass die Entwickler keine Anstrengungen unternommen haben, um die Draw-Aufrufe nach Materialparametern zu gruppieren.
Ratten
Wie ich am Anfang des Artikels sagte, war einer der Gründe, warum ich dieses Spiel erforschen wollte, die Art und Weise, das Rattenrudel zu rendern. Die Entscheidung hat mich in gewisser Weise enttäuscht: Es scheint, dass sie mit brutaler Gewalt getroffen wurde. Hier verwende ich Screenshots aus einer anderen Szene des Spiels, aber ich hoffe, es sind keine Spoiler darin.
Wie bei anderen Objekten scheinen Ratten keine doppelte Geometrie zu haben, es sei denn, wir erreichen die Entfernung, in der wir zur letzten Ebene der Maschendetails (LOD) wechseln. Mal sehen, wie es funktioniert.
LOD0LOD1LOD2LOD3Ratten haben 4 LOD-Stufen. Interessanterweise ist der Schwanz auf der dritten Ebene zum Körper gebogen, während der vierte Schwanz dies nicht tut. Dies bedeutet wahrscheinlich, dass Animationen nur für die ersten beiden Ebenen aktiv sind. Leider scheint NSight Graphics nicht über genügend Tools zu verfügen, um dies zu testen.
Keine Vervielfältigung (Instanzierung) von Ratten.Mit Vervielfältigung.In der oben gezeigten Szene wurde die folgende Anzahl von Ratten gerendert:
- LOD0 - 200
- LOD1 - 200
- LOD2 - 1258
- LOD3 - 3500 (mit doppelter Geometrie)
Dies macht uns verständlich, dass die Anzahl der Ratten, die auf den ersten beiden LODs gerendert werden können, streng begrenzt ist.
Bei der Erfassung konnte ich keine Logik identifizieren, die Ratten mit einzelnen LODs verbindet. Manchmal sind Ratten, die näher an der Kamera sind, nicht sehr detailliert, und manchmal haben Ratten, die kaum sichtbar sind, hohe Details.
Abschließend
Plague Tale: Unschuld ist sehr interessant in Bezug auf das Rendern. Seine Ergebnisse haben mich zweifellos beeindruckt, sie dienen dem Gameplay sehr gut. Wie bei jeder proprietären Engine wäre es großartig, eine detailliertere Analyse von den Lippen der Entwickler selbst zu hören, insbesondere weil ich einige meiner Theorien nicht bestätigen konnte. Ich hoffe, dass mein Artikel eines Tages jemanden von Asobo Studio erreicht und er sieht, dass die Leute ein Interesse daran haben.