Die Geschichte der Entwicklung von The Light Remake. Teil 2





Grüße Leser! Der erste Teil des Artikels über die Entwicklung von The Light Remake beschrieb den Prozess der Portierung des Spiels auf die neue Version von Unity. Ich habe ein wenig über die verwendeten Shader und Effekte gesprochen, welche Lösungen für die Arbeit mit Licht implementiert wurden, welche zusätzlichen Inhalte erstellt wurden, welche Inhalte aus der alten Version überarbeitet wurden usw. Im zweiten Teil werden wir über andere Aspekte der Entwicklung sprechen, über Posteffekte, Projektstruktur, Arbeiten mit Sound, Optimierung und andere Nuancen.



Teil 2



Post-Effekte



Bei der Übertragung des Projekts auf eine neue Engine wurde beschlossen, die alten Methoden zur Implementierung von Post-Effekten beizubehalten, die in früheren Versionen von Unity verwendet wurden. Die Arbeit mit ihnen war für mich verständlicher und ich konnte die notwendigen Änderungen am Prozess der Bildverarbeitung vornehmen.



Gamma



Es gab nicht viele Nacheffekte im ursprünglichen Spiel, aber einer der bekanntesten war die Farb- und Helligkeitskorrektur. Dann gelang es mir zufällig, ein angenehmes weißliches Leuchten und ein etwas kühles Farbschema zu erzielen. Das Bild war kontrastreich und betonte die fantastische Atmosphäre des Ortes. Der visuelle Stil erinnerte ein wenig an die damalige Battlefield 3-Farbpalette, was mir ein sehr glücklicher Zufall war.



Eine interessante Nuance ist, dass ich es später nach dem ursprünglichen Spiel nicht geschafft habe, diesen Effekt vollständig zu wiederholen. Es gab immer einige Feinheiten, die das Bild nicht wie das Original aussehen ließen. In diesem Zusammenhang habe ich beschlossen, das Farbschema des Remakes in ein wärmeres und positiveres zu ändern. Das Grün wurde heller und ausdrucksvoller, und die Atmosphäre wurde mehr mit einem schwülen Sommertag verbunden. Als Bonus habe ich nach Abschluss des Spiels die Möglichkeit hinzugefügt, die Farbkorrektur ähnlich wie beim Original zu aktivieren.











Volumetrisches Licht



Ein sehr wichtiges Element in diesem Remake sind die mit Licht verbundenen Nachwirkungen. Ältere Versionen von Unity hatten einen sehr niedlichen Sun Shaft Sunburst-Effekt. Die Funktionalität war jedoch eingeschränkt, da nur eine Lichtquelle in der Szene verwendet werden konnte.



Irgendwann fiel mir ein sehr unterhaltsamer volumetrischer Lichteffekt von volumetrischen Lichtern aufEs ermöglicht Ihnen, ein sehr schönes, dichtes Leuchten und Strahlen zu erzeugen, die aus verschiedenen Quellen stammen können. Die Atmosphäre in der Szene wird voluminöser, Objekte versinken in einem leichten Luftdunst, der mich sehr beeindruckt hat. Der einzige Nachteil war die hohe Ressourcenintensität des Effekts. Trotzdem entschied ich mich, es anzuwenden und dank volumetrischem Licht gelang es mir, ein angenehmes Sonnenlicht in der gesamten Szene sowie mystische gerichtete Lichtstrahlen an bestimmten Stellen zu erzeugen: im Flur zu Beginn des Spiels, in einem Raum mit einem Spatz. Der Effekt wurde auch verwendet, um die Akzente auf den nachts leuchtenden Laternenpfählen in der Episode mit dem Projektor im Heizungsraum hervorzuheben, um das Licht aus den Fenstern in der letzten Szene des Aufstiegs des Charakters zum Licht zu verstärken.







SSAO und SSR



