Terrain Rendering USF 2001 Dirk Ringe (Phenomic Game Development) Stefan Röttger (Universität...

Preview:

Citation preview

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?

Recommended