Tutorial 30 – Real-Time Procedural Planet Rendering

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

 
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