Hochleistungsbeleuchtungssystem für 2D-Spiele

Ursprünglicher Autor: Alexander Birke
  • Übersetzung


Hallo, mein Name ist Alexander Birke, ich habe kürzlich mein erstes Steam-Spiel namens Laser Disco Defenders veröffentlicht. Es scheint mir interessant zu sein, einige der technischen und gestalterischen Lösungen zu enthüllen, die im Spiel enthalten waren. Ich beginne mit meinem eigenen Beleuchtungssystem, mit dem Sie auch auf schwachen Computern mit vielen zweidimensionalen Lichtquellen arbeiten können. LDD wurde in Unity erstellt, aber dieser Ansatz funktioniert in jeder anderen Spiele-Engine, mit der Netze erstellt werden können.

4 MB epileptisches GIF



Warum genau ein eigenes Beleuchtungssystem?


Die grundlegenden Mechanismen der LDD ist , dass jeder Schuss des Laserstrahls weiter von den Wänden reflektiert werden und kann in den Player zu bekommen, so dass wir nannten es ein " bullet Die HölleMach es selbst. “Der visuelle Stil war von der Disco-Ära und den hellen Tanzflächen der Zeit inspiriert, daher wollte ich, dass Laser die Umgebung beleuchten können. Die Beleuchtung ist auch nützlich, da sie dem Spieler hilft zu verstehen, dass bald ein Laserstrahl abgeschossen wird. Das Spiel wurde auch auf der PlayStation veröffentlicht Vita, also brauchte ich eine produktivere Lösung im Vergleich zur Standard-Unity-Aufschubbeleuchtung, bei der für jede in der Szene gezeichnete Lichtquelle ein Draw Call verwendet wird. Es können problemlos bis zu 30 Laserstrahlen gleichzeitig auf dem Bildschirm sein Ich wollte auch, dass die Beleuchtung der Form der Laserstrahlen entspricht. Der Laserstrahl ist normalerweise lang und dünn, sodass keine der Standard-Unity-Lichtquellen (Richtung, Punkt, Scheinwerfer) geeignet ist.


Die Punktquelle links entspricht nicht der Form des Laserstrahls. Rechts ist der gewünschte Umriss des Lichts.

Andere Spielelemente mussten ebenfalls Licht emittieren, also brauchte ich eine einfache Beleuchtungskomponente, die auf Spielobjekten platziert wurde, die das Beleuchtungssystem rendern sollte.


Es sollten nicht nur Laserschüsse, sondern auch andere Lichtquellen unterstützt werden.

Prozedurale Gitter gehen zur Rettung!


Die Hauptidee bei der Verwendung von prozeduralen Gittern bestand darin, die Beleuchtungsdaten in den Beleuchtungspuffer einzugeben, der dann in Shadern abgetastet wurde. Dies unterscheidet sich nicht vom Prinzip der verzögerten Beleuchtung. Meine Lösung erfordert jedoch nur 2D-Arbeit, sodass ich die gesamte Beleuchtung in einem Durchgang des Renderns berechnen kann, da die Beleuchtung mithilfe eines prozeduralen Rasters gerendert wird.

Die Laser im Spiel wurden als prozedurales Gitter gerendert, sodass ich bereits eine Textur hatte, mit der sich eine Abnahme der Lichtintensität speichern lässt. Ich nannte es (pam-pam-pa-a-am!) ... einen Lasertisch!


Lasertisch. Von oben nach unten: das Leuchten, die Enden der Strahlen, die Strahlen selbst. Die markierten Bereiche weisen für alle Laserlichtquellen eine diffuse Streuung auf.

Für den gewählten visuellen Lasertyp benötigte ich die langen Teile des Strahls, seine Enden und das Leuchten, das auftritt, wenn er auf die Wand trifft. Darüber hinaus sollte dieses Leuchten die Tatsache verbergen, dass jedes Segment des Strahls als einzelner viereckiger Streifen gerendert wird, sodass sie sich nicht sehr gut überlappen. Dies ist ein kleiner Trick, aber optisch sieht alles gut aus.


Gittererzeugungsschema für einen einzelnen Strahl. Für jedes Segment benötigen Sie zwei Vierecke (Quad) der Balkenenden und eines für das gerade Segment in der Mitte. Das Licht aus dem Schein der Wand braucht auch seinen Quad. Dieselbe Topologie wird verwendet, um den Laser selbst zu rendern.

