Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Mär 29, 2024 01:07

Foren-Übersicht » Sonstiges » Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TerrainRenderer
BeitragVerfasst: Mi Mai 25, 2005 12:44 
Offline
DGL Member

Registriert: Mi Apr 13, 2005 16:06
Beiträge: 67
Wohnort: Fulda
Hallo zusammen!

Ganz kurz: Ich arbeite momentan an einem Renderer für Heightmaps.

Etwas ausführlicher:
Im Zuge der Terrain-Tutorials bin ich auf die Idee gekommen, auf der einen Seite einen Renderer für Heightmaps, der zur Landschaftsdarstellung in beliebigen Projekten benutzt werden kann, und auf der anderen Seite einen passenden interaktiven Heightmap-Editor zu schreiben.
Ich habe mit dem Renderer angefangen und möchte hier kurz vorstellen, was bisher dabei herausgekommen ist:

Grundlage des ganzen war das CLOD-Tutorial auf dieser Seite und das Original-Paper zu dem verwendeten Algorithmus von Stefan Röttger (hier ein großes Dankeschön an Delphic, dein Tutorial und besonders der Sourcecode zum Tut haben mir sehr geholfen!!). Ich habe mich bemüht, den Algorithmus aus dem Tutorial zu optimieren, allgemeiner zu gestalten und ein wenig zu erweitern.
Hier ein paar Eckdaten:

  • (fast) beliebige Heightmap - Größe. Ok, vielleicht eher leicht eingeschränkt statt beliebig: Es werden Größen von (2^n)+1 im Quadrat erwartet, sonst läuft nichts. Dies liegt aber in der Natur des Algorithmus
  • für die, denen CLOD nichts sagt: Dabei wird beim Rendern einer Heightmap nicht alles in der höchsten Detailstufe, sondern abhängig von der Entfernung zur Kamera sowie den Höhendifferenzen auf der Heightmap bestimmte Teile in hoher Qualität, andere in niedrigerer gezeichnet. Dies hat eine enorme Erhöhung der Performance zur Folge und sieht dennoch gut aus.
  • Geomorphing: Wenn durch Bewegung der Kamera zwischen 2 Detailstufen gewechselt wird, poppen die neuen Polygone nicht einfach so aus dem Nichts hoch, sondern erscheinen gleichmäßig, indem linear zwischen den beiden Detailstufen interpoliert wird.
  • Frustum Culling
  • das ganze verpackt in eine leicht und bequem bedienbare Klasse


Hier ein paar Screenshots (Klicken für größere Darstellung):
Die Screens basieren auf einer 1025x1025 Pixel - Heightmap mit einer vorgefertigten Textur.
Bild

Hier zwei mal dieselbe Geländestelle mit verschiedener Entfernung der eigentlichen Kamera und damit mit zwei verschiedenen Detailgraden:
Bild Bild

Was noch kommen wird/soll:
Für den Renderer werde mich als nächstes an prozedurale Texturierung machen. Mir schwebt da ein System vor, das ähnlich sein wird wie bei Terragen. Im Klartext eine Layer-Hierarchie, deren Verteilung einerseits über Höhenstufen, aber auch über Dinge wie minimale und maximale Steigung im Gelände bestimmt wird. Für die einzelnen Layer sollen dabei sowohl Texturen aus Dateien als auch berechnete Texturen, etwa über Noise, möglich sein.
Vielleicht werde ich auch noch weitere Algorithmen für die CLOD-Berechnung implementieren, auf die ich im Netz gestoßen bin. Denn der Algorithmus von Stefan Röttger ist inzwischen immerhin 7 Jahre alt, vielleicht findet sich ja noch was besseres.

Der zweite Teil des Projekts, dem ich mich bisher noch nicht gewidmet habe, soll ein Editor sein, mit dem Heightmaps in Echtzeit sowohl in 2D als auch in 3D bearbeitet werden können. Mir persönlich gelingt es nämlich prinzipiell nicht, zum Beispiel in Photoshop in eine Heightmap das in 2D reinzumalen, was später in 3D erscheinen soll.
Der Editor soll zum einen ganz primitive Werkzeuge wie zum Beispiel Pinsel enthalten, zum anderen wären aber auch Dinge wie Korrosion sehr schön. Aber das ist wohl noch ein Weilchen hin und wie gesagt kommt als nächstes erstmal die Texturierung.

Damit das ganze Projekt universell nutzbar bleibt, soll auch weiterhin alles so in Klassen verpackt werden, dass die Bedienung möglichst leicht wird.
Bisher ist alles, was man zur Darstellung einer Heightmap braucht, eine eingebundene Unit, eine Instanz der Rendererklasse und eine der Klasse, die die eigentliche Heightmap verwaltet. Die müssen über einen Pointer verknüpft werden und dann reicht ein Aufruf von Renderer.Render im Renderloop und alles ist getan.

So weit erst mal, ich hoffe natürlich auf euer zahlreiches Feedback. ;)

Gruß,
Robert


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 26, 2005 23:51 
Offline
DGL Member

Registriert: Mi Apr 13, 2005 16:06
Beiträge: 67
Wohnort: Fulda
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:
Bild

Hier dasselbe Terrain wie ich es schon im ersten Post zeigte, diesmal allerdings mit einer komplett dynamisch berechneten Textur:
Bild

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.
BildBild

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.
BildBild

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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Sonstiges » Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.122s | 17 Queries | GZIP : On ]