
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.