Die Textur für die Rückwand des Spiels war bisher eine einfache, viereckige Kacheltextur in braun. Mein Ziel für diesen Meilenstein war es unter anderem, die Hintergrund-Textur so anzupassen, dass sie mit den davorliegenden Blöcken übereinstimmt.
Weiterhin soll die Grösser der Map variabel sein und die Texture sollte "blenden", also keine scharfen Kanten zwischen verschiedenen Texturtypen aufweisen.
Die grösste Herausforderung war es die Map - dargstellt als int[][] mit Werten von 0-5 für die verschiedenen Blocktypen - in eine Form zu bringen, welche wir in einen GLSL Shaderprogramm laden können und dort dazu benutzen, die Texturen zu blenden. Wir brauchen 4 Werte für die Wandtexturen: Erde, Stein, Gold und Obsidian.
Dazu erstellen wir ein int[] array welches ähnlich wie in einem Bild für jedes Pixel drei Werte speichert. Wir brauchen nur 3 statt 4 Werte, da der vierte Wert automatisch das Komplementär der drei anderen Werte ist. Dieses Array wandeln wir zu einem ReadableByteChannel und schliesslich zu einem ByteBuffer, welchen wir direkt an den GLSL Shader geben können.
RGB repräsentation der Map als Bild und im Spiel.
Die Blendmap im Spiel
Sind die Texturen und der ByteBuffer mit den Intensitäten in den Terrain Fragment Shader geladen, multiplizieren wir für die jeweiligen Texturkoordinaten alle Texturen mit den Intensitäten an dieser Stelle.
Die Wandtexturen sind in Stücke von jeweils 8x8 Blocks unterteilt und werden in diesen Stücken generiert, geladen und gerendert. Hinter jedem Block erscheint die dazugehörige Wandtextur und die Übergänge sind fliessen, wie sich auf dem Bild links erkennen lässt. Wird ein Block zerstört, bleibt die Textur dahinter gewollt bestehen.
Auch das Terrain über Tage hat ein Rework bekommen und zeigt nun statt Wiesen mit Bäumen eine passendere Fels- / Steinlandschaft.
Das Terrain wird zufällig (mit dem gleichen Seed wie die Map) Prozedural generiert nach ein paar simplen Regeln: