Devlog #3 • Die Landschaft konstruieren
Vom Experimentieren zum Konstruieren: ein tiefer Blick in die Optimierung von Marching Cubes, stochastisches Triplanar-Mapping und Rausch-Pipelines.
Diese Woche markierte in YUMA den Wechsel vom Experimentieren zum Bauen-von-etwas-wirklich-Brauchbarem. Ich habe mich tief in das Kernsystem des Geländes gegraben, die Rauschalgorithmen verfeinert und optimiert, wie die Engine den Weg von Zufallszahlen, die die Grafikkarte erzeugt, zu einer gerenderten Welt geht. Das war eine Reise.
Das Rauschen verfeinern: von Zufall zu Geologie
Es begann mit einfachen Rauschfunktionen, aber „zufällig“ heißt nicht „natürlich“. Ich bin über einfache Perlin- und Simplex-Schichten hinausgegangen und habe mich darauf konzentriert, bestimmte Oktaven so zu kombinieren, dass sie realistische Geländeformen nachbilden.

Das Ziel war eine Rausch-Pipeline, die sich zielgerichtet anfühlt. Durch das Abstimmen von Frequenz und Amplitude und mit Domain Warping (Turbulenz) erheben sich Berge jetzt mit zackigen Gipfeln, während Täler sich natürlich glätten. Ich habe den Grundstein für einen Verlauf gelegt, der nach fließendem Wasser aussieht, noch bevor es eine echte Erosionssimulation gibt. Es sieht allmählich nach Geografie aus, oder nach irgendeiner seltsamen abstrakten Kunst.

Marching Cubes: das Mesh optimieren
Den Übergang von Voxeldaten zu glatter Geometrie übernimmt der Marching-Cubes-Algorithmus. Zu sehen, wie die Welt von Blöcken zu glatten Oberflächen wird, ist zwar immer befriedigend, aber der eigentliche Kampf dieser Woche drehte sich um Leistung und Kontinuität.
Ein Mesh zu erzeugen ist leicht; es schnell genug für eine unendliche Welt zu erzeugen, ist schwer. Ich habe viel Zeit damit verbracht, die Mesh-Pipeline zu optimieren:
- Chunk-Verwaltung: Umbau, wie Chunks zwischengespeichert und aktualisiert werden, damit nichts ruckelt.
- Normalen-Berechnung: Weg vom Flat Shading hin zu glatten, berechneten Vertex-Normalen, damit das Licht richtig mit den Rundungen des Geländes spielt.
- Nähte schließen: Sicherstellen, dass zwischen Chunks keine sichtbaren Lücken entstehen, wenn sich die Detailstufe (LOD) ändert.
Das Ergebnis ist ein Mesh, das sich riesig anfühlt, aber die feinen Details behält, die man aus der Nähe im Spiel braucht.

Die Shader-Spielwiese: das Kachel-Problem lösen
Mit stabiler Geometrie habe ich mich der optischen Ebene zugewandt. Eigene HLSL-Shader zu schreiben war hier entscheidend. Normales UV-Mapping funktioniert auf prozeduralen Voxeln schlecht: Texturen verzerren sich an Klippen oder wiederholen sich auffällig auf flachen Ebenen.

Um das zu lösen, habe ich Triplanar-Mapping mit stochastischem Sampling kombiniert. Ich bin mir zwar nicht ganz sicher, dass alles zu 100 % richtig umgesetzt ist, aber irgendwie sieht es gut aus…
- Triplanar-Mapping projiziert Texturen aus drei Achsen, sodass Klippen wie Klippen und Gras wie Gras aussieht, egal in welchem Winkel die Geometrie steht.
- Stochastisches Überblenden war der Durchbruch für den Realismus. Es verschiebt den Texturzugriff leicht zufällig und bricht so sich wiederholende Muster auf.

Statt eines sich wiederholenden Rasters aus Grastexturen sieht der Boden jetzt wie eine durchgehende, organische Oberfläche aus. Außerdem habe ich eine Logik ergänzt, die Schichten nach Hangneigung überblendet: Felstexturen kommen automatisch auf steile Flächen, Moos und Gras auf flache, ohne Handarbeit. Das Überblenden verschiedener Materialien ist noch nicht angegangen, das ist eine Aufgabe für einen anderen Tag.
Warum das wichtig ist
Eine Voxellandschaft zu texturieren ist trügerisch schwer. Es ist leicht, sie wie ein repetitives Videospiel aussehen zu lassen, aber schwer, sie wie einen Ort aussehen zu lassen. Durch die Kombination von Rauschmasken zur Laufzeit mit diesen Shader-Techniken sind mir Übergänge gelungen, die sich organisch anfühlen.

Die Engine rendert nicht mehr einfach zufälligen Kram, sie erzeugt in Echtzeit eine glaubwürdige Umgebung, fast vollständig auf der Grafikkarte (was mühsam war, sich aber gelohnt hat).

Nächste Schritte
- LOD verfeinern: Die Sichtweite weiter erhöhen, ohne Grafikkarte oder Prozessor zum Schmelzen zu bringen.
- Biom-Logik: Temperatur- und Feuchtigkeitskarten nutzen, um die Vegetation dynamisch zu verändern (oder besser: überhaupt erst Vegetation zu haben…)