Um die Beleuchtung für jeden Laser zu erstellen, nehme ich die Positionen der einzelnen Segmente und schiebe ihre Scheitelpunkte nach außen, je nachdem, wie weit das Licht vom Laser entfernt sein kann. Anschließend werden Scheitelpunkte erstellt und dem Raster für andere Lichtquellen hinzugefügt. In LDD brauchte ich nur runde Quellen, aber andere Formen können leicht hinzugefügt werden. Diese runden Quellen nutzen das gleiche diffuse Licht des Lasertisches und rendern wie Vierecke.




Sichtbares und verstecktes Lichtgitter. In der Regel liegt das Beleuchtungsgitter weit unter allen anderen Elementen im Spiel, sodass die Szene beim Rendern der Szene nicht angezeigt wird. Hier sehen Sie Laser und Hindernispunkte, die Licht werfen.

Dann wird das Raster in einem separaten Farbpuffer gerendert. In Unity verwendete ich eine Kamera mit demselben Layout und derselben Größe wie die Hauptkamera. Anschließend wird es in RenderTexture mithilfe von Ebenen gerendert, um alles außer dem Beleuchtungsgitter auszuschließen.




Das Beleuchtungsgitter und die Textur, auf der es gerendert wird.

Danach wird der Farbpuffer als normale Textur an die GPU gesendet, sodass er von jedem Shader aus verwendet werden kann. Für Sprites, Partikel und alles andere, was beleuchtet werden muss, wurden eigene Shader erstellt. Im Vertex-Shader bestimmt jeder Vertex die Position seines Ansichtsfensters. Daher kann er als UV-Koordinate beim Abtasten der Beleuchtungstextur im Fragment-Shader verwendet werden. Am interessantesten sind die Hintergründe des Spiels. Sie verwenden einen Alpha-Kanal, um das Reflexionsvermögen eines bestimmten Texels zu bestimmen. Dies trägt wesentlich dazu bei, dem Spiel mehr Tiefe zu verleihen.


Ein Beispiel für eine Hintergrundtextur in Laser Disco Defenders. Links sind Farbkanäle und rechts der für das Reflexionsvermögen verwendete Alphakanal dargestellt, der in dieser Höhlentextur dunkle Risse erzeugt. Es gibt immer noch ein Skelett eines Weltraumwals ... nurweil wir können !

Optimierungen


Das System enthält einige Optimierungstricks. Das wichtigste ist das Abschneiden entlang der Sichtbarkeitspyramide jeder Lichtquelle, bevor für sie Scheitelpunkte erstellt werden. Dies reduziert den Rechenaufwand im Prozessor und begrenzt die Anzahl der zur GPU übertragenen Vertices. Wie Sie aus dem Bild des Beleuchtungsgitters und der Textur ersehen können, hat der Beleuchtungspuffer eine viel geringere Auflösung als das Spiel. Ich fand heraus, dass es zehnmal von der Spielauflösung ohne Artefakte reduziert werden kann. Beim Lesen von Texturen bietet die bilineare Abtastung in Shadern eine für das Spiel ausreichende Interpolation. Dies reduziert den Füllaufwand des Beleuchtungssystems, sodass genügend Rendering-Ressourcen verbleiben, um einige visuelle Effekte zu erzielen.

Fazit und weitere Arbeit


Auf der Vita-Konsole bietet das Spiel eine anständige Menge an FPS, auf die ich angesichts der visuellen Klarheit des Spiels sehr stolz bin. In den Testberichten zum PC-Spiel wurde eine gute Leistung festgestellt. Ich hoffe, Sie stimmen auch darin überein, dass die Beleuchtung den psychedelischen Disco-Stil des Spiels erheblich verbessert.
Das System ist bisher dadurch eingeschränkt, dass es keine Schatten erzeugen kann. Sie können sie hinzufügen, jedoch auf Kosten der Leistung. Wenn Sie sich entscheiden, Schatten zu werfen, können Sie den Fokus mit dem niedrig aufgelösten Lichtpuffer höchstwahrscheinlich nicht mehr aufheben. Dennoch kann das System keine Reflexion der Beleuchtung liefern. Sie können mithilfe einer anderen Lasertabelle erstellt werden, die Farbkanäle verwendet, die Richtungen darstellen, die dann in einem separaten Richtungspuffer „eingeprägt“ werden. Ein solches System ist jedoch bereits komplizierter als das, was ich für Laser Disco Defenders benötigte.

Ich hoffe dir hat der Artikel gefallen. Im nächsten Beitrag werde ich mir die prozedurale Generierung von Ebenen genauer ansehen, also bleibt dran!

Alexander leitet das Bristol Gaming Studio Out Of Bounds Games. Sie können sein Twitter-Konto oder die Facebook-Seite des Unternehmens mit der meisten Unternehmens-URL der Welt abonnieren . Er organisiert auch das Bristol Unity Meetup.


Jetzt auch beliebt: