Ein erster Eindruck

Landscapes sind in Spielen immer wieder ein sehr großes Thema. Der Aufbau einer Welt, welche stets interessant aussieht ist alles andere als einfach. Wer sich an einem Open World Projekt begibt, stößt automatisch auf das erste Problem. Das Landscape. Es ist nicht nur so das man überhaupt erst einmal ein Basis Modell der Welt benötigt, man muss dieses auch noch mit Texturen belegen. Das ganze muss dann auch noch gut aussehen. Da Texturen aber eine begrenzte Auflösung haben, bilden sich auf weiten Flächen schnell Kacheln. Man sieht sie überall in Spielen. Allerdings kann man Texturen auch nicht unbegrenzt strecken. Denn dann sieht irgendwann selbst die beste Textur einfach nur noch matschig aus.

Generelles zum Materialsystem

Doch wie macht das die Unreal Engine eigentlich? Generell unterscheidet man zwischen dem Modell und dem Material das auf die Oberfläche eines Modelles gelegt wird. Dabei gilt, das Modell beschreibt die grundlegende Form eines Körpers. Während das Material die Beschaffenheit der Oberfläche beschreibt. Darunter fallen nicht nur die Farben (Diffuse Map) sondern auch z.B. Reflektionseigenschaften. Beschrieben werden hier im sehr feinen Maßstab in welchem Winkel Lichtstrahlen (Normal Map) vom Körper reflektiert werden, sowie die Rauheit (Roughness) einer Oberfläche. Es gibt noch deutlich mehr Attribute die man einem Material mitgeben kann. Die ich jetzt hier nicht alle einzeln auflisten werde. Für mehr lege ich jedem die Dokumentation ans Herz.

Landscape ist etwas Speziell

Das kann man wohl laut sagen. Das spiegelt sich auch im Materialsystem wieder. Wo genau ist hier aber nun die Problematik? Sieht man sich die Welt an, so ist der Boden nicht überall gleich beschaffen. An einem Punkt hat man Erde, an einem anderen Steine oder Grass. Gemischt mit z.B. Schnee. Der Vielfalt ist keine Grenzen gesetzt. Innerhalb eines PC’s allerdings schon. Ein Terrain kann sehr groß werden. Man kann dieses jedoch nicht mit einer einzigen Textur überspannen. Ich mein, geht schon. Auch technisch. Allerdings müsste sie dann wirklich gewaltig groß sein, damit sie nicht hoffnungslos matschig wird. Und dann gibt es wieder Probleme mit Limitierungen in der Technik. Texturen können nicht unendlich groß sein. Daher bedient man sich der Technik des „Blenden“. Man überblendet mehrere Texturen auf einem Modell. Dabei erledigen die einzelnen Texturen die jeweiligen Aufgaben. Die eine stellt Gras da, die nächste Erde und zum Schluss noch Stein.

In der Unreal Engine gibt es ein Layer System. Man kann z.B. 3 Layer (Gras, Erde, Stein) definieren. Nun wählt man einen Layer aus und pinselt mit dem Paint Tool über das Modell. Im Hintergrund wird eine Lookup Table gefüllt. Oder man macht das ganze manuell. Da im Materialsystem mathematische Operationen erlaubt sind, ist das technisch kein Problem.

Das eigene Material für Landscapes

Zum üben und sehen, was man alles so anstellen kann und vor allem wie man es anstellen kann, habe ich mir nun ein Material gebaut, welches die Texturen automatisch anhand der Beschaffenheit auf das Modell legt. Es sollte hochauflösender sein als mein erstes Material und echter wirken. Da mein erstes im Comic Stil gehalten ist. Daher ist der erste Schritt sich gescheite Texturen zu besorgen. Dazu jeweils eine Normal Map, Specular Map, Ambient Occlusion Map (AO) sowie eine Displacement Map. Die Diffuse sowie Normal Map habe ich von bestehenden Beispielprojekten extrahiert. Über die Normal Map kann man sich dann mit z.B. PixPlant die restlichen Maps generieren. Das ganze dann jeweils für Schnee, Gras, Erde und Stein. Macht zusammen 20 Texture Samples… uff… erstes Problem. Es sind nur max. 16 erlaubt. Davon sind 3 Für Shading reserviert. Also was tun? Wir nutzen die 4 Kanäle der Texturen richtig aus. Also in den Alpha Kanal der Diffuse Map die AO Map kopiert. Der Alpha Kanal der Normal Map wurde mit der Displacement Map gefüllt. Die Specular Map musste dran glauben. Etwas schade. Allerdings haben wir nun nur noch 8 Texture Samples.

Random Generatoren im Material, nicht empfohlen

Eine Random Map für das UE4 Landscape

Damit haben wir Platz für eine weitere Map. Zwar kann man generell einen Random Generator in einem Material einbinden. Es wird aber nicht empfohlen dies auch zu tun. Daher habe ich mir eine Map erstellt. Dies wurde pro Kanal mit einer Graustufen Map gefüllt. Erstellt durch einen Zufallsgenerator. Genutzt habe ich dafür einen Std. Filter von Gimp. Das ganze sieht etwas eigenartig aus. Erfüllt aber seinen Zweck.

Material Funktionen

Es ist möglich Material Funktionen zu definieren. Das ist ungemein praktisch. Denn so kann ein komplexes Material besser strukturiert werden. Diese Funktionalität habe ich gleich einmal ausprobiert. Dabei bildet jeder Layer eine Material Funktion. Macht insgesamt 4 Funktionen. Innerhalb dieser Funktionen erstelle ich ein Ausgabematerial. Mit allen Maps. Damit die Bildung von Kacheln etwas unterbunden wird, wird jedes Material über einen Farbkanal der Random Map mit zwei unterschiedlichen Landscape Koordinaten geblendet. Dabei ist ein Koordinatenpaar auch um 180° gedreht. Das Ergebnis kann sich sehen lassen.

Auf zum Material und dem Sinn von Parametern

Mein Material ist am Ende doch recht groß geworden. Als erstes müssen wir uns auf Erde und Gras stürzen. Ich habe vor Gras nur auf der Erde wachsen zu lassen. Nicht auf dem Stein. Ich habe mir dafür noch eine weitere Map (ist auf Basis einer

Das ganze Material für das Landscape.

Grundidee entstanden) erstellt. In dieser gibt es diverse Informationen für das komplette Landscape. Unter anderem wo Gras wächst und wo nicht. Ich nehme also den Output meiner Layer Funktionen und blende diese über die Graustufen Map. Der nächste Schritt ist unser Stein Layer. Anhand des Winkels auf der Z-Achse kann festgelegt werden, wann Erde und wann Stein genommen werden soll. Dazu benötigt man die absolute Position in der Welt. Welche wir glücklicherweise als Eingabe nutzen können. Zum Schluss gibt es noch Schnee. Schnee kann überall liegen. Ergo wird anhand von 2 Parametern der Schnee über alle anderen Materialen gelegt. Einmal anhand der Höhe. Da kommt wieder die Z-Achse zum Einsatz. Zum anderen über unsere Random Map. Damit wir eine mehr zufällig wirkende Kante bekommen. Das ganze bespicken wir mit diversen Parametern.

Es ist möglich in UE4 ein Material mit Parametern zu bestücken. Anstelle von Konstanten. Das hat einen einfachen Sinn. Über die Parameter kann man im Editor nicht nur in Echtzeit die Änderungen an den Werten sehen, sondern auch mehrere Instanzen des gleichen Materials erzeugen. Wobei jede Instanz des Materials eigene Werte für die Parameter speichern kann. So kann man unterschiedliche Versionen des gleichen Materials erzeugen, ohne es jedes mal kopieren zu müssen. Änderungen am Basismaterial wirken sich dann ebenfalls auf alle Instanzen aus.

Nach einigen Problemen und Lernen verstrich die Zeit. Aber am Ende ist doch etwas brauchbares dabei herum gekommen. Jetzt fehlt nur noch das passende Modell dazu. Das Test Landscape ist auf die Schnell über eine Höhenkarte erzeugt worden.

Noch etwas Hilfreiches zum Abschluss. Ich fand es sehr informativ.

Die Firma EpicGames gibt es ja schon eine sehr lange Zeit. Der wohl bekannteste Titel, aus dem Hause EpicGames, ist UnrealTournament. Da ich schon lange im Bereich der Softwareentwicklung tätig bin, lag es schon damals nahe sich mit der Entwicklung von Spielen zu beschäftigen. Damals allerdings noch mit einem 486er und später Pentium. Von Shadern, Tessellation, Reverse Kinematic und anderen Techniken, welche heute ganz normal sind, hat man damals noch nicht geträumt. Spiele in 2D (ja, kein 3D) mit Spirtes waren das übliche. Im Bereich der Polygongrafik waren die ersten Beschleuniger die Voodoo Graphics. Spiele mussten dafür extra angepasst werden und es war eine zusätzliche Karte neben der Grafikkarte. Dann folgten die integrierten Beschleuniger von z.B. nVidia. Da kam dann später auch die Fixed Function Pipeline zum Einsatz. Der Vorläufer der heutigen Shader Technologie.

 

Schon damals hat EpicGames mit ihrer UnrealEngine im Markt mit gemischt. Und mit ihren Spielen, und damit auch der Engine, Akzente gesetzt. Die Engine wurde seit ihrer ersten Entstehung kontinuierlich weiter entwickelt und zählt heute zu den besten weltweit. Und daran kann man Teil haben. Kostenfrei für rein private Projekte. Alles was man dazu braucht ist ein Account bei EpicGames und man hat vollen Zugriff auf die UnrealEngine. Welche derzeit aktuell in Version 4.16.2 vorliegt. Seit damals hat sich enorm viel getan. Aufmerksam bin ich wieder geworden, weil ich eine Preview des Editors gesehen habe. Danach starteten ein paar Tutorial Videos. Ich muss sagen, war Sprachlos. Bis zum Account war es dann nicht lange. Und schon landete UE4 auf meiner Platte.

Die Engine kommt mit einem riesigen Stapel an Features mit. Und dennoch haben es die Jungs bei EpicGames geschafft den Editor sehr Einsteiger freundlich zu halten. Das Blueprint System ist sehr gut gelungen und die Funktionen sind alle gut sortiert. So das man keine überquellenden Menüs oder Tool Leisten hat. Mit wenigen Handgriffen kann man mit einem blanken Projekt ein erstes kleines fertiges Spiel auf die Beine stellen. Ohne dafür auch nur eine einzige Zeile C++ schreiben zu müssen. Ich für meinen Teil habe weit mehr Probleme damit Modelle zu modellieren. Wer will, der kann natürlich auch auf der C++ Ebene arbeiten. Es gibt durchaus einige Funktionalitäten welche über das Blueprint System nicht erreichbar sind. Diese muss man auf der C++ Ebene ansteuern.

Da man aber das Blueprint System mit eigenen Klassen, Funktionen und Eigenschaften beliebig erweitern kann, ist das jedoch nicht schlimm. Ziel des ganzen ist es, das die Softwareentwickler eben jenes Blueprint System mit eigenen Elementen erweitern, passend zu ihrem Projekt, damit z.B. der Grafikdesigner mit wenigen Handgriffen Änderungen an den Modellen vornehmen kann. Ohne das dieser Kenntnisse in C++ besitzen muss.

Auf Grund der Firmenpolitik konnte sich ein sehr ausgedehntes Ökosystem um die Engine bilden. Die Community ist sehr aktiv und es gibt viele unterschiedliche Projekte. Zu verfolgen in diversen Blogs mit unmengen an Tutorials oder auch bei Youtube und Twitch. Dort live zu verfolgen wer so alles macht.

 

Natürlich ist nicht alles so Sahne wie es sich anhört. Es gibt einige Bugs. Darunter einige sehr problematische. Manche führen zum Absturz. Auch der Editor verabschiedet sich manchmal unangekündigt. Man stößt an Limits die nicht immer offensichtlich sind und sogar einige Kuriositäten. Je nachdem was man vorhat, wird es auch schnell umständlich. Oder sehr Zeitaufwendig. Wie das kompilieren des Engine Source auf meinem Laptop. Da die generierten Source Files teils riesig sind, verbraucht clang teils über 1GB RAM. Zzgl. Mono, noch einmal 1GB RAM und dann wird es auch schon sehr eng auf dem alten Hobel.

 

Natürlich gibt es auch Probleme. Bei einem solchen Projekt ist das nicht aus zu schließen. Alles in allem jedoch ein sehr rundes Paket, das man da an die Hand bekommt. Mit einem Editor der wirklich Spaß macht zu benutzen.

 

Zu guter letzt noch eine kleine Link Sammlung