Die Zeit ist reif ... reif für ein kleines Update!
Zwar kam ich in letzter Zeit aufgrund von recht ausgiebigen Abiturfeierlichkeiten nicht so sehr zum Programmieren, aber ein wenig hat sich dennoch geändert.
CLOD-Algorithmus
Den reinen Renderalgo habe ich inzwischen so weit angepasst und optimiert, dass ich ihn erst einmal als final ansehe. Er bringt inzwischen deutlich mehr Leistung als der erste Ansatz. Schön wären eventuell noch Vertex Arrays oder VBOs, allerdings weiß ich noch nicht genau, wie ich das implementieren soll, da sich die Daten ja in jedem Frame recht stark ändern können.
Texturierung
Hier kam eine Klasse hinzu, die die komplette Texturierung der Terrains übernimmt. Implementiert ist bisher ein ziemlich simples Layer-Modell, welches als Baumstruktur angelegt wird. Dabei kann jeder Layer beliebig viele Kinder besitzen.
Jeder Layer besteht bisher aus einer Farbe, minimaler und maximaler Höhe, minimaler und maximaler Steigung sowie dem Deckungsgrad in Prozent. Das ganze steckt allerdings noch in den Kinderschuhen, die Steigung wird zum Beispiel noch gar nicht berücksichtigt und auch der Deckungsgrad arbeitet noch nicht so, wie ich es mir vorstelle. Auch an der genauen Art und Weise, wie der Layer-Baum durchlaufen wird und was demnach alles in die Farbe jedes Pixels mit einfließt, muss noch gearbeitet werden.
Außerdem habe ich in Anlehnung an Nicos Tutorial die Vorausberechnung von Ambient- und diffusem Licht implementiert, Schattenwurf wird demnächst folgen.
Hier einige Screens:
Zunächst ein ganz simples Layer-Modell mit 3 Höhenstufen:
Hier dasselbe Terrain wie ich es schon im ersten Post zeigte, diesmal allerdings mit einer komplett dynamisch berechneten Textur:
Terrain-Erstellung
Die Heightmap-Klasse ist um die Möglichkeit erweitert worden, zufällig generierte Terrains zu erstellen. Prinzipiell werden dabei viele verschieden große Hügel übereinandergelegt, die im Endeffekt ein recht organisches Terrain ergeben.
Dabei kann entschieden werden, ob das generierte Terrain die gesamte Heightmap umfassen soll, oder ob die Hügel mehr auf die Mitte der Karte konzentriert werden sollen, was ein inselähnliches Terrain zur Folge hat.
Hier ein "normal" generiertes Terrain. Hier wird auch deutlich, dass zur Texturierung immer die höchste Detailstufe verwendet wird, was eine weniger komplexe Darstellung beim eigentlichen Rendern möglich macht und somit performanter ist. Links die normale Ansicht, rechts mit sichtbaren Dreiecken.

Und noch ein Beispiel einer generierten "Insel". Hier fällt auf, dass an den Rändern der Insel auf der Textur deutliche Abstufungen in der Höhe sichtbar sind. Dies kommt wohl daher, dass ich bei der Erstellung des Terrains mit single-Werten arbeite, die für die spätere Verwendung auf Bytes komprimiert werden.
Eventuell werde ich daher auch komplett auf die interne Speicherung durch Singles umstellen, speziell auch wenn es an die interaktive Gestaltung der Heightmaps in einem Editor gehen soll.

Falls jemand Interesse an der genauen Funktionsweise des Algorithmus zur Terraingenerierung hat, kann ich dies gerne noch anfügen. Interessant an diesem Algo ist, dass er sehr leicht zu implementieren ist und dennoch gute Ergebnisse bringt.
Eine Sache, die mir noch so im Kopf rumgeistert wäre noch, die Seeds dieses Algorithmus bei der Erstellung eines Terrains abzuspeichern und später für die Texturierung zu benutzen. Dies würde es möglich machen, eine fast beliebige Auflösung der Textur zu wählen. Momentan kommt noch pro Höhenwert in der Heightmap ein Pixel in der Textur, was bei näherem Heranzoomen an die Landschaft fatal ist.
So weit erstmal die Änderungen seit dem letzten Post. Schwerpunkt der weiteren Entwicklungen wird definitiv die Texturierung sein, da das Layermodell, wie schon erwähnt, noch nicht sehr ausgereift ist. Eventuell wird auch die Terrainerstellung noch ein wenig Entwicklungszeit abbekommen, wenn ich mal von den Texturen genug habe.
So weit so gut, ich hoffe auf euer Feedback.
Robert
|