310 likes | 449 Views
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
E N D
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
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 draufJ • 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?