terrain rendering usf 2001 dirk ringe (phenomic game development) stefan röttger (universität...
TRANSCRIPT
Terrain Rendering
USF 2001
Dirk Ringe (Phenomic Game Development)
Stefan Röttger (Universität Stuttgart)
Agenda
Problematik
Tesselierung
Texturierung
Beleuchtung
Fazit
Problematik 1
Unsinnig große Datenmengen 1000x1000 Höhenpunkte sind 2.000.000 Dreiecke
Und das ist eine „kleine“ Welt
Wie bekomme ich einen hohen Detailgrad bei großen Welten?
Wie halte ich solche Datenmengen im Speicher
Woher bekomme ich solche Datenmengen (Content Creation Probleme)
Überhänge, Höhlen, etc.
Problematik 2
Wie rendert man eine Landschaft
Reduzieren der Dreieckszahlen durch Culling
LOD
Soll die Landschaftsform zur Laufzeit geändert werden (GeoMod)?
Problematik 3
Wie texturiert man sowas? Im Nahbereich ist ein Pixel fast 1cm klein
Das gibt bei einer Welt von 1km etwa 100.000 Texel im Quadrat
Kriterien
Größe der Welt
Minimale und maximale Betrachtungsentfernung/ -winkel
Geometrie Laufzeit veränderbar
Qualität der Texturierung
Statische Beleuchtung <-> Tag-Nacht-Zyklen
Dynamische Lichtquellen
CPU oder GPU lastig
Übersicht der Verfahren
Verfahren Sichtweite GeoMod CPU Last AufwandBrute Force Begrenzt Ja Wenig NiedrigTIN Begrenzt Nein Wenig NiedrigGeo Mipmapping Unbegrenzt Ja Wenig MittelCLOD (Röttger) Unbegrenzt Ja Viel MittelCLOD (ROAM) Unbegrenzt Ja Viel HochVIPM Unbegrenzt Nein Wenig Hoch
Tesselierung 1 (Brute Force)
Einfach alles an die Hardware übergeben
Gecullt werden ganze Tiles
Bei T&L Karten können locker 20000 bis 100000 Dreiecke fürs Terrain benutzt werden
NVidia schwört drauf Vorteil: Wenig CPU Last
Nachteil: Begrenzte Sichtweite
Tesselierung 2 (TIN)
TIN = Triangle Irregular Network
Das Terrain wird vom Level Designer direkt als Mesh editiert oder durch ein Tool aus der Heightmap erzeugt
Der Mesh wird fürs Culling in mehrere Teilmeshes zerlegt
Die Meshes werden direkt gerendert
Vorteile: Beliebige Geländeform und Texturierung
Nachteile: Keine GeoMods
Tesselierung 3 (Geo Mipmapping)
SLOD (Static Level of Detail) Verfahren, daß an Texture Mipmapping angelehnt ist
In einem Vertex Buffer werden alle Vertices gespeichert
Es gibt mehrere Index Buffer, die je nach Entfernung ausgewählt werden
Die Übergänge zwischen Tiles sind auf maximalen Level (oder anders strikt definiert)
Vorsicht: In dieser Variation für Software T&L ungeeignet!
Tesselierung 4 (CLOD)
CLOD = Continuous Level of Detail
Abhängig von Entfernung oder Screenspaceerror werden mehrere Dreiecke zu einem Zusammengefaßt
Vorteil: Unbegrenzte Sichtweite, GeoMods
Nachteil: Hohe CPU Last, je nach Verfahren aufwendig
Zu beachten: Ein Großteil der Performance hängt an cachefreundlichen Datenstrukturen!
Tesselierung 5 (CLOD Quadtree)
Die Landschaft wird rekursiv in Quadrate unterteilt.
In ersten Pass wird bestimmt, wie groß der Screenspaceerror pro Quadrat ist, und dementsprechend weiter aufgeteilt werden muß.
Im zweiten Pass wird anhand dieser Tesselierungsflags der Mesh erzeugt und dabei auf die Tesselierung angrenzender Quadrate geachtet.
Tesselierung 6 (CLOD ROAM 1)
Hier wird die Landschaft rekursiv in Dreiecke unterteilt.
Beim Unterteilen werden jeweils beide Dreiecke, die an der Hypothenuse sitzen geteilt. Dadurch werden Cracks durch unterschiedliche Unterteilung vermieden.
Falls ein Dreieck zu weit unterteilt wird, werden die Nachbarn rekursiv zur Unterteilung gezwungen
Tesselierung 7 (CLOD ROAM 2)
Split Only ROAM tesseliert die Landschaft jeden Frame neu. Relativ einfach zu implementieren.
Split and Merge ROAM: Es wird eine Framekohärenz ausgenutzt, da die Kamera sich ja nur stückweise bewegt.
Dazu werden für Dreiecke deren Splitfaktoren in Prioritylisten namens SplitQueue und MergeQueue gesammelt und jeden Frame entsprechend aktualisiert.
Sehr aufwendig zu implementieren, kann schneller als SplitOnly sein
Tesselierung 8 (VIPM)
VIPM = view independant progressive mesh
Die Landschaft wird in Tiles unterteilt
Jedes dieser Teils wird mit VIPM gerendert.
Die Übergänge der Tiles sind immer vollständig dargestellt, dadurch werden Cracks vermieden.
Vorteil: Minimale CPU Last, hohe Dreieckszahlen möglich.
Nachteil: Keine GeoMods, ScreenSpace Error ist bei gleichen Dreieckszahlen einiges höher als bei CLOD Verfahren (da view independent).
Sonstige Verfahren
Displacement Maps Bald in Hardware verfügbar
Zusammen mit NPatches wird alles in Hardware gemacht
View Independant
Slicing Ähnlich dem Fur Rendering werden Scheiben durch die
Landschaft gezogen und durch die Höhe bestimmt, wo die Scheibe transparent ist oder nicht
Nachteil: Gigantische Fillrate, gut für Radarmaps etc.
Beispiele
Nach besten Wissen und Gewissen!
Black & White: Geo mipmapping
AquaNox: CLOD mit Quadtrees nach Roettger
PlanetSide: TINs, die offline mit view independent QuadTrees nach TopoVista erzeugt wurden
Yager: Brute Force
Unreal Warfare: Brute Force
Texturierung 1 (Welttextur)
Eine große Textur wird über das gesamte Terrain aufgespannt
Vorteil: äußerst einfach
Nachteile Geringe Auflösung der Textur führt zu schwammigen Terrain
Steile Bereiche sind verzerrt
Texturierung 2 (Detailtextur)
Der Welttextur wird einfach eine Detailtextur mitgegeben, die sich recht häufig wiederholt.
Dadurch ist die Landschaft auch in der Nähe scharf
Vorteil: einfach
Nachteil: keine wirklich Unterscheidung zwischen Terrainbereichen (Fels braucht anderes Detail als Gras)
Texturierung 3 (Tiling)
Jeder Terraintyp existiert als Textur
Für jeden Terraintyp wird die entsprechende Geometrie erzeugt
Bei den Übergängen können die Tiles mit dem Alphakanal ineinander gemischt werden
Es dürfen keine Dreiecke zusammengefaßt werden!
Vorteil: Hohe Texturauflösung
Nachteil: Funktioniert nicht mit hohen Sichtweiten
Texturierung 4 (Splatting)
Keine Welttextur, mehrere hochaufgelöste Texturen, eine pro Terraintyp (Gras, Fels,...)
Pro Terraintyp gibt eine Alphamap die Bedeutung des Typs an dieser Stelle wieder
Die Landschaft wird pro Terraintyp einmal gerendert
Vorteil: Hohe Auflösung bis zum Horizont
Nachteil: Viel Speicherverbrauch durch die Alphamaps, hohe Polygonzahlen durch viele Passes, hohe Fillrateanforderungen
Texturierung 5 (Unique Texturing)
Die Landschaft wird rekursiv in Quadrate unterteilt (Quadtree)
Jeder Quadtreeknoten repräsentiert eine Textur fester Größe
Die Ebene im Baum bestimmt, wieviel Bereich diese Textur abdeckt
Die Texturing werden dynamisch von der CPU erzeugt (unter Zuhilfenahme von Perlin Noise etc.)
Moderne GPUs können diese Aufgabe auch
Beispiele
AquaNox, Unreal Warfare: Terrain splatting
Soul Ride: Unique Texturing
Black & White: World map + Detail map
Warcraft 3: Tiling
Beleuchtung 1
Vertex Lighting: an jedem Vertex wird klassisch beleuchtet
Nachteil: sobald LOD ins Spiel kommt, sieht es schlecht aus
Nachteil: CLOD oder VIPM machen es noch schlimmer, da die Normalen springen
Lightmap: Extratextur Übliche Technik
Beleuchtung 2
Korrekte Beleuchtung ist wichtig
Es gibt drei „Lichtquellen“: Sonne/Mond, Himmel und Reflexionen durch den Boden
Himmel ist kein ambientes Licht, sondern eine sphärische Lichtquelle (ungleichmäßig)
Der Anteil Himmel, den ein Punkt sieht bestimmt die Helligkeit dieser sphärischen Lichtquelle
Beleuchtung 3
Dynamische Lichtquellen müssen in die Lightmap reingerechnet werden
Fazit
Es gibt keine eierlegende Wollmilchsau im Terrainrendering
Die Anforderungen vom Spiel und die Möglichkeiten der Zielhardware bestimmen die möglichen Verfahren
Auch wenn eine gewisse „Stabilität“ bei den Algorithmen erreicht wurde, wird immer noch aktiv in diesem Bereich geforscht. Das Ende des möglichen wurde noch nicht erreicht.
Literatur/Links
Ich wollte hier einen Haufen Links posten, aber seltsamerweise stehen die alle schon auf dieser Seite:
http://vterrain.org
Ebenfalls äußerst interessant ist das Archiv der Mailingliste GameDev-Algos:
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
Fragen?
Fragen?
Fragen?
Fragen?
Fragen?
Fragen?