Die anderen stärksten Effekte sind SSAO (Ambient Occlusion), das weiche Schattierungen in Ecken und unter Oberflächen erzeugt, nirgendwo ohne. Es wurde auch SSR (Screen Space Reflections) hinzugefügt, mit dem es bereits in der Entwicklungsphase viele Probleme gab. SSR simuliert Reflexionen auf glänzenden Oberflächen, was zu schönen Reflexionen auf Fliesen, Metall usw. führt. Das Problem ist, dass der Effekt sehr stark war und die FPS auf meiner Hardware fast halbierte. Durch einige Manipulationen im Post-Effect-Code konnte ich die Qualität der Berechnung leicht reduzieren und die Leistung leicht verbessern. Im Allgemeinen wurde die Bildrate akzeptabel, aber unter bestimmten Bedingungen (z. B. bei aktiviertem Vsync) verursachte SSR periodische Einfrierungen und Rucke, wenn sich das Zeichen bewegte.







Andere



Zusätzlich zu den aufgelisteten Effekten verwendet das Projekt auch Vignette, chromatische Aberration, Tonabbildung, Antialiasing, globalen Nebel und Blüte. Zur Optimierung wurden Vignette, Aberration und Tonabbildung in einem Prozess kombiniert.







Übrigens erinnere ich mich jetzt bei der Arbeit mit Grafiken oft an meine persönlichen Erfahrungen mit dem Studium an einer Kunstschule, an der wir gelernt haben, kontrastierende Schatten unter Objekten hervorzuheben, Reflexe auf den Oberflächen von Objekten zu zeigen und Dunst am Horizont anzuwenden, wenn wir mit Landschaften arbeiten, um eine Luftperspektive hervorzuheben. Jetzt weiß ich, dass alles SSAO, SSR und Global Fog waren!



Wie es funktioniert?



Das ursprüngliche Projekt wurde buchstäblich auf dem Knie montiert. Zu dieser Zeit hatte ich keine Programmierkenntnisse und die gesamte Funktionalität des Spiels basierte auf ein paar einfachen Skripten. Das wichtigste war das Triggerskript "Aktivieren", das ich in den Standard-Unity-Assets gefunden habe. Alle Funktionen basierten auf der Tatsache, dass der Charakter in einen Auslöser gerät, bestimmte Objekte ein- oder ausschaltet und die notwendigen Aktionen auslöst. Es gab keine Frage des Speicherns oder der Einstellungen im Spiel.



System



Um das Remake zu implementieren, musste natürlich das gesamte Spielsystem von Grund auf neu geschrieben werden: das Steuerungssystem, das Speichern, die Einstellungen und die Mechanik im Spiel. Generell ist der kompetente Aufbau des Projektsystems für mich immer noch eine schwierige Aufgabe. Normalerweise erstelle ich ein Basissystemobjekt mit mehreren untergeordneten Objekten. Jeder von ihnen führt seine eigene Gruppe von Funktionen aus und sie sind alle miteinander verbunden.



Da das Spiel im Wesentlichen aus einem Ort besteht, habe ich mich entschieden, keine Szenen, Fertighäuser und Komponenten zu laden. Ich habe alles, was ich brauchte, in einer Hauptszene platziert. Es wurden Controller erstellt, die alles verwalten, Einstellungen ändern, das Spiel speichern und die gespeicherten Daten lesen, die Texte für Untertitel und Notizen aus einer speziellen Datei im Stammverzeichnis des Spiels lesen usw. Um die Implementierung zu vereinfachen, wurde wie in früheren Spielen beschlossen, das Speichersystem in Checkpoints zu verwenden. Der Ort enthält mehrere Dutzend interaktive Objekte wie Türen, Spielgegenstände, Petroleumlampen usw. Für jede Speicherung müssen die Objektstatuskennungen aufgezeichnet werden, bei denen es sich normalerweise um eine Int-Variable handelt. Zum Beispiel wird die Tür mit einem Schlüssel geschlossen und verriegelt: DoorOpen - o, DoorLocked - 1.Ich werde nicht näher auf das Programmierthema eingehen, da meine Fähigkeiten in diesem Bereich etwas spezifisch und oberflächlich sind, sie jedoch für die Umsetzung meiner eigenen Projekte völlig ausreichen.



Zwei Finale



Eine interessante Aufgabe für mich war die Implementierung des virtuellen Scorings, um eine der Endoptionen zu erreichen. Ich wollte ein Element der Herausforderung in das Gameplay des Remakes einbringen und kam auf die Idee, diese Idee mit dem Hauptsymbol des Spiels zu verbinden - mit Licht. Es wurde beschlossen, einen Zähler zu erstellen, der das Umgebungslicht anhand mehrerer Parameter analysiert. Das Ende des Spiels hängt davon ab, wie lange der Spieler an einem beleuchteten Ort oder in der offenen Sonne bleibt. In der ersten Phase werden Informationen von den in der Szene platzierten Lichtsonden und deren Leuchtkraft gesammelt. Dieser Parameter wird in einen Durchschnitt übersetzt und in eine Float-Variable geschrieben.







Darüber hinaus berücksichtigt das Skript das Vorhandensein zusätzlicher Lichtquellen in der Nähe, z. B. Lampen, Licht von Fenstern, eine eingeschaltete Laterne oder ein Feuerzeug in der Hand. Das Vorhandensein einer der Bedingungen addiert bestimmte Werte zu den bereits berechneten Lichtindikatoren. Und schließlich hat direktes Sonnenlicht die stärkste Wirkung auf den Charakter. Von einer Sonnenlichtquelle wird ein Raycast auf den Charakter geschossen, der dem System mitteilt, ob sich der Spieler in der offenen Sonne befindet.



Alle diese Werte werden von einem Zähler zusammengefasst und gezählt, der am Ende des Spiels bestimmt, wie das Finale aussehen wird. Wenn der Spieler unter direkten Strahlen selten den offenen Himmel besuchte, selten eine Laterne und ein Feuerzeug benutzte, ist der endgültige Parameter niedrig. Das System bestimmt den Beleuchtungsgrad nicht immer genau, bewältigt aber im Allgemeinen seine Aufgabe. Zum Debuggen und als zusätzliches Element befinden sich reflektierende Farbflecken auf dem Metallrohr in den Händen des Charakters, was ein Indikator für die Beleuchtung ist.



Untertitelung und Lokalisierung



Für das Remake wurde ein neuer Ansatz zur Lokalisierung und allgemein zur Anzeige von Texten und Nachrichten ausgearbeitet. Genauer gesagt wurde dieser Ansatz bereits im Projekt des 7. Sektors verwendet, jedoch war das Inhaltsvolumen dort viel geringer. Die Methode zum Speichern von Daten in einem HTML-Dokument wird als Grundlage verwendet. Alle Textinformationen zur Lokalisierung werden zunächst in einer XML-Datei im Stammverzeichnis des Spiels gespeichert. Nachrichten sind in Gruppen unterteilt und einzeln gekennzeichnet, gehören zu bestimmten Kategorien und bestimmten Sprachen. Für einen Zeilenumbruch habe ich mich entschieden, das Zeichen (*) zu verwenden und eine neue Nachricht (#) zu starten.







Im richtigen Moment (bei der Auswahl einer Sprache und beim Starten einer Szene) liest der Controller alle Textinformationen, unterteilt sie in Zeilen und separate Gruppen und schreibt sie in eine Art Bibliothek oder Wörterbuch. Anschließend lesen einzelne Skripte diese Informationen, beispielsweise beim Öffnen eines Menüs oder beim Aktivieren von Untertiteln auf dem Bildschirm. Das System erschien mir persönlich praktisch und vor allem klar. Sie können auf einfache Weise eine neue Sprache eingeben und Änderungen an vorhandenem Text vornehmen.



Klang



Einige der Grundtöne wurden aus den Originalquellen übernommen. Umgebungsgeräusche, Vogelgezwitscher, Filmprojektorsound usw. Es wurde beschlossen zu gehen, um die Anerkennung des Projekts zu bewahren. Es waren jedoch viele neue Inhalte erforderlich. Die Geräusche des Charakters selbst, Schritte, aktivierte Objekte, das Atmen des Helden in bestimmten Momenten, die Wirkung eines Herzschlags usw. wurden hinzugefügt. Das Angebot an Umgebungsgeräuschen, das Zwitschern von Heuschrecken, zufällige Geräusche von herabfallenden Objekten und das Zuschlagen von Türen wurden abwechslungsreicher. Übrigens hat mich die Landschaft des neuen Half Life Alyx dazu inspiriert, den Lärm von Zikaden oder Heuschrecken zu verstärken, in denen die Atmosphäre eines heißen Sommertages sehr kühl ist. Ich habe es genossen, Ambient-Aufnahmen von City17 auf Youtube zu hören und zu sehen.



Die meisten Sounds wurden aus freien Bibliotheken ausgeliehen. Fragmente wurden miteinander kombiniert, Effekte angewendet, Geschwindigkeit geändert usw.



Die Erstellung des Soundtracks wurde zu einer ganzen Schicht verantwortungsbewusster und sorgfältiger Arbeit. Die Kompositionen des ursprünglichen Projekts waren nicht lizenziert, es handelte sich um eine Reihe von Tracks von Ludovico Einaudi, dem Komponisten Thomas Newman und OST aus dem Spiel „Angst vor Monstern“. Trotzdem geraten wir normalerweise in die Seele dessen, was wir zum ersten Mal gehört haben, zum Beispiel scheinen die Originale der Tracks zumindest für mich oft angenehmer als ihre Remixe. In diesem Fall wollte ich beim Erstellen neuer Kompositionen unbedingt den Stil und die Atmosphäre der Originaltitel bewahren. Es scheint mir, dass der Komponist Dmitry Nikolaev, mit dem wir zuvor am 35-MM-Spiel gearbeitet hatten, bei dieser Aufgabe hervorragende Arbeit geleistet hat. Besonders beeindruckt hat mich der neue Blick auf die dynamische Komposition, die während der Filmvorführung im Hörsaal erklang. Der Track hat den ursprünglichen energetischen und leicht psychedelischen Stil beibehalten,begann frisch zu klingen, aber erkennbar. Der Film selbst wurde übrigens auch stark überarbeitet und enthielt viel neues Material. Der Inhalt des Videos wurde sorgfältiger ausgewählt, um Urheberrechtsverletzungen zu vermeiden, und einige der Fragmente wurden unabhängig voneinander erstellt.



Der Link zeigt das Originalvideo, das im Originalspiel 2012 verwendet wurde.







Obwohl es im Spiel keinen Dialog gibt, gab es einen Ort für Sprachausgabe. Die Aufnahme wurde von Wsewolod Petrykin unterstützt, der bereits am 35-MM-Projekt teilgenommen hatte und der Hauptfigur Petrowitsch seine Stimme gab. Seine Rede ist aus den Lautsprechern zu hören, sobald die Flugzeuge erscheinen, aus dem Telefonhörer in der Episode mit dem Abschuss von Raketen und im Radio im zweiten Stock des Hauptgebäudes.



Optimierung



Die Optimierung ist zu einem der schmerzhaftesten Themen und Aufgaben bei der Arbeit an dem Remake geworden. So kam es, dass fast alle Projekte, die ich zuvor mit der alten Version von Unity (4.6) erstellt habe, hinsichtlich der Auslastung der Hardware recht einfach waren. Das Spielen von 35 MM auf meiner GTX 970 an einigen Stellen lieferte 200-300 fps in ziemlich komplexen und geschäftigen Szenen. Das ursprüngliche Light, das auf einer noch früheren Version des Motors basiert, zeigte noch höhere FPS. Beim Wechsel zu Unity 2017 sank die Bildrate jedoch um das 2-3-fache. Es ist klar, dass die Szene viel komplexer geworden ist, Fehlkalkulationen von Licht und Reflexionen, zusätzliche Posteffekte usw. hinzugefügt wurden. aber ich hatte keinen so dramatischen Leistungsabfall erwartet. Der Haken ist, dass mein FPS auch nach dem Entfernen fast des gesamten Inhalts aus der Szene nicht über 200-300 gestiegen ist. Dies ist eine halb leere Bühne, Karl!Es wurde viel Arbeit geleistet, um einige Geometrien zu vereinfachen, Lod-Gruppen zu erstellen, Okklusions-Culling einzurichten usw.







Mithilfe eines Skripts wurde den Kameras für bestimmte Ebenen ein Schnittabstand zugewiesen. Für die Implementierung wurde ein Beispiel aus den Unity-Handbüchern verwendet. Objekte unterschiedlicher Größe wurden separaten Ebenen zugewiesen, die das Rendern beenden, wenn die Kamera zu weit entfernt ist. Kleine Gegenstände wie Dosen, Müll, Holzabfälle, Bücher werden nach 20-30 Metern abgeschnitten. Größere - nach 60-80. Alle oben genannten Maßnahmen haben die Anzahl der Drawcalls erheblich reduziert. Im Durchschnitt liegt die Anzahl der Draw Calls in einer Szene zwischen 800 und 2000 DC. Die Anzahl der Polygone in einem Frame überschreitet 1 Million nicht.







Leuchtenausschnitt



Im Rahmen der Optimierung wurde ein spezielles Skript erstellt, das alle 2-3 Sekunden den Abstand zu kleinen dynamischen Lichtquellen wie Petroleumlampen bestimmt. Wenn die Kamera von den Lampen entfernt wurde, wurden sie vom Skript ausgeschaltet, um das System nicht mit unnötigen Prozessen zu beladen. Als der Charakter in den Keller hinabstieg, wurde die Sonnenlichtquelle ausgeschaltet. Dies reduzierte die Anzahl der DrawCalls erheblich.



Einige Details



  • In den Kellerkorridoren, die mit tropfendem Wasser unter den Betonkanalschächten stehen, können Sie wolkige Tropfen auf dem Bildschirm sehen (die Augen / Brillen des Charakters). Einfach gemacht - vorausgesetzt, der Held drückt auf den Abzug und wenn die Kamera nach oben gerichtet ist, wird das Fertighaus des Partikelsystems mit schlammigem Grabpass-Material eingeschaltet. Auch in diesem Moment können Tropfen auf der Oberfläche der Karte beobachtet werden, wenn Sie sie in die Hand nehmen.






  • . . « », . . , .






  • , .


  • , , .






  • . “STALKER ” , . , , . , . , / .


  • , — 3 . , , . . .






  • , Half Life Alyx, . , . , . , «», . .






  • , , . , . , Graphics.DrawMeshInstancedIndirect .
  • . , , .








Wie Sie dem Artikel entnehmen können, ist die Entwicklung eines eigenen Projekts ein sehr mühsamer Prozess. Dies sind schlaflose Nächte, eine ständige Suche nach Lösungen, eine Suche nach Inspiration, Niederlage und Sieg. Aber es bringt große Freude und ein Gefühl der Selbstverwirklichung. Ich würde sagen, dass dies mehr als nur ein Job ist - es ist eine Lebenseinstellung. Unser Geist ist erstaunlich und in der Lage, erstaunliche Dinge zu erschaffen, die manchmal nicht mit der Realität verglichen werden können. Es gibt ein ganzes Universum im Schädel eines jeden Menschen, und es ist wunderbar, es ist wunderbar, dass dieses Universum durch Ihre Aktivität irgendwie dargestellt werden kann, sei es ein Film oder ein Computerspiel. Jede Arbeit ist etwas Persönliches, geschaffen durch harte und anstrengende Arbeit, etwas sehr Wichtiges und Wertvolles, vor allem für sich.



Ich wünsche Ihnen allen viel Glück, kreative Inspiration und hohe FPS!



All Articles