Nachmittags-Update – Donnerstag, den 18. Februar 2016
Leute,
das heutige Update ist sehr wichtig für Camelot Unchained™, aber auch sehr aufregend. Dabei geht es um einen Teil unserer Engine, der ehrlich gesagt bisher nur ein Platzhalter war. Schon seit dem Start der Kickstarterkampagne haben wir die Erwartungen an die Grafik des Spiels niedrig gehalten, sei es innerhalb des Teams, sei es gegenüber den Unterstützern. Dafür hatten wir gute Gründe. Unter anderem glauben Andrew und ich, dass es besser ist, mit guten Nachrichten zu überraschen, als mit schlechten Nachrichten zu enttäuschen. Wie wir es immer schon sagten, wir wollen keinen vorauseilenden Hype verursachen; wir wollen Taten sprechen lassen.
Daher präsentiere ich mit großer Freude den folgenden Artikel. Darin wird CSEs Mitbegründer Andrew von etwas erzählen, an dem wir in den letzten Wochen hinter den Kulissen gearbeitet haben und von dem wir hoffen, es in den nächsten zwei Wochen auf Hatchery aufzuspielen. Und damit bin ich auch schon weg!
-Mark
P.S. Natürlich wird es Konfigurationsmöglichkeiten geben, damit Spieler mit älterer, schwächerer Hardware die neuen Features deaktivieren können.
————————————————————————————–
Bisher gab es in CU nur relative einfache Beleuchtung, etwa wie in einem Highschooltheaterstück. Wir hatten nur die Sonne am Himmel mit einem goldenen „Hauptlicht“, sowie ein „Fülllicht“, das in einem Winkel strahlte, um das ausgewaschene, vage Blau über die Schatten zu legen. Ansonsten gab es nur Dunkelheit. Diese Implementierung hatten wir zu Beginn schnell umgesetzt, um überhaupt etwas darstellen zu können, stets mit dem Wunsch, sie irgendwann zu überarbeiten. Aktuell sind George und ich nun im Zielsprint, um das alles auf den technischen Stand von 2016 zu bringen. Wir erwarten, dass es das Spiel noch 2026 gibt, also bauen wir für die Zukunft!
Ein Teil davon betrifft indirektes Licht. Schaut euch in eurem Zimmer um – die meisten Gegenstände werden nicht direkt beleuchtet, und trotzdem ist nichts völlig schwarz. Wenn Licht auf eine Oberfläche trifft, dann wird es in alle Richtungen gestreut. Ein kleiner Teil dieses Lichts trifft auf eure Augen, was ihr dann sehen könnt. Der Großteil des Lichts hingegen wird in andere Richtungen reflektiert und beleuchtet andere Dinge. Das Gesamtbild dieser Reflexionen einzufangen ist der Schlüssel, um Computergrafik realistisch aussehen zu lassen. Aber die schiere Anzahl der Interaktionen macht es sehr rechenaufwendig.
Einige Spiele-Engines behelfen sich mit Vorberechnungen, aber das ist uns nicht gut genug für CU. Unsere ganze Welt ist dynamisch. Spieler können Gebäude bauen und zerstören. Das Gelände kann sich verändern, je nachdem wer die Zone kontrolliert. Tageszeit und Beleuchtungswinkel ändern sich laufend. In einer Welt, die sich in Echtzeit anpasst, brauchen wir auch Beleuchtung, die sich in Echtzeit anpasst.
Ein Element, das wir einführen, um dieses Gesamtbild einfangen, sind sogenannte „Cube-Map-Light-Probes“. Eine „Cube-Map“ ist eine besondere Art von sechsseitiger Textur, etwa wie, wenn man einen Würfel aufklappen würde:
Wenn ihr eure Augen in die Mitte dieses Würfels setzt, dann würdet ihr in alle Richtungen schauend genau das alles sehen. Probiert http://www.humus.nam…p?page=Textures für weitere Beispiele.
So eine „Cube-Map“ in Echtzeit zu generieren ist einfach – ihr wählt einen beliebigen Punkt in der Welt und lasst die Spiel-Engine sechs Frames (Einzelbilder) generieren, genau von diesem Punkt aus nach oben, unten, Norden, Süden, Osten und Westen blickend. Faltet diese sechs Bilder zusammen und schon ist es ein Würfel!
Das ist perfekt, um die dynamische Spielwelt einzufangen, aber was hat das mit Beleuchtung zu tun? Nun, erinnert euch, dass jedes indirekte Licht nur das Licht ist, das von einer Oberfläche reflektiert wurde, so, wie ihr es sehen könnt. Wir nehmen also, was ihr in einer „Cube-Map“ sehen würdet und verwandeln jedes Pixel in eine Lichtquelle. Stellt euch vor, ihr wärt in der Mitte der Box, und jede Seite der Box hätte ein Raster aus zehntausenden winzigen Lichtern, die auf euch scheinen. All diese winzigen Lichter würden euch exakt so beleuchten, als stündet ihr genau an dem Ort, an dem die „Cube-Map“ aufgenommen wurde.
Um den Unterschied zu sehen, vergleicht am besten diese beiden Bilder, eines nur mit der Sonne, das andere umgeben von einem Raster von winzigen Lichtern. Ihr könnt Gebäudedetails ausmachen und sehen, dass Schatten nicht mehr schwarz sind, aber auch nichts komplett ausgewaschen ist. Die verschiedenen Farben der ganzen verschiedenen Lichter in den verschiedenen Richtungen erzeugen einen Kontrast, der sich abhängig von der Oberfläche verändert.
Und das ist perfekt, aber zehntausende winzige Lichter in Echtzeit summieren sich zu einem Haufen Rechenarbeit für eine Spiel-Engine. Also nutzen wir Mathematik und Statistik, um das Problem kleinzukriegen. Wir fassen Lichter zusammen, die nahe beisammen liegen und eine ähnliche Farbe haben, und enden damit bei einer sehr, sehr viel kleineren Anzahl an Lichtquellen, die wir für ein Objekt berücksichtigen müssen. Am Ende brauchen wir nur zwei Dinge pro Pixel extra zu berücksichtigen – einerseits vage, diffuse Beleuchtung, die sich für jeden Betrachter gleich verhält, andererseits leuchtende Reflexionen, die sich je nach Beobachtungswinkel ändern, wie oben in der Rüstung zu sehen.
Aber wir müssen noch mehr optimieren, damit das in Echtzeit funktionieren kann, während das Spiel selbst läuft. Zuerst müssen wir die „Cube-Map“ selbst berechnen – aber bedeutet das nicht, sechs Frames extra berechnen zu müssen? Und braucht das nicht sechsmal länger als das Berechnen eines Frames? Nicht notwendigerweise.
Zunächst gibt es einfallsreiche Shadertricks, die es uns erlauben, eine Rundumsicht für alle sechs Bilder auf einmal zu berechnen. Wo das nicht funktioniert, verteilen wir den Aufwand auf sechs verschiedene Frames im Spiel, also berechnen wir den kompletten Würfel nur alle sechs Frames.
Wir tun bei der Berechnung des Würfels was wir können, um Daten aus dem Hauptbild wiederzuverwenden, etwa dieselben Schattendaten zu behalten. Ob etwas im Schatten liegt, ändert sich schließlich nicht abhängig vom Blickwinkel.
Zu guter Letzt verwenden wir eine elegante Lösung dafür, was überhaupt in der „Cube-Map“ berechnet werden muss. Einen Gegner auf einem entfernten Hügel zu sehen, mag wirklich wichtig sein für die richtige Spielentscheidung, aber es ist nicht wichtig für den Lichteinfall auf euch. Genauso können oft Partikel entfernt werden, wie auch Gras und Büsche. Die Modelle im Spiel kommen in mehreren „Detailstufen“ daher, von zehntausenden Dreiecken direkt davor, bis hin zu wenigen hundert in großer Entfernung. Die Version mit geringen Details für große Entfernungen ist absolut ausreichend für die Beleuchtung. Die wichtigsten Objekte sind der Himmel, das Gelände und größere nahe Gebäude, und das Resultat daraus ist fast immer gut genug – und viel wichtiger, schnell genug für die Darstellung der großen Kämpfe, dem Herzstück von Camelot Unchained.
-Andrew
——–
Hier ist ein Link zu Andrews Galerie der sexy Beleuchtungsverbesserungen (http://imgur.com/a/Ec7Yk). Zur Information, die dunklen Bilder entstanden mit dem alten (jetzigen) Beleuchtungssystem und die besser aussehenden und helleren Bilder mit dem neuen System.