Im heutigen Tutorial befassen wir uns mit den Grundlagen der
prozeduralen Erzeugung und Darstellung von Planetenoberflächen.
In Abhängigkeit von der Entfernung eines Planeten zur Kamera kommen bei der Darstellung der Planetenoberfläche drei unterschiedliche Verfahren zum Einsatz:
Betrachtet
man einen Planeten aus größerer Entfernung, dann wird dessen Oberfläche aus
sechs sphärisch gewölbten, unabhängig voneinander texturierbaren Terrainflächen
(Faces) zusammengesetzt,
die jeweils nacheinander gerendert werden.
(voreingestellter Wert: g_SimplePlanet_NumVerticesPerRowORColumn_PerFace = 51)
(voreingestellter Wert: g_SimplePlanet_NumVerticesPerRowORColumn_PerFace = 51)
Nähert
sich die Kamera dem Planeten immer weiter an, bis der Atmosphäreneintritt
unmittelbar bevorsteht, dann werden die einzelnen Faces in sogenannte
Base-Patches unterteilt, die jeweils aus vier Vertices bzw. zwei Dreiecken
bestehen (Vertex-Quads) und mithilfe von Texture-Buffer-basiertem Geometry
Instancing gerendert werden. Die Sichtbarkeit der einzelnen Patches wird in
Abhängigkeit von der momentanen Kamerablickrichtung in einem separaten Thread
ermittelt.
Beispiel: Besteht eine Terrain-Fläche aus 3 mal 3 Vertices, so lässt sich diese Fläche in vier Patches zerlegen.
(voreingestellter
Wert: g_Planet_NumVerticesPerRowORColumn_PerFace
= 201).
Taucht die Kamera schließlich in die Atmosphäre ein, dann
werden die Base-Patches in der näheren Umgebung durch sogenannte Detail-Patches
ersetzt, die unter Gebrauch der in der verwendeten NoiseNormalMap gespeicherten
Normalvektoren und Höhendaten ebenfalls mithilfe von Texture-Buffer-basiertem
Geometry Instancing gerendert werden.
(voreingestellter Wert: g_Planet_NumVerticesPerRowORColumn_DetailPatch = 61)
Die Sichtbarkeit der Detail-Patches in Kameranähe sowie die der Base-Patches in größerer Entfernung wird in Abhängigkeit von der momentanen Kamerablickrichtung wiederum in einem separaten Thread ermittelt.
Unabhängig von den drei zuvor beschriebenen Techniken
erfolgt die Farbgebung der Planetenoberfläche in den jeweiligen
Fragment-Shader-Programmen stets auf gleiche Art und Weise:
Schritt 1:
Ermittlung eines Höhen- und eines Klimaprofils auf Basis der in der verwendeten NoiseMap
gespeicherten Daten.
Schritt 2:
Berechnung der Oberflächenfarbe auf Grundlage der zuvor ermittelten Höhen- und
Klimaprofile in Kombination mit einer Auswahl von acht Farbwerten (Beispiele: blau für
Wasser, grün für Vegetationszonen, gelb für Wüstenzonen, weiß für Gletscher,
usw.).
Schritt 3: Modifizierung der Oberflächenfarbe zwecks Darstellung zweier Eisschilde, die sich von den Polen hin zum Äquator ausbreiten.
Schritt 4: Abschließende
Modifizierung der Oberflächenfarbe und Berechnung eines Per-Pixel-Normalenvektors
auf Basis der in einer Detail Map gespeicherten Farbwerte. In einer solchen
Textur sind drei separate Graustufen-Detailverläufe zusammengefasst, die mit
den korrespondierenden RGB-Farbkomponenten der in den Schritten 2 und 3
ermittelten Oberflächenfarbe kombiniert werden.
Hinweise zum Erstellen eines neuen Projekts:
- Kopieren Sie den Ordner GraphicsAndPhysicsFrameworkImports ins Projektverzeichnis
- Kopieren sie alle dll-Dateien sowie die Konfigurationsdatei ResolutionAndRendering.txt aus besagtem Ordner ins gleiche Verzeichnis, in dem sich auch die exe-Datei befindet (in unseren Programmbeispielen ist dies das Bin-Verzeichnis)
- Binden Sie die folgenden Dateien in Ihr Projekt ein: GraphicsAndPhysics_Framework_Imports.h, GraphicsAndPhysics_Framework_Imports.lib, glew32.lib, glew32s.lib, glut32.lib. Die Glew- und Glut-Bibliotheken ermöglichen die Nutzung der aktuellen OpenGL-Spezifikationen unabhängig vom Framework.
GraphicsAndPhysicsFrameworkDemo30.zip