<<

Displacement Mapping

Studienarbeit

Vorgelegt von Ruth-Maria Recker

Institut fur¨ Computervisualistik Arbeitsgruppe Computergraphik

Betreuer: Dipl.-Inform. Thorsten Grosch Prufer:¨ Prof. Dr.-Ing. Stefan Muller¨

Januar 2006 Inhaltsverzeichnis

1 Einleitung 5

2 GPU Programmierung 6 2.1 Entwicklung der GPU ...... 6 2.2 Fixed-Function-Pipeline ...... 6 2.3 Programmierbare Graphik-Pipeline ...... 8 2.4 Vertex-Prozessor ...... 9 2.5 Fragment-Prozessor ...... 10 2.6 Cg ...... 11

3 13 3.1 Blinn-Bump Mapping ...... 13 3.2 ...... 15 3.2.1 Normal-Maps ...... 15 3.3 Berechnung des Texture Space ...... 16 3.4 Beleuchtung ...... 18 3.5 Anwendung von Bump Mapping ...... 18

4 20 4.1 Idee von Parallax Mapping ...... 20 4.2 Parallax Mapping mit Offset Limiting ...... 22 4.3 Anwendung von Parallax Mapping ...... 23

5 Displacement Mapping 25 5.1 Idee von Displacement Mapping ...... 25 5.2 View-dependent Displacement Mapping ...... 26 5.3 Per-Pixel Displacement Mapping ...... 28 5.4 Erstellung einer Distance-Map ...... 31 5.5 Rendern des Bildes mit Per-Pixel Displacement Mapping ...... 34 5.5.1 Der Vertex- ...... 34 5.5.2 Der Fragment-Shader ...... 34 5.5.3 Selbstverschattung ...... 35 5.5.4 Filterung ...... 37 5.6 Anwendung von Per-Pixel Displacement Mapping ...... 39

i 6 Die Beispielszene 41 6.1 Modellierung der Szene ...... 41 6.2 VRML ...... 42

7 Ergebnisse 44

8 Fazit und Ausblick 51

ii Abbildungsverzeichnis

2.1 Fixed-Function-Pipeline [6] ...... 7 2.2 Programmierbare Graphik-Pipeline [6] ...... 8 2.3 Vertex-Prozessor [10] ...... 9 2.4 Fragment-Prozessor [10] ...... 10 2.5 Einfaches Vertex-Programm ...... 12 2.6 Einfaches Fragment-Programm ...... 12

3.1 Idee des Bump Mapping [1] ...... 14 3.2 Konvertierung eines Height-Fields in eine Normal-Map ...... 16 3.3 Ergebnis des Bump Mappings ...... 19

4.1 Parallax Mapping [15] ...... 20 4.2 Berechnung des Offset-Vektors [15] ...... 21 4.3 Berechnung des Offsets-Vektors mit Offset Limiting [15] ...... 22 4.4 Ergebnis des Parallax Mappings ...... 24

5.1 Idee von Displacement Mapping [3] ...... 25 5.2 Displacements mit View-dependent Displacement Mapping [14] ..... 27 5.3 Krummung¨ der Oberflache¨ [14] ...... 27 5.4 Undersampling [5] ...... 29 5.5 Oversampling [5] ...... 29 5.6 Sphere Tracing [4] ...... 30 5.7 Erstellung einer 2D-Distance-Map [4] ...... 31 5.8 Selbstverschattung [14] ...... 36 5.9 Ohne Filterung ...... 38 5.10 Mipmapping und Anisotrope Filterung ...... 38 5.11 Ergebnis des Displacement Mappings: Steine ...... 40 5.12 Ergebnis des Displacement Mappings: Text ...... 40

6.1 Modellierte Beispielszene ...... 41

7.1 Gerenderte Beispielszene ...... 44 7.2 Vergleich der verschiedenen Verfahren ...... 45 7.3 Ergebnisse des Displacement Mappings im Detail ...... 47 7.4 Gullideckel ...... 48

iii 1 Einleitung

In immer mehr Bereichen kommen heutzutage dreidimensionale computergenerierte Szenen zum Einsatz. Dies ist insbesondere in der Film- sowie der Computerspieleindu- strie zu beobachten. Aber auch weitere Einsatzgebiete wie beispielsweise Virtual Rea- lity sind moglich.¨ Bei der Generierung der 3D-Szenen liegt das Hauptaugenmerk auf einer moglichst¨ realitatsgetreuen¨ Darstellung der Szene. Neben der korrekten Simu- lation des Lichtes tragen auch die verwendeten Materialien einen wichtigen Teil zur Darstellungsqualitat¨ der Szene bei. Ein wichtiger Aspekt bei den Materialien ist die Simulation der Oberflachenstruk-¨ tur. In der Realitat¨ existieren so gut wie keine vollkommen glatten Oberflachen.¨ Selbst Metall- und Plastikmaterialien besitzen feine, auf den ersten Blick kaum sichtbare Struk- turen, welche jedoch einen wichtigen Teil zum Erscheinungsbild des Objektes beitra- gen. Fehlen diese Strukturen, so verliert das Objekt einen Teil seiner Realitatsn¨ ahe,¨ da das Licht nun anders von der Oberflache¨ reflektiert wird und dem Objekt so ein ande- res Aussehen verleiht. Da es zu aufwendig ist, sehr feine Strukturen auszumodellieren, werden haufig¨ Verfahren zur Simulation dieser Strukturen eingesetzt. Doch auch bei verhaltnism¨ aßig¨ groben Strukturen der Oberflache¨ ist eine Ausmo- dellierung der einzelnen Strukturen oft zu aufwendig. Durch den Einsatz geeigneter Verfahren, wie beispielsweise Bump Mapping oder Displacement Mapping, laßt¨ sich der Aufwand zur Generierung der Szene reduzieren. Daruberhinaus¨ ermoglichen¨ viele der eingesetzten Verfahren eine Simulation der Oberflachenstruktur¨ ohne die Generie- rung neuer Dreiecke. Die Reduzierung der Renderzeit sowie des Speicherverbrauchs wird als enormer Vorteil dieser Verfahren angesehen. So werden zum Beispiel in Com- puterspielen Szenen mit Hilfe dieser Verfahren mit detailreichen Oberflachen¨ versehen und lassen sich dennoch in Echtzeit darstellen. In dieser Studienarbeit werden verschiedene Verfahren zur Verbesserung der Ober- flachenstruktur¨ vorgestellt, die zur Implementierung auf moderner Graphik-Hardware geeignet sind. Dabei liegt der Schwerpunkt auf dem Displacement Mapping. Nach einer kurzen Einfuhrung¨ in die GPU Programmierung sowie in die hier ver- wendete Sprache Cg wird das Bump Mapping vorgestellt. Im Anschluß daran wird ein weiteres Verfahren zur Verbesserung der Oberflachenstruktur,¨ das Parallax Map- ping, erlautert.¨ Das nachste¨ Kapitel beschaftigt¨ sich mit Displacement Mapping sowie dessen Einsatzmoglichkeiten.¨ Zum Vergleich der einzelnen Verfahren dient eine Bei- spielszene, deren Erstellung im nachsten¨ Kapitel vorgestellt wird. Daruberhinaus¨ wird hier auch der Import der Szene in die eigene Anwendung erlautert.¨ Die Ergebnisse des Vergleichs hinsichtlich Speicherverbrauch, Renderzeit und Darstellungsqualitat¨ wer- den zum Schluß vorgestellt.

5 2 GPU Programmierung

2.1 Entwicklung der GPU

Wahrend¨ fruher¨ die CPU noch alleine fur¨ die Berechnung der gesamten Darstellung zustandig¨ war, gewann die Graphik-Hardware in den letzten Jahren zunehmend an Be- deutung. Die moderne Graphik-Hardware ist mittlerweile in ihrer Leistungsfahigkeit¨ soweit entwickelt, dass sie die meisten Berechnungen zur Darstellung einer komplexen 3D-Szene ubernehmen¨ kann. Vor der Entwicklung der ersten GPUs 1 ermoglichte¨ nur eine spezielle Graphik- Hardware von Firmen wie Silicon Graphics (SGI) oder Evans & Sutherland Konzepte wie Vertex-Transformationen oder . Diese Hardware war allerdings durch ihren hohen Preis fur¨ den Massenmarkt nicht erschwinglich und wurde aus- schließlich in speziellen Workstations eingesetzt. Dies anderte¨ sich erst Mitte der 90iger Jahre mit der Entwicklung der ersten 3D-Chips fur¨ PCs. Unterstutzt¨ durch eine starke Entwicklung der Computerspieleindustrie ka- men in immer kurzeren¨ Abstanden¨ neue 3D-Chips auf den Markt. Seit 2001 gibt es auch die ersten programmierbaren Graphikchips, zum Beispiel von ATI und NVIDIA. Diese Graphikchips ermoglichten¨ erstmals die Programmierung des Vertex-Prozessors. Mit spater¨ entwickelten Graphikchips kam auch die Moglichkeit¨ der Programmierung des Fragment Prozessors hinzu.

2.2 Fixed-Function-Pipeline

Im Computer entworfene 3D-Modelle mussen¨ gerendert werden, damit sie auf dem Bildschirm in 2D dargestellt werden konnen.¨ Wahrend¨ des Rendering-Vorgangs durch- laufen die Objekte eine sogenannte Rendering-Pipeline, welche die zur Umrechnung notigen¨ Schritte durchfuhrt.¨ Ursprunglich¨ war die Funktionalitat¨ der einzelnen Stufen dieser Rendering-Pipeline genau festgelegt, deshalb spricht man hier von einer Fixed- Function-Pipeline. In der Abbildung 2.1 konnen¨ die verschiedenen Schritte der Pipeline nachvollzogen werden.

1Graphics Processing Unit

6 2.2 Fixed-Function-Pipeline

3D Application or Game

3D API: OpenGL or Direct3D CPU - GPU Boundary

Fragment GPU Vertex Primitive Raster Frame Rasterization Texturing & Front End Transformation Assembly Operations Buffer Coloring

Abbildung 2.1: Fixed-Function-Pipeline [6]

Die Eingabedaten, welche ublicherweise¨ aus einer 3D-Anwendung oder einem 3D- Computerspiel stammen, werden zur Steuerung der 3D-API 2 verwendet. Man unter- scheidet heute im Allgemeinen bei den 3D-APIs zwischen Direct3D und OpenGL. Bei Direct3D handelt es sich um einen Bestandteil von DirectX, entwickelt und betreut von Microsoft. Der Standard OpenGL entstand aus dem IRIS GL, entwickelt von Silicon Graphics (SGI). Heute wird die OpenGL-Spezifikation vom OpenGL Architecture Re- view Board (ARB) betreut. Wahrend¨ OpenGL plattformunabhangig¨ ist, lauft¨ Direct3D lediglich auf Windows Plattformen. Mit Hilfe der Methoden einer 3D-API konnen¨ 3D- Objekte gerendert werden. Dazu werden die in der 3D-Anwendung aufgerufenen Be- fehle von der 3D-API umgesetzt. Der GPU Front-End erhalt¨ uber¨ den Graphikkarten- treiber die entsprechenden Befehle von der 3D-API und steuert dementsprechend die Umsetzung der Befehle auf der Grafikhardware. In der nachsten¨ Stufe, der Vertex Transformation, wird ein Vertex mit Hilfe mathe- matischer Operationen von Objektkoordinaten in Clip-Koordinaten umgerechnet. Au- ßerdem kann die Beleuchtung des Vertex berechnet werden. Die transformierten Vertices werden in der Primitive-Assembly Stufe zu Geometrie- Primitiven, wie zum Beispiel Dreiecken, Linien oder Punkten, zusammengefasst. In der anschließenden Rasterisierungsstufe werden nun die geometrischen Primitive gegen das View Frustum sowie eventuell gegen vorher definierte Clipping Planes ge- clippt. Daruberhinaus¨ werden beim Backface Culling diejenigen Polygone, deren Vor- derseiten vom Betrachter abgewandt sind, verworfen. Die ubrig¨ gebliebenen Polygo- ne konnen¨ nun rasterisiert werden. Bei der Rasterisierung werden die geometrischen Primitive in ein 2D-Bild umgerechnet. Hierbei werden die Positionen derjenigen Frag- mente bestimmt, die ein geometrisches Primitiv im 2D-Bild einnimmt. Außerdem wird bei der Rasterisierung die Farbe und ein Depth-Wert fur¨ jedes Fragment durch Interpo- lation bestimmt. Innerhalb der nachsten¨ Stufe in der Rendering Pipeline, Fragment Texturing und Coloring, wird die endgultige¨ Farbe eines Fragments festgelegt. Dies geschieht durch Kombination der interpolierten Farbe aus den Vertices mit der zum Fragment gehoren-¨ den Texturfarbe, sofern eine Textur angelegt wurde.

2Application Programming Interface

7 2.3 Programmierbare Graphik-Pipeline

Bevor das Fragment an den Frame-Buffer gesendet werden kann, muß es noch eine Reihe von Tests bestehen. Zu diesen Rasteroperationen gehoren¨ der Scissor-Test, der Alpha-Test, der Stencil-Test und der Depth-Test. Besteht ein Fragment einen dieser Tests nicht, so wird es verworfen. Andernfalls wird noch eine Blending-Operation und eine Dithering-Operation durchgefuhrt.¨ Anschließend kann das fertige Fragment an den Frame-Buffer gesendet werden.

2.3 Programmierbare Graphik-Pipeline

3D Application or Game 3D API Commands

3D API: OpenGL or Direct3D CPU - GPU Boundary

GPU Assembled Pixel Command & Vertex Index Polygons, Lines & Location Pixel Data Stream Stream Points Stream Updates Rasterization GPU Primitive Raster Frame & Front End Assembly Operations Buffer Interpolation

Pretransformed Vertices Programmable Programmable Fragment Vertex Processor Transformed Rasterized Processor Transformed Vertices Pretransformed Fragments Fragments

Abbildung 2.2: Programmierbare Graphik-Pipeline [6]

Mittlerweile besteht in den modernen GPUs die Moglichkeit,¨ bestimmte Stufen der Fixed-Function-Pipeline durch programmierbare Abschnitte zu ersetzen. Bei den pro- grammierbaren Abschnitten handelt es sich um den Vertex-Prozessor und den Frag- ment-Prozessor. Die Abbildung 2.2 zeigt die programmierbare Pipeline mit den Ab- schnitten fur¨ den Vertex- und den Fragment-Prozessor. Durch die Verwendung des Vertex- bzw. des Fragment-Prozessors ist der Programmierer nicht auf die festgeleg- te Funktionalitat¨ einer Fixed-Function-Pipeline beschrankt,¨ sondern kann die vorhan- denen Funktionen noch um seine eigenen Funktionen erganzen.¨ Somit hat er mehr Moglichkeiten,¨ die Darstellung seiner gewahlten¨ Szene zu beeinflußen. Da alle Berech- nungen im Vertex- und im Fragment-Programm direkt auf der GPU erfolgen, welche solche Berechnungen schneller als die CPU ausfuhren¨ kann, ist es moglich,¨ viel Zeit einzusparen.

8 2.4 Vertex-Prozessor

2.4 Vertex-Prozessor

Durch den Vertex-Prozessor, Abbildung 2.3, wird die Stufe der Vertex-Transformationen in der Rendering-Pipeline ersetzt. Dabei ladt¨ der Vertex-Prozessor zuerst die Attribute fur¨ jeden Vertex, wie zum Beispiel Position, Farbe und Texturkoordinaten. Anschlie- ßend fuhrt¨ er alle im Vertex-Programm angegebenen Instruktionen auf dem Vertex aus. Dabei kann er eine begrenzte Anzahl von mathematischen Operationen verwenden, wie zum Beispiel Addition, Subtraktion, Multiplikation und Division aber auch Opera- tionen wie Skalarprodukt, Kreuzprodukt, Minimum und Maximum sind moglich.¨ Die Geforce 6 Serie [10] beinhaltet bis zu 6 Vertex-Pipelines. Jede der Vertex-Verar- beitungseinheiten basiert auf der MIMD-Architektur3. Dabei hat jeder Prozessor eine eigene Kopie der durchzufuhrenden¨ Verarbeitungsschritte und kann so unterschiedli- che Operationen auf unterschiedlichen Datenstromen¨ ausfuhren.¨

Input Vertex Data

Vertex fp32 fp32 Texture Scalar Vector Fetch Unit Unit

Texture Branch Unit Cache

Primitive Assembly

Viewport Processing Vertex Processor

To Setup

Abbildung 2.3: Vertex-Prozessor [10]

Die im Vertex-Prozessor enthaltene Scalar-Verarbeitungseinheit und die Vector-Verar- beitungseinheit arbeiten parallel. Samtliche¨ Operationen werden dabei mit einer fp32 4 Genauigkeit pro Komponente ausgefuhrt.¨ Die GeForce 6 Serie erlaubt erstmals auch Texturzugriffe im Vertex-Prozessor. Es besteht eine Zugriffsmoglichkeit¨ auf den Textur- Zwischenspeicher, welcher mit dem Fragment-Prozessor geteilt wird. Außerdem existiert ein sogenannter Vertex-Zwischenspeicher. Hier wird der Vertex vor und nach der Verarbeitung gespeichert. Der Vorteil dieses Speichers ist, dass ein

3Multiple Instruction, Multiple Data 432-bit floating point

9 2.5 Fragment-Prozessor doppelt auftretender Vertex nicht zweimal bearbeitet werden muss. Beim zweiten Auf- treten des Vertex kann hier einfach das schon berechnete Ergebnis aus dem Vertex- Zwischenspeicher verwendet werden.

2.5 Fragment-Prozessor

Durch den Fragment-Prozessor 2.4 wird die Stufe der Fragment-Texturierung der Fixed- Function-Pipeline ersetzt. Der Fragment-Prozessor fuhrt¨ auf den ubergebenen¨ Frag- menten die im Fragment-Programm spezifizierten Instruktionen aus. So kann im Frag- ment-Programm zum Beispiel die Beleuchtung des Fragments berechnet werden. Au- ßerdem besteht die Moglichkeit,¨ dem Fragment einen Texturwert zuzuweisen. Zum Schluß wird im Fragment-Programm die endgultige¨ Farbe des Fragments bestimmt.

Texture Data Input Fragment Data

Floating-Point Texture Processor fp32 Shader Unit1

Texture Cache fp32 Shader Unit2

Branch Processor

Fog ALU

Fragment Processor

Output Shaded Fragments

Abbildung 2.4: Fragment-Prozessor [10]

Der Fragment-Prozessor der GeForce 6 Serie ist ein SIMD5 Prozessor, was bedeutet, dass eine Anweisung fur¨ mehrere Fragmente gleichzeitig bearbeitet werden kann. Da- zu verfugt¨ die Geforce 6 Serie uber¨ bis zu 16 Fragment-Pipelines.

5Single Instruction, Multiple Data

10 2.6 Cg

Wie der Vertex-Prozessor hat auch der Fragment-Prozessor Zugriff auf einen Textur- Zwischenspeicher. Die GeForce 6 Serie unterstutzt¨ dabei die Filterung von fp166 Textu- ren. Der Fragment-Prozessor hat zwei fp32 Shader Units pro Pipeline. Die zu verarbei- tenden Fragmente werden durch diese beiden Shader Units sowie den Branch Prozes- sor geschickt, bevor sie die Pipeline erneut zur Ausfuhrung¨ der nachsten¨ Instruktion durchlaufen. Im letzten Schritt der Fragment-Pipeline kann Nebel in fixed-point preci- sion hinzugefugt¨ werden, ohne dass die Performance dadurch beeintrachtigt¨ wird.

2.6 Cg

Nach der Entwicklung der ersten programmierbaren Graphikkarten war es naturlich¨ auch erforderlich, eine Sprache bereitzustellen, die fur¨ die Programmierung dieser Gra- phikkarten eingesetzt werden kann. Zunachst¨ wurde zur Programmierung der GPU die Low-Level Sprache Assembler verwendet. Neben dem Vorteil, dass die gesamte Kontrolle uber¨ den Code beim Programmierer lag, hatte Assembler auch einige Nach- teile. Assembler-Programme sind aufgrund ihrer Syntax oft schwer zu lesen. Außer- dem wachst¨ die Codelange¨ schon bei wenigen Instruktionen sehr schnell an. Dies war der Grund, weshalb sich Assembler auf Dauer in der Graphikprogrammierung nicht durchsetzen konnte. Im Jahr 2001 wurde deshalb von NVIDIA eine neue High-Level Sprache entwickelt: Cg [6], wobei Cg fur¨ C for graphics steht. Cg zeichnet sich zunachst¨ durch seine hohe Por- tabilitat¨ aus. Diese Sprache kann auf verschiedenen Plattformen wie Windows, Linux und Mac OS X gleichermaßen eingesetzt werden. Daruberhinaus¨ ist der Programmierer frei in der Wahl der API. Er kann sowohl OpenGL als auch DirextX verwenden. Um das Cg-Programm spater¨ auf der GPU einsetzen zu konnen,¨ muß der Program- mierer noch sogenannte Vertex- und Fragment-Profile wahlen.¨ Durch die Wahl von ge- eigneten Profilen werden die zur Verfugung¨ stehenden Features fur¨ ein Cg-Programm entsprechend der gewahlte¨ 3D-API und GPU begrenzt. Profile konnen¨ in die eigene Anwendung eingebunden werden. Werden zum Beispiel das Vertex-Profil vp40“ so- ” wie das Fragment-Profil fp40“ gewahlt,¨ so konnen¨ die Befehle der 3D-API OpenGL ” von Cg verwendet werden. Da Cg eine High-Level Sprache ist, zeichnet sie sich durch eine ubersichtlichere¨ Pro- grammstruktur aus, als es bei Assembler der Fall ist und ist deshalb auch wesentlich einfacher zu lesen. Schon der Name Cg deutet auf die Nahe¨ zur Programmiersprache C hin. Tatsachlich¨ basiert die Syntax und Semantik von Cg auf C. Die Syntax von Cg wur- de jedoch um Vektor- und Matrix-Datentypen sowie Texturtypen erganzt.¨ Außerdem stellt Cg dem Programmierer verschiedene Funktionen zur Verfugung.¨ Dazu gehoren¨ zum Beispiel die Funktion dot, welche das Skalarprodukt berechnet, und die Funktion cross, welche die Berechnung des Kreuzproduktes ubernimmt.¨ Sowohl Vertex- als auch Fragment-Programme basieren auf dem Stream-Prinzip. Das bedeutet, dass das entsprechende Cg-Programm fur¨ jeden Vertex aus dem Vertex-Stream

616-bit floating point

11 2.6 Cg beziehungsweise jedes Fragment aus dem Fragment-Stream einzeln aufgerufen wird. Die Struktur eines Cg-Programms laßt¨ sich wie folgt beschreiben:

() [: ]

Hierbei sind der Programmname und die Parameter des Programms genauso zu in- terpretieren wie in C auch. Der Ruckgabewert¨ des Cg-Programms muß nicht zwangs- laufig¨ aus einem einzelnen Wert bestehen. Mit Hilfe von Ausgabe-Strukturen oder Out- Parametern kann ein Cg-Programm auch mehrere Werte zuruckliefern.¨ Die Ruckgabe-¨ werte des Vertex-Programms werden anschließend an das Fragment-Programm wei- tergeleitet und konnen¨ dort verwendet werden. In Cg-Programmen kann man im Anschluß an einen Parameter eine Semantik fest- legen, welche in einem Profil definiert ist. Eine mogliche¨ Semantik ist zum Beispiel POSITION oder COLOR. Mit diesen semantischen Bindungen kann einerseits einem Vertex-Programm mitgeteilt werden, wie die ubergebenen¨ Parameter interpretiert wer- den sollen und gleichermaßen kann man so auch dem Fragment-Programm sagen, wie es die vom Vertex-Programm ubergebenen¨ Parameter behandeln soll. In der Abbildung 2.5 wird ein Beispiel fur¨ ein einfaches Vertex-Programm darge- stellt. Dieses Programm bekommt fur¨ jeden Vertex eine Position und eine Farbe uber-¨ geben. Mit Hilfe der Ausgabevariablen, gekennzeichnet durch out, werden die Werte fur¨ die Position und die Farbe an das Fragment-Programm weitergeleitet. Das entspre- chende Fragment-Programm, dargestellt in Abbildung 2.6, erhalt¨ die Farbe vom Vertex- Programm und fugt¨ diese Farbe dem Fragment hinzu. [16]

void VertexProgram( float4 position : POSITION, float4 color : COLOR, uniform float4x4 modelViewProj, out float4 oPosition : POSITION, out float4 oColor : COLOR) void FragmentProgram( float4 color : COLOR, { out float4 oColor : COLOR) oPosition = mul(modelViewProj, position); { oColor = color; oColor = color; } } void VertexProgram( float4 position : POSITION, float4 color : COLOR, uniform float4x4 modelViewProj, out float4 oPosition : POSITION, Abbildung out float4 2.5: oColor Einfaches: COLOR) Vertex-Programm { oPosition = mul(modelViewProj, position); oColor = color; }

void FragmentProgram( float4 color : COLOR, out float4 oColor : COLOR) { oColor = color; }

Abbildung 2.6: Einfaches Fragment-Programm

12 3 Bump Mapping

In unserer Umwelt beobachten wir im Allgemeinen keine vollig¨ glatten Oberflachen,¨ sondern haufig¨ Oberflachen,¨ welche eine feine Struktur aufweisen, wie zum Beispiel Strukturen im Stein und Holz aber auch feinere Strukturen in Metalloberflachen.¨ Diese Strukturen konnen¨ wir unseren modellierten Objekten hinzufugen,¨ um ihnen dadurch ein realistischeres Aussehen zu verleihen. Ein moglicher¨ Ansatz ware¨ es, die Detail- strukturen in der Geometrie auszumodellieren. Neben der Tatsache, dass dies viel Mo- dellierungsaufwand bedeuten wurde,¨ benotigt¨ man auch zum Rendern einer Szene mit zusatzlicher¨ Geometrie deutlich mehr Zeit und hat einen hoheren¨ Speicherverbrauch. Ein anderer Ansatz besteht in der Simulation der Detailstrukturen mit Hilfe von einem Verfahren, genannt Bump Mapping, welches allein durch eine Veranderung¨ der Be- leuchtung eines Objektes Strukturen auf der Oberflache¨ simulieren kann, ohne zusatz-¨ liche Geometrie zu erzeugen.

3.1 Blinn-Bump Mapping

James F. Blinn hat das Verfahren Bump Mapping bereits 1978 erfunden und in seinem Paper Simulation of Wrinkled Surfaces [1] veroffentlicht.¨ Sein Ansatz arbeitet mit einem Height-Field, einem Graustufenbild, dessen Grauwerte fur¨ Hohenangaben¨ stehen. Fur¨ das Verfahren [9] benotigen¨ wir eine Oberflache,¨ auf der Bump Mapping simu- liert werden soll. Diese Oberflache¨ P wird durch eine bivariate Vektor-Funktion P (u, v) beschrieben. Die Oberflachen-Normale¨ in einem Punkt auf der Oberflache¨ P ist wie folgt beschrieben: ∂P (u, v) ∂P (u, v) N(u, v) = × (3.1) ∂u ∂v Außerdem existiert eine bivariate Skalar-Funktion F (u, v). F kann dabei geometrisch als ein Height-Field interpretiert werden, mit dem die Beleuchtung der originalen Ober- flache¨ so verandert¨ werden kann, dass eine Struktur erkennbar ist. Die fur¨ die Struk- tur benotigte¨ Hohenangabe¨ erhalt¨ man aus dem Height-Field-Image, die Richtung der Hohenver¨ anderung¨ wird durch die Normale N(u, v) angegeben. Kombiniert man die originale Oberflache¨ P und das Height-Field F , so erhalt¨ man eine neue Oberflache¨ P 0(u, v) , die definiert ist durch: N(u, v) P 0(u, v) = P (u, v) + F (u, v) (3.2) |N(u, v)|

13 3.1 Blinn-Bump Mapping

Die neue Oberflache¨ P 0 enthalt¨ jetzt die Struktur. Die Idee dieses Verfahrens wird in Abbildung 3.1 dargestellt.

Abbildung 3.1: Idee des Bump Mapping [1]

Fur¨ eine Simulation der Oberflache¨ P 0 in einem Shader benotigt¨ man die Normale dieser Oberflache.¨ Dabei wird die Normale beschrieben durch:

∂P 0(u, v) ∂P 0(u, v) N 0(u, v) = × (3.3) ∂u ∂v Die Bestimmung der Normalen erfordert zunachst¨ die Bildung der partiellen Ablei- tungen der neuen Oberflache.¨

0   N ! ∂P ∂(P + F · (N/ |N|)) ∂P ∂F N ∂ |N| = = + + F (3.4) ∂u ∂u ∂u ∂u |N| ∂u

0   N ! ∂P ∂(P + F · (N/ |N|)) ∂P ∂F N ∂ |N| = = + + F (3.5) ∂v ∂v ∂v ∂v |N| ∂v

Unter der Annahme, dass der Wert von F vernachlassigbar¨ klein ist, laßt¨ sich eine Approximation dieser Gleichungen finden, welche um den letzten Term reduziert ist. Daraus ergibt sich nun die Normale N 0:

∂P ∂P ∂F N × ∂P  ∂F ∂P × N ∂F ∂F (N × N) N 0 = × + ∂u ∂v + ∂v ∂u + ∂u ∂v (3.6) ∂u ∂v |N| |N| |N 2|

14 3.2 Normal Mapping

Der letzte Term dieser Gleichung wird hierbei Null und man erhalt¨ schließlich die Normale N 0, welche durch Addition der Normalen der originalen Oberflache¨ mit ei- nem Offset Vektor D erzeugt wird.

N 0 = N + D (3.7)

∂F  ∂P  ∂F  ∂P  D = N × − N × (3.8) ∂u ∂v ∂v ∂u

3.2 Normal Mapping

Blinn-Bump Mapping liefert fur¨ Offline-Anwendungen sehr gute Ergebnisse. Bei Echt- zeitanwendungen sind jedoch andere Verfahren dem Blinn-Bump Mapping, welches durch seine aufwandigen¨ Berechnungen eine hohe Rechenzeit erfordert, vorzuziehen. Hierfur¨ eignet sich zum Beispiel das Normal Mapping, ein Verfahren welches auf der Verwendung einer so genannten Normal-Map mit vorberechneten Normalen basiert. Im Gegensatz zum Blinn-Bump Mapping werden bei diesem Verfahren die originalen Normalen nicht durch Berechnung verandert,¨ sondern sie werden komplett durch die Normalen aus der Normal-Map ersetzt.

3.2.1 Normal-Maps

Normal-Maps sind im RGB-Format angelegt. Somit werden die Normalen als Vektoren abgespeichert, wobei die Komponenten x, y, z jeweils den Farben rot, grun¨ und blau entsprechen. Normal-Maps konnen¨ automatisch aus Height-Field-Images erstellt wer- den. Um die Normalen aus einem Height-Field berechnen zu konnen,¨ muß zunachst¨ die erste partielle Ableitung des Height-Field-Images F in horizontaler und vertikaler Richtung berechnet werden:

∂F (u, v) ∂F (u, v) ∇F (u, v) = (F (u, v),F (u, v)) = , (3.9) u v ∂u ∂v Mit den beiden Ableitungen kann nun die Normale N 0 in normalisierter Form fur¨ die Normal-Map berechnet werden.

hFu(u, v),Fv(u, v), 1i N 0 = (3.10) p 2 2 Fu(u, v) + Fv(u, v) + 1 Normalen besitzen im Gegensatz zu Farbvektoren eine Richtung. Der Wertebereich einer Normalen liegt deshalb im Bereich [-1,1]. Bevor die Normalen in einer RGB- Textur, deren Wertebereich [0,1] entspricht, gespeichert werden konnen,¨ mussen¨ sie bezuglich¨ des Bereichs komprimiert werden. Dies geschieht mit folgender Funktion:

F arbvektor = 0.5 · Normalvektor + 0.5; (3.11)

15 3.3 Berechnung des Texture Space

Der Farbvektor kann anschließend in der Normal-Map gespeichert werden. Zur Ver- wendung der Normalen bei der Beleuchtung ist eine Dekompression des Vektors aus der Normal-Map notwendig.

Normalvektor = 2 · (F arbvektor − 0.5); (3.12)

(a) Height-Field (b) Normal-Map

Abbildung 3.2: Konvertierung eines Height-Fields in eine Normal-Map

3.3 Berechnung des Texture Space

Bei der Beleuchtung eines Objektes werden nun statt der originalen Vertex-Normalen die Normalen aus der Normal-Map verwendet. Diese Normalen befinden sich im so- genannten Texture Space, oder auch Tangent Space genannt. Somit sind sie zunachst¨ noch von einem konkreten Objekt unabhangig¨ und konnen¨ fur¨ jedes beliebige Objekt verwendet werden. Fur¨ eine korrekte Berechnung der Beleuchtung ist es erforderlich, dass sich der Lichtvektor, der Blickvektor und die Normale in einem Koordinatensy- stem befinden. Ublicherweise¨ konvertiert man hierzu sowohl den Blickvektor als auch den Lichtvektor in den Texture Space. Diese Umrechnung erfordert neben der Norma- len die Kenntnis zweier anderer Vektoren, der Tangente und der Binormalen. Die drei Vektoren stehen dabei in folgendem Verhaltnis:¨

Binormale = Normale × T angente (3.13) Normale = T angente × Binormale (3.14) T angente = Binormale × Normale (3.15)

Jeder Vertex des zu beleuchtenden triangulierten Objekts besitzt eine 3D Position und eine 2D Texturkoordinate. Die Kombination dieser beiden Vektoren ergibt einen

16 3.3 Berechnung des Texture Space

5D Vektor, der die Punkte v0, v1 und v2 des Dreiecks beschreibt:

v0 = hx0, y0, z0, s0, t0i (3.16)

v1 = hx1, y1, z1, s1, t1i (3.17)

v2 = hx2, y2, z2, s2, t2i (3.18)

Alle diese Koordinaten liegen in der Ebene des gleichen Dreiecks. Deshalb ist es moglich,¨ folgende Ebenengleichungen aufzustellen:

A0x + B0s + C0t + D0 = 0 (3.19)

A1y + B1s + C1t + D1 = 0 (3.20)

A2z + B2s + C2t + D2 = 0 (3.21)

Fur¨ jede dieser drei Gleichungen konnen¨ nun die Koeffizienten A, B, C und D be- rechnet werden.

hA0,B0,C0i = hhx0, s0, t0i − hx1, s1, t1ii × hhx0, s0, t0i − hx2, s2, t2ii (3.22)

D0 = − hA0,B0,C0i ◦ hx0, s0, t0i (3.23)

hA1,B1,C1i = hhy0, s0, t0i − hy1, s1, t1ii × hhy0, s0, t0i − hy2, s2, t2ii (3.24)

D1 = − hA1,B1,C1i ◦ hy0, s0, t0i (3.25)

hA2,B2,C2i = hhz0, s0, t0i − hz1, s1, t1ii × hhz0, s0, t0i − hz2, s2, t2ii (3.26)

D2 = − hA2,B2,C2i ◦ hz0, s0, t0i (3.27)

Anschließend kann man diese Gleichungen so umformen, dass x, y, und z in Abhangig-¨ keit von s und t ausgedruckt¨ werden. Mit den folgenden Gleichungen konnen¨ die 2D Positionen im Texture Space in ihre entsprechenden 3D Positionen im Object Space um- gewandelt werden.

−B0s − C0t − D0 x = (3.28) A0

−B1s − C1t − D1 y = (3.29) A1

−B2s − C2t − D2 z = (3.30) A2

17 3.4 Beleuchtung

Von jeder dieser drei Gleichungen kann jetzt die partielle Ableitung nach s und t gebildet werden. Aus diesen partiellen Ableitungen lassen sich folgende Gleichungen fur¨ die Tangente und die Binormale aufstellen:     ∂x ∂y ∂z B0 B1 B2 T angente = , , = − , − , − (3.31) ∂s ∂s ∂s A0 A1 A2     ∂x ∂y ∂z C0 C1 C2 Binormale = , , = − , − , − (3.32) ∂t ∂t ∂t A0 A1 A2 Mit der so berechneten Tangente und Binormalen sowie der Vertex-Normalen lassen sich der Lichtvektor L und der Blickvektor V in den Texture Space konvertieren:     Tx Ty Tz Lx LTBN =  Bx By Bz  ·  Ly  (3.33) Nx Ny Nz Lz

3.4 Beleuchtung

Mit der Normalen aus der Normal-Map sowie dem konvertierten Lichtvektor und Blickvektor kann nun die Beleuchtung des Fragments durchgefuhrt¨ werden. Dabei wird die diffuse Beleuchtung nach dem Lambert Modell berechnet.

D = diffusM · (N ◦ L) (3.34)

Die diffuse Materialfarbe wird durch diffusM , die Normale durch N und der Licht- vektor durch L beschrieben. Die spekulare Beleuchtung hingegen wird nach dem Blinn- Phong Modell berechnet.

shininess S = specularM · (N ◦ H) (3.35)

H = ||L + V|| (3.36)

Hierbei handelt es sich bei specularM um die spekulare Materialfarbe. Der Halb- vektor H ist der Vektor, welcher in der Mitte zwischen dem Lichtvektor L und dem Blickvektor V liegt. Der spekulare Exponent shininess kann in Abhangigkeit¨ von den Materialeigenschaften gewahlt¨ werden.

3.5 Anwendung von Bump Mapping

Die Technik des Bump Mappings laßt¨ sich relativ einfach und effizient implementieren und ermoglicht¨ so einen verbesserten Tiefeneindruck der Texturen eines Objektes. Im Allgemeinen eignet sich Bump Mapping gut zur Darstellung von detailreichen Struk- turen mit geringer Amplitude. So kann Bump Mapping zum Beispiel zur Darstellung

18 3.5 Anwendung von Bump Mapping von feinen Details in Leder-, Kunststoff- oder Metallmaterialien ideal eingesetzt wer- den. Spatestens¨ bei Betrachtung der Kanten eines Objektes, insbesondere bei Struk- turen mit hoherer¨ Amplitude, wird allerdings deutlich, dass es sich bei Bump Map- ping nur um eine Simulation handelt, da Bump Mapping keine Silhouetten darstellen kann. Daruberhinaus¨ werden weder Selbstverdeckung und Schatten noch Parallax Ef- fekte mit der verwendeten Bump Mapping Technik dargestellt. Dies schwacht¨ den Rea- litatseindruck¨ des Ergebnisses sicherlich ab. Trotzdem ist Bump Mapping eine Verbes- serung im Vergleich zu dem normalen Texture Mapping. Der mit Hilfe von Bump Map- ping zu erzielende Tiefeneffekt ohne große Einbußen bei der Geschwindigkeit und dem Speicherverbrauch der Applikation rechtfertigt sicherlich den Einsatz von Bump Map- ping in Computerspielen. In Abbildung 3.3 ist die Anwendung von Bump Mapping auf die Textur von einer Steinmauer sowie auf eine Hauttextur zu sehen. Das Beispiel der Steinmauer wird auch noch zum Vergleich der Darstellung von Bump Mapping mit Parallax und Displacement Mapping dienen.

(a) Steine (b) Haut

Abbildung 3.3: Ergebnis des Bump Mappings

19 4 Parallax Mapping

4.1 Idee von Parallax Mapping

Die Idee von Parallax Mapping wurde zuerst von Tomomichi Kaneko [13] im Jahr 2001 veroffentlicht.¨ Im Gegensatz zu Bump Mapping, welches bei einer Veranderung¨ der Betrachtungsrichtung flach und somit teilweise unrealistisch wirkt, berucksichtigt¨ Par- allax Mapping die Verschiebung von Teilen der Oberflache¨ relativ zueinander bei ei- nem Wechsel der Position des Betrachters, die sogenannte Parallaxe, und erreicht damit einen hoheren¨ Realitatsgrad.¨ Terry Welsh veroffentlichte¨ im Jahr 2004 eine Technik [15], mit der Parallax Mapping unter Nutzung moderner GPUs verwendet werden kann. Außerdem erganzte¨ er seinen Ansatz durch Offset Limiting, um so bestimmte Artefakte von Parallax Mapping zu vermindern. Im folgenden soll der Ansatz von Welsh erlautert¨ werden.

Auge A reale Oberfläche B

Polygon

aktuelle korrigierte Textur- Textur- koordinate koordinate

Abbildung 4.1: Parallax Mapping [15]

Bei Verwendung einer Technik wie Normal Mapping konnen¨ wir durch Ersetzung der Normalen, wie im Kapitel Bump Mapping beschrieben, eine strukturierte Ober- flache¨ simulieren. Allerdings wirkt die entstandene Oberflache¨ aus verschiedenen Be- trachtungswinkeln dennoch zu flach. In der Abbildung 4.1 ist die Ursache dieses Pro- blems dargestellt. Der Sehstrahl vom Auge trifft auf unser Polygon. Somit greifen wir mit der aktuellen Texturkoordinate auf die zu verwendenden Texturen sowie auf die Normal-Map zu. Durch die Berechnungen beim Bump Mapping Verfahren ergibt sich ein Punkt A auf unserer simulierten Oberflache.¨ Der Punkt A ist jedoch nicht korrekt. Wir konnen¨ sehen, dass der Sehstrahl bereits in Punkt B auf unsere zu simulieren- de Oberflache¨ treffen wurde.¨ Fur¨ eine korrekte Simulation der Oberflache¨ mussen¨ wir also die aktuelle Texturkoordinate dahingehend korrigieren, dass sich durch Anwen-

20 4.1 Idee von Parallax Mapping dung des Bump Mapping Verfahrens auf die korrigierte Texturkoordinate der Punkt B ergibt. Beim Parallax Mapping wird genau diese Korrektur der Texturkoordinaten vorge- nommen, so dass durch diese Technik die Parallaxe, welche sich ergibt wenn wir die unebene Oberflache¨ aus verschiedenen Positionen betrachten, simuliert wird. Als Voraussetzung zur Durchfuhrung¨ von Parallax Mapping benotigen¨ wir die gege- benen Texturkoordianten, einen Hohenwert¨ aus einem Height-Field-Image und einen Blickvektor von der Oberflache¨ zum Auge, wobei dieser Blickvektor sich im Texture Space befinden muß. Die zugrunde liegende Idee bei der Berechnung der neuen Tex- turkoordinate ist, wie in Abbildung 4.2 dargestellt, die alte Texturkoordinate durch einen berechneten Offset-Vektor zu verschieben. Der Offset-Vektor verlauft¨ dabei par- allel zum Polygon, namlich¨ vom Punkt A auf der zu simulierenden Oberflache¨ direkt oberhalb von P in Richtung des Blickvektors.

Offset Auge A Height Map

Polygon

P T_old T_new

Abbildung 4.2: Berechnung des Offset-Vektors [15]

Zur Berechnung des Offset-Vektors muß als erstes der Blickvektor in einen norma- lisierten Blickvektor V konvertiert werden. Die zur Bestimmung der Struktur erfor- derliche Hohe¨ h an der aktuellen Texturkoodinate Told kann dem Height-Field-Image entnommen werden. Welsh verwendet zusatzlich¨ noch einen Skalierungsfaktor s und einen Bias-Wert b um die Werte aus dem Height-Field-Image, die im Wertebereich [0,1] liegen, in einen geeigneteren Wertebereich in Abhangigkeit¨ von der zu texturierenden Flache¨ zu konvertieren. Dabei wird die Hohe¨ h um den Skalierungsfaktor s skaliert, um die Textur an die Große¨ der zu texturierenden Flache¨ anzupassen. Durch den Bias b wird das Height- Field so verschoben, dass der mittlere Hohenwert¨ des Height-Fields in der Oberflachen-¨ ebene liegt. Die neue Hohe¨ hsb berechnet sich wie folgt:

b = −0.5 · s (4.1)

hsb = h · s + b (4.2)

Unter diesen Voraussetzungen kann nun der Offset-Vektor V parallel zur Oberflache¨

21 4.2 Parallax Mapping mit Offset Limiting des Polygons berechnet werden. Durch Addition des Offset-Vektors zur alten Textur- koordinate erhalt¨ man schließlich die neue Texturkoodinate Tnew.

Voffset = hsb · Vx,y/Vz (4.3)

Tnew = Told + Voffset (4.4) Mit Hilfe dieser neu berechneten Texturkoordinate kann nun auf die verschiedenen Texturen, wie die Normal-Map und die regulare¨ Color-Map, zugegriffen werden.

4.2 Parallax Mapping mit Offset Limiting

Offset A Auge Height Map

Polygon

P T_old T_new

Abbildung 4.3: Berechnung des Offsets-Vektors mit Offset Limiting [15]

Normales Parallax Mapping hat das Problem, dass bei flachen Betrachtungswinkeln der Oberflache¨ Artefakte auftreten konnen.¨ Die Berechnung der Verschiebung beim normalen Parallax Mapping erfolgt unter der Annahme, dass die Hohe¨ h an der Po- sition mit der neuen Texturkoordinate Tnew der Hohe¨ an der Position mit der alten Texturkoordinate Told entspricht. Jedoch trifft man diesen Fall in der Realitat¨ außerst¨ selten an. Bei einer Oberflache¨ variiert die Hohe¨ der Struktur in der Regel in kurzen Abstanden¨ voneinander. Schaut der Betrachter die Oberflache¨ aus einem relativ steilen Betrachtungswinkel an, so ergibt sich durch die Berechnung auch nur eine geringe Verschiebung der Tex- turkoordinate. Hierbei ist also mit einer fast identischen Hohe¨ an der Position der neuen Texturkoordinate zu rechnen. Die Annahme einer gleichen Hohe¨ fuhrt¨ jedoch dann zu Problemen bei der Berechnung der Parallaxe, wenn man die Oberflache¨ aus einem flachen Winkel betrachtet. Durch die Berechnung ergibt sich in diesem Fall ein großer Offset-Vektor, der zur Verschiebung der Texturkoordinate dient. Je weiter die neue Texturkoordinate von der alten Texturkoordinate entfernt ist, desto hoher¨ ist auch die Wahrscheinlichkeit, dass an der Position der neuen Texturkoordinate eine andere Hohe¨ eingetragen ist als an der Position der alten Texturkoordinate. Da dies in der Be- rechnung jedoch bisher nicht berucksichtigt¨ wurde, kann sich die Oberflache¨ fur¨ den

22 4.3 Anwendung von Parallax Mapping

Betrachter als ein Durcheinander von verschiedenen Pixelwerten ohne klar erkennbare Struktur darstellen. Zur Korrektur dieses Problems hat Welsh das Parallax Mapping um ein Offset Limit- ing erweitert. Die Idee dabei besteht darin, eine zu weite Verschiebung der Texturko- ordinaten zu verhindern und damit gleichzeitig eine bessere Garantie dafur¨ zu liefern, dass sich der Height-Wert an der Position der neuen Texturkoordinaten nicht wesent- lich von dem Height-Wert an der Position der alten Texturkoordinate unterscheidet. Mit dieser Technik konnen¨ die Artefakte, wie sie beim normalen Parallax Mapping auf- treten, verringert werden. Konkret erreicht Welsh dies, indem er die maximale Verschiebung der Texturkoordi- nate auf eine Lange¨ von hsb begrenzt. Dies wird in der Abbildung 4.3 dargestellt.

Voffset = hsb · Vx,y (4.5)

Tnew = Told + Voffset (4.6) Die Wahl eines anderen Wertes zur Begrenzung der Verschiebung der Texturkoordi- nate ware¨ auch moglich,¨ da es sich bei diesem Ansatz von Parallax Mapping lediglich um eine Approximation der Parallaxe handelt. Es hat sich allerdings herausgestellt, dass sich durch Verwendung des hsb-Wertes gute Ergebnisse erzielen lassen, was den Einsatz dieses Wertes rechtfertigt. Welsh reduziert somit durch seinen Offset Limiting Ansatz den Fehler, der bei der Berechnung der Parallaxe bei flachen Betrachtungswin- keln entsteht.

4.3 Anwendung von Parallax Mapping

Bei Parallax Mapping handelt es sich, genauso wie beim Bump Mapping, um eine sehr schnelle Technik. Die Anzahl der Instruktionen im Vertex- bzw. Fragment-Programm ist bei Parallax Mapping im Vergleich zu Bump Mapping nur geringfugig¨ angestie- gen. Parallax Mapping hat allerdings den entscheidenden Vorteil, dass es die Darstel- lung von Parallax Effekten ermoglicht¨ und dadurch einen realistischeren Eindruck der simulierten Strukturen beim Betrachter hervorruft. Bei sehr flachen Betrachtungswin- keln erscheint die simulierte Geometrie jedoch auch mit der Technik des Parallax Map- ping als zu flach. Daruberhinaus¨ handelt es sich bei Parallax Mapping nur um eine Ap- proximation der tatsachlichen¨ Strukturen. Auffallend sind hierbei auch stufenahnliche¨ Artefakte, die sich teilweise erkennen lassen, wenn die Flache¨ aus einem flachen Win- kel betrachtet wird. Eine Ursache der Artefakte ist sicherlich die Wahl eines zu großen Offset-Vektors. Dieses Problem laßt¨ sich durch Wahl eines geeigneten s-Parameters in Abhangigkeit¨ von der Große¨ der zu texturierenden Flache¨ relativ gut korrigieren. Par- allax Mapping eignet sich jedoch aufgrund der approximierten Berechnung der neu- en Texturkoordinaten genauso wie das Bump Mapping nicht zur Darstellung hochfre- quenter Strukturen mit hoher Amplitude. Auch Selbstverdeckung und -verschattung

23 4.3 Anwendung von Parallax Mapping lassen sich mit dieser Technik nicht darstellen. Die Abbildung 4.4 zeigt die Anwen- dung des Parallax Verfahrens auf dieselbe Steinstruktur, die bereits zur Darstellung von Bump Mapping verwendet wurde.

Abbildung 4.4: Ergebnis des Parallax Mappings

24 5 Displacement Mapping

5.1 Idee von Displacement Mapping

Displacement Mapping ist ein weiteres Verfahren, Oberflachen¨ um detailliertere Struk- turen zu erganzen.¨ Das bereits vorgestellte Parallax Mapping ermoglicht¨ nur die Dar- stellung von groberen¨ Strukturen mit niedriger Frequenz, wahrend¨ es zur Simulation von großen Verschiebungen und Selbstverdeckung ungeeignet ist. Mit Displacement Mapping hingegen laßt¨ sich eine weitaus bessere Darstellung dieser genannten Falle¨ erreichen. So ist es mit Displacement Mapping sogar moglich,¨ schwierige Falle,¨ wie Text, gut darzustellen. Man unterscheidet zwei Arten des Displacement Mappings. Zunachst¨ ware¨ das ech- te Displacement Mapping zu nennen. Displacement Mapping wurde in dieser Form zum ersten Mal 1984 von Cook [2] beschrieben. Hierbei werden die Informationen uber¨ die Struktur der darzustellenden Oberflache¨ einem Height-Field F (u, v) entnom- men. Mit dem aus dem Height-Field gewonnenen Hohenwert¨ h wird nun jeder Ver- tex (x, y, z) der Originaloberflache¨ P (u, v) entlang seiner Normalen Nˆ(u, v) um eben diesen Hohenwert¨ verschoben. Voraussetzung fur¨ dieses Verfahren ist die detaillierte- re Unterteilung des zugrunde liegenden Meshes an den entsprechenden Stellen. Die Geometrie eines Objektes wird hierbei also verandert.¨ Die Abbildung 5.1 stellt diesen Zusammenhang dar.

P' N'

neue h Oberfläche ^ N

P alte Oberfläche

Abbildung 5.1: Idee von Displacement Mapping [3]

P 0(u, v) = P (u, v) + F (u, v) · Nˆ(u, v) (5.1)

25 5.2 View-dependent Displacement Mapping

N(u, v) Nˆ(u, v) = (5.2) |N(u, v)| Obwohl durch die echte Veranderung¨ der Geometrie optimale Ergebnisse im Aus- sehen der Objekte erzielt werden und auch schwierige Falle¨ gut dargestellt werden konnen,¨ bringt diese Vorgehensweise leider einen Nachteil mit sich. Durch die Erzeu- gung von zusatzlichen¨ Vertices bei der Unterteilung des Meshes erhoht¨ sich auch die notwendige Rechenleistung sowie der Speicherverbrauch. Aus diesem Grunde ist ech- tes Displacement Mapping zum Einsatz in einer Echtzeitapplikation wenig geeignet. Eine gute Alternative bietet ein Displacement Mapping Verfahren, welches die Geo- metrie eines Objektes nicht verandert,¨ sondern, ahnlich¨ wie bei Bump Mapping und Parallax Mapping, die strukturierte Oberflache¨ nur simuliert. Der Vorteil des Displa- cement Mapping Verfahrens gegenuber¨ den beiden anderen genannten Verfahren liegt in der genaueren Bestimmung des Schnittpunkt von Oberflache¨ und Blickvektor. Dar- aus ergibt sich eine bessere Visualisierung der zusatzlichen¨ Merkmale der Oberflache.¨ Moglich¨ wird diese genauere Schnittpunktbestimmung durch den Einsatz des Ray- Tracing Verfahrens.

5.2 View-dependent Displacement Mapping

Das View-dependent Displacement Mapping“ von Wang et al. 2003 [14] ist eines derje- ” nigen Verfahrens, welches pixelorientiert arbeitet. Anders als beim klassischen Displa- cement Mapping von Cook, berechnet dieses Verfahren nicht die Abstande¨ entlang der Normalen, sondern mißt den Abstand einer Referenzoberflache¨ entlang der Blickrich- tung zu der zu simulierenden Oberflache.¨ Letztere wird hierbei durch ein Height-Field reprasentiert.¨

26 5.2 View-dependent Displacement Mapping

Blic kr ichtung

V

Referenz- oberfläche P Height- Field h P'

d l

Abbildung 5.2: Displacements mit View-dependent Displacement Mapping [14]

Fur¨ mehrere mogliche¨ Blickrichtungen V , ausgedruckt¨ in spharischen¨ Koordinaten (Θ, φ), wird ein Punkt P auf der Referenzoberflache¨ mit den Texturkoordinaten (x, y) auf den entsprechenden Punkt P 0 der zu simulierenden Oberflache¨ projiziert. Dieser Vorgang wird fur¨ alle Punkte der Referenzoberflache¨ durchgefuhrt.¨ Der Punkt P 0 be- sitzt dabei die Texturkoordinaten (x0, y0). Da P fur¨ verschiedene Blickrichtungen V naturlich¨ auf verschiedene Punkte P 0 auf der zu simulierenden Oberflache¨ projiziert wird, ist der zu speichernde Abstand d abhangig¨ von x, y, Θ, φ. Daruberhinaus¨ beein- flußt auch die Krummung¨ c der Oberflache¨ den projizierten Punkt P 0. Dieser Zusam- menhang wird in Abbildung 5.3 dargestellt.

V0 V0 V1 V1

V2 V2

V3 V3

Vn Vn P P

P' n P'n P' 3 P'3 P'2 P' P' 2 1 P'1 P'0 P'0

Abbildung 5.3: Krummung¨ der Oberflache¨ [14]

Die Funktion zur Bestimmung der Abstande¨ der Referenzoberflache¨ zu der zu simu- lierenden Oberflache¨ hangt¨ also von funf¨ Werten ab: x, y, Θ, φ, c. Deshalb werden die

27 5.3 Per-Pixel Displacement Mapping berechneten Abstande¨ fur¨ jeden gefundenen Schnittpunkt in einer funf-dimensionalen¨ Map abgespeichert. Wird kein Schnittpunkt gefunden, so wird −1 in die Map eingetra- gen. Durch die funf-dimensionale¨ Map ergibt sich allerdings eine hohe Datenmenge, die es zu bewaltigen¨ gilt. Verwendet man zum Beispiel ein Height-Field mit einer Auflo-¨ sung von 128x128, 32x8 Blickrichtungen sowie 16 Krummungswerten¨ so benotigt¨ die Map 64 MB Speicherplatz. Außerdem stellt die hohe Dimensionalitat¨ der Map ein wei- teres Problem dar, weil die Graphikhardware im Allgemeinen auf eine geringere Di- mension beschrankt¨ ist. Deshalb werden die Daten mit SVD1 aufgeteilt und kompri- miert. Mit Hilfe von SVD lasst¨ sich die Dimension reduzieren. Dabei entstehen zwei Maps mit niedrigerer Dimensionalitat.¨ Zum Rendern des Bildes wird die Map im Fragment-Shader wieder dekomprimiert und ausgelesen. So kann der in der Map gespeicherte vorberechnete Abstand nun zur Verschiebung der Texturkoordinaten eingesetzt werden. Durch die funf¨ Dimensionen der Map ist bei diesem Verfahren allerdings ein hoher Aufwand im Vorverarbeitungs- schritt sowie ein allgemein erhohter¨ Speicherbedarf zu erwarten.

5.3 Per-Pixel Displacement Mapping

Ein anderes Verfahren, welches pixelorientiert arbeitet, ist das Per-Pixel Displacement ” Mapping with Distance Functions“ von William Donnely [4]. Anders als beim View- dependent Displacement Mapping wird hier die Technik des Ray-Tracings nicht im Vorverarbeitungsschritt sondern direkt im Fragment-Shader eingesetzt. Mit Hilfe von Ray-Tracing soll bestimmt werden, fur¨ welchen Teil des Bildes welcher Teil der Geometrie sichtbar ist. Normalerweise wird dabei ein Strahl vom Betrachter durch die Geometrie geschickt und in regelmaßigen¨ Abstanden¨ abgetastet, um den Schnittpunkt des Strahls mit der Geometrie zu bestimmen. In diesem speziellen Fall von Displacement Mapping muss man das Height-Field in regelmaßigen¨ Abstanden¨ abtasten, um den Schnittpunkt mit der zu simulierenden Geometrie zu finden, da die Hohenwerte¨ in dem Height-Field die Geometrie simulieren. Hierbei tritt allerdings das Problem des Undersamplings auf. Sofern die Abstande,¨ in denen abgetastet wird, wei- ter als einen Texel voneinander entfernt sind, laßt¨ sich nicht mehr sicherstellen, dass jeder mogliche¨ Schnittpunkt gefunden wird. Durch die so verpassten Schnittpunkte konnen¨ Lucken¨ in der gerenderten Geometrie entstehen und Aliasing Effekte auftreten. Die Abbildung 5.4 zeigt den Effekt von Undersampling. Die grau schattierte Geome- trie wird hierbei vollstandig¨ verpasst. Die triviale Losung¨ ware¨ sicherlich, die Abstande¨ der Abtastung zu verringern. Das so erzwungene Oversampling 5.5 stellt allerdings ei- ne Losung¨ dar, die mit zu hohen Kosten verbunden ist. Daruberhinaus¨ gibt es nicht unbedingt einen einheitlichen Samplingabstand, der fur¨ alle Teile der zu simulieren- den Geometrie geeignet ist. Vielmehr mussen¨ die wahlbaren¨ Abstande¨ in jeder Region neu festgelegt werden, je nachdem wie die zu simulierende Geometrie beschaffen ist.

1singular-value decomposion

28 5.3 Per-Pixel Displacement Mapping

p0

p1

p2

p3

p4

Abbildung 5.4: Undersampling [5]

p0 p1 p2 p3 p4 p5 p6 p7

Abbildung 5.5: Oversampling [5]

Eine gute Losung¨ zu diesem Problem stellt die Verwendung des Konzepts von Sphe- ” re Tracing“ von John Hart [8] dar. Sphere Tracing ist eine geeignete Methode zum Ren- dern von implicit surfaces unter Verwendung des geometrischen Abstands. Die Idee des Sphere Tracings wird in Abbildung 5.6 dargestellt. Hierbei wird ein Strahl vom Punkt p0 aus losgeschickt. Ziel ist es, den nachsten¨ Abstand zu der Geometrie zu fin- den. Da die Richtung des nachsten¨ Abstandes nicht festgelegt ist, bietet sich hierfur¨ eine Kugel an. Um den Abstand zu bestimmen, wird der Radius der Kugel so lan- ge vergroßert,¨ bis ein Schnittpunkt zwischen der Kugel und der Geometrie gefunden wurde. In diesem Fall stellt p1 nun den Schnittpunkt zwischen Kugel und Strahl dar, nachdem der Schnittpunkt zwischen Kugel und Geometrie gefunden wurde. Ausge- hend von p1 kann dieser Vorgang nun so lange wiederholt werden und neue Punkte pi erzeugt werden, bis der Strahl tatsachlich¨ die Geometrie trifft. Dies ist in diesem Beispiel beim Punkt p4 der Fall. Deutlich ist zu erkennen, dass in p4 der Radius einer neuen Kugel den Wert Null annehmen wurde.¨ Der Algorithmus konvergiert fur¨ die- sen Fall. Insgesamt sind in dem gezeigten Beispiel also vier Abtastungen ausreichend, um sicherzustellen, dass kein Schnittpunkt verpasst wird oder ein zu hohes Maß an

29 5.3 Per-Pixel Displacement Mapping

Abtastungen die Rechenzeit erhoht.¨

p0

p1 p2

p3 p4

Abbildung 5.6: Sphere Tracing [4]

Dieses Konzept wird zur Berechnung einer Distance-Map im Fall von Displacement Mapping genutzt. Dabei wird fur¨ jeden Punkt p im Texture-Space und eine Oberflache¨ S eine Funktion wie folgt definiert:

dist(p, S) = min {d(p, q): q in S} (5.3) Diese Funktion liefert als Ergebnis die kleinste Distanz von dem Punkt p zur Ober- flache¨ S. Diese Distanz kann nun in einer drei-dimensionalen Distance-Map abgespei- chert werden. Das genaue Vorgehen zur Erstellung einer Distance-Map wird im nach-¨ sten Kapitel erlautert.¨ Mit Hilfe der in der Distance-Map abgespeicherten Distanzen konnen¨ wir die Abtastung des Height-Fields optimieren. Dabei existiert ein Strahl mit einem Ausgangspunkt p0 und einer normalisierten Richtung d. Nun kann der neue Punkt auf dem Strahl, an dem auch das Height-Field abgetastet werden muss, durch folgende Berechnung bestimmt werden:

p1 = p0 + dist(p0,S) · d (5.4)

Ausgehend von der Bedingung, dass p0 außerhalb der Geometrie liegt, liegt auch p1 außerhalb der Geometrie. Durch eine iterative Anwendung der Gleichung 5.4 und eine geeignete Anzahl der Iterationen kann der endgultige¨ Schnittpunkt des Strahls mit der Geometrie bestimmt werden. Mit diesem genauen Schnittpunkt laßt¨ sich die darzustellende Oberflache¨ viel genauer simulieren als es beispielsweise beim Parallax Mapping, welches nur eine Approximation des Schnittpunktes berechnet, der Fall ist.

30 5.4 Erstellung einer Distance-Map

5.4 Erstellung einer Distance-Map

Die Berechnung der Distance-Map im 3D basiert auf dem 4SED Algorithmus von Da- nielsson [11] zur Berechnung einer 2D-Distance-Map. Dieser Algorithmus hat einen Aufwand von O(n), wobei n die Anzahl der Pixel in der 2D-Map ist. Um den Algorith- mus im 3D nutzen zu konnen,¨ wird er noch entsprechend erweitert.

1 3 4 4 2 5 5 4 4 2 2 1 1

1D Height-Field 2D Distance Map

Abbildung 5.7: Erstellung einer 2D-Distance-Map [4]

Zunachst¨ ist es erforderlich, die zu erstellende 3D-Distance-Map zu initialisieren. Die Initialisierung erfolgt in Abhangigkeit¨ von dem gewahlten¨ Height-Field F . Die 3D- Distance-Map sei im folgenden mit D bezeichnet. Die 3D-Distance-Map wird nun in z-Richtung durchlaufen. Ist der aktuelle z-Wert kleiner als der Hohenwert,¨ der in dem Height-Field eingetragen ist, so wird die Distance-Map an dieser Stelle mit 0 initiali- siert. Die Hohenwerte¨ des Height-Fields bilden so die zu simulierende strukturierte Oberflache.¨ Der Vorstellung nach befinden sich also alle Voxel, die einen kleineren z- Wert als den Hohenwert¨ des Height-Fields an der entsprechenden Position haben, un- terhalb der zu simulierenden strukturierten Oberflache.¨ Ihre Distanz ist somit immer 0. Ist der Hohenwert¨ aus dem Height-Field jedoch großer¨ als der z-Wert an der aktuellen Position in der Distance-Map, so wird an dieser Stelle der Distance-Map zur Initialisie- rung eine maximale Distanz Z eingetragen. for a l l x for a l l y for a l l z D(x,y,z) = (0,0,0) i f z <= F ( x , y ) D(x,y,z) = (Z,Z,Z) i f z > F ( x , y ) Listing 5.1: Initialization [11][4]

Im Anschluß an die Initialisierung der notwendigen Bereiche mit der maximalen Di- stanz kann nun in einem ersten Scan-Schritt begonnen werden, die richtigen Distanzen von jedem Voxel in der 3D-Distance-Map zur simulierten Oberflache¨ zu berechnen. Das Verfahren pruft¨ hierbei, wie weit jeder Voxel der Distance-Map, sowohl in x-, in y- als

31 5.4 Erstellung einer Distance-Map auch in z-Richtung von der simulierten Oberflache¨ entfernt ist. Die berechneten Distan- zen werden in jedem Voxel der Distance-Map fur¨ alle drei Richtungen eingetragen. Im folgenden Pseudo-Code sei die Breite des Height-Fields durch width“ und die Lange¨ ” des Height-Fields durch height“ bezeichnet. Außerdem existiert eine wahlbare¨ Tiefe ” depth“ der Distance-Map. Ohne diesen selbst gewahlten¨ Tiefenwert wurde¨ automa- ” tisch eine Distance-Map angelegt, deren Tiefe dem maximal moglichen¨ Hohenwert¨ im Height-Field entspricht. Da das Height-Field im Prinzip ein Graustufenbild ist, ware¨ die ubliche¨ Tiefe der Distance-Map 255. Eine Distance-Map dieser Große¨ ist jedoch auf- grund des großen Speicherverbrauchs problematisch. Deshalb reduziert man die Tiefe, wobei sich der Wert 16 relativ gut eignet. for z=1,2, ... depth for y=0,1, ... height −1 D(x,y,z) = min( D(x,y,z), D( x , y , z−1) + (0,0,1))

for y = 1,2, ... height −1 for x = 0,1, ... width−1 D(x,y,z) = min( D(x, y, z), D( x , y−1, z) + (0, 1, 0))

for x = 1,2, ... width−1 D(x,y,z) = min( D(x, y, z), D( x−1, y, z) + (1, 0, 0))

for x = width −2, width −3, . . . 0 D(x,y,z) = min( D(x, y, z), D(x+1, y, z) + (1,0, 0))

for y = height −2, height −3, . . . 0 for x = 0,1, ... width−1 D(x,y,z) = min( D(x, y, z), D(x, y+1, z) + (0, 1, 0))

for x = 1,2, ... width−1 D(x,y,z) = min( D(x, y, z), D( x−1, y, z) + (1, 0, 0))

for x = width −2, width −3, . . . 0 D(x,y,z) = min( D(x, y, z), D(x+1, y, z) + (1,0, 0)) Listing 5.2: First Picture Scan [11][4] Nach diesem ersten Durchlauf erhalt¨ man bereits Distanzen fur¨ jede der drei mogli-¨ chen Richtungen. Allerdings stimmen diese Distanzen nur fur¨ die gerade gewahlte¨ z- Richtung. Um die vollstandig¨ richtigen Distanzen zu berechnen, muss die Distance-

32 5.4 Erstellung einer Distance-Map

Map noch einmal in der anderen z-Richtung durchlaufen werden. Dies geschieht im folgenden zweiten Scan-Schritt. for z=depth −2, depth −3, . . . 0 for y=0,1, ... height −1 D(x,y,z) = min( D(x,y,z), D(x,y,z+1) + (0,0,1))

for y = 1,2, ... height −1 for x = 0,1, ... width−1 D(x,y,z) = min( D(x, y, z), D( x , y−1, z) + (0, 1, 0))

for x = 1,2, ... width−1 D(x,y,z) = min( D(x, y, z), D( x−1, y, z) + (1, 0, 0))

for x = width −2, width −3, . . . 0 D(x,y,z) = min( D(x, y, z), D(x+1, y, z) + (1,0, 0))

for y = height −2, height −3, . . . 0 for x = 0,1, ... width−1 D(x,y,z) = min( D(x, y, z), D(x, y+1, z) + (0, 1, 0))

for x = 1,2, ... width−1 D(x,y,z) = min( D(x, y, z), D( x−1, y, z) + (1, 0, 0))

for x = width −2, width −3, . . . 0 D(x,y,z) = min( D(x, y, z), D(x+1, y, z) + (1,0, 0)) Listing 5.3: Second Picture Scan [11][4] for z = 0,1, ... depth for y = 0,1, ... height −1 for x = 0,1, ... width−1 value= length(D(x,y,z)) i f ( value > depth) value = depth D(x,y,z) = value Listing 5.4: Final Distance-Map [4] Fur¨ die Berechnung der Distance-Map mit Hilfe des Algorithmus war es notwen- dig jeweils drei Distanz-Werte in jedem Voxel zu speichern. So konnte konkret die je- weilige Distanz in x- in y- und in z-Richtung ermittelt werden. Da der verwendete

33 5.5 Rendern des Bildes mit Per-Pixel Displacement Mapping

Ansatz auf Sphere-Tracing beruht, reicht es fur¨ die finale 3D-Textur, in der die Distanz- Informationen gespeichert werden, nur einen Wert je Voxel abzuspeichern. Dieser Di- stanz-Wert entspricht dem Radius der Kugel von der aktuellen Position zum nachstge-¨ legenen Punkt auf der zu simulierenden Oberflache.¨

5.5 Rendern des Bildes mit Per-Pixel Displacement Mapping

5.5.1 Der Vertex-Shader

Der Vertex-Shader fur¨ das Displacement Mapping ist hauptsachlich¨ fur¨ die Transfor- mation bestimmter Vektoren in den Texture-Space zustandig.¨ Anders als beim Nor- mal Mapping wird beim Displacement Mapping zusatzlich¨ zum Lichtvektor auch der Blickvektor in den Texture-Space konvertiert. Notwendig ist dies, weil der Blickvektor als Richtung des Strahls verwendet wird, welcher im Texture-Space zur Bestimmung des Schnittpunkts mit der Geometrie verwendet wird. Daruberhinaus¨ wird ein Skalie- rungsfaktor s verwendet, welcher umgekehrt proportional zu der zu erwartenden Tiefe der Struktur ist. Somit kann die Starke¨ des Displacement-Effekts an die Große¨ der ver- wendeten zu texturierenden Flache¨ angepasst werden. Erreichen laßt¨ sich dieser Effekt konkret durch Multiplikation der z-Komponente des Blickvektors im Texture-Space mit dem genannten Faktor s.

5.5.2 Der Fragment-Shader

Im Fragment-Shader wird als erstes die Richtung des Strahls, in diesem Fall des Blick- vektors, normalisiert. Hierbei reicht eine einfache Normalisierung auf die Lange¨ von eins jedoch noch nicht aus. Es ist zu beachten, dass die Abstande¨ in der Distance-Map in Pixeln gespeichert werden, der Blickvektor jedoch in der Einheit von Texturkoor- dinaten angegeben ist. Ublicherweise¨ hat man die Tiefe der Distance-Map auf einen niedrigeren Wert als die Breite und Hohe¨ der Map beschrankt,¨ zum Beispiel auf 16. So stellt man sicher, dass die Rechenzeit und der Speicherverbrauch nicht zu stark an- steigt. Gleichzeitig erhalt¨ man dadurch jedoch auch unterschiedliche Einheiten fur¨ den Blickvektor und die Distance-Map. Da der Blickvektor jedoch in einem spateren¨ Ray- Marching Schritt zum Abtasten der Distance-Map zum Einsatz kommen soll, muss er in der Einheit der Distance-Map angegeben werden. Um dies zu erreichen, benotigt¨ man den folgenden Normalisierungsfaktor:

 depth/width  Normalisierungsfaktor =  depth/height  (5.5) 1 Die verwendeten Großenangaben¨ beziehen sich auf die Distance-Map. Durch Multi- plikation des Normalisierungsfaktors mit dem Blickvektor erhalt¨ man einen Blickvek- tor, welcher in der Einheit der Distance-Map angegeben ist. Dieser Vektor kann nun fur¨ das folgende Ray-Marching verwendet werden.

34 5.5 Rendern des Bildes mit Per-Pixel Displacement Mapping

Mit Hilfe des Ray-Marchings soll der Schnittpunkt des Blickvektors mit der zu si- mulierenden Geometrie gefunden werden. Zunachst¨ wird die Distance-Map am Start- punkt des Strahls abgefragt. Der so erhaltene Wert, distance, ist der Abstand, in dem garantiert keine Schnittpunkte des Strahls mit der Geometrie vorliegen. Geht man den normalisierten Strahl, offset, um den angegeben Abstand entlang, so erhalt¨ man einen neuen Punkt außerhalb der Geometrie. Ausgehend von diesem Punkt kann das be- schriebene Verfahren nun iterativ durchgefuhrt¨ werden. Dabei nahert¨ man sich in im- mer kurzer¨ werdenden Intervallen dem Schnittpunkt des Strahls mit der Geometrie immer weiter an. Ist der Schnittpunkt gefunden, so konvergiert das Verfahren. Voraus- setzung dafur¨ ist die Wahl einer geeigneten Anzahl an Iterationen. for ( i n t i = 0 ; i < NUM ITERATIONS ; i ++) { f l o a t distance = f1tex3D (distanceTex , texCoord); texCoord += distance ∗ o f f s e t ; } Listing 5.5: Ray-Marching [4]

Mit den Texturkoordinaten des so gefundenen Schnittpunktes konnen¨ wir die Nor- male aus der Normal-Map auslesen und zur Beleuchtung verwenden. In die Beleuchtungsberechnung wird auch ein Term fur¨ die Selbstverschattung mit einbezogen. Dieser Term besagt, ob das zu beleuchtende Fragment von einem anderen Teil der simulierten Geometrie verdeckt wird. Ist dies der Fall, so wird das Fragment entsprechend abgedunkelt.

5.5.3 Selbstverschattung

Die Selbstverschattung ist eine geeignete Moglichkeit,¨ den bereits erzielten Tiefenein- druck noch zu unterstutzen¨ und damit den allgemeinen Realitatsgrad¨ der simulier- ten Oberflache¨ zu erhohen.¨ Das bisher vorgestellte Verfahren des Displacement Map- pings laßt¨ sich um eine Berechnung zur Erzeugung von Selbstverschattung erganzen.¨ In der Abbildung 5.8 wird das Verfahren der Selbstverschattung dargestellt. Die Idee der Selbstverschattung besteht darin, einen Test durchzufuhren,¨ der ergibt, ob der neu berechnete Punkt P 0 auf der simulierten Oberflache¨ Licht von der Lichtquelle erhalt¨ oder im Schatten anderer simulierter Geometrie liegt.

35 5.5 Rendern des Bildes mit Per-Pixel Displacement Mapping

Eye

EV ec Light Offset ec Referenz- LV oberfläche P L Height- L' Field h

P'

Abbildung 5.8: Selbstverschattung [14]

Zur Durchfuhrung¨ dieses Test ist es erforderlich, den Lichtvektor auf Schnittpunkte mit der simulierten Geometrie zu testen. Dazu muss zunachst¨ die Texturkoordinate fur¨ den Schnittpunkt L des Lichtvektors LV ec mit der originalen Geometrie bestimmt wer- den. Ahnlich¨ wie beim Parallax Mapping kann diese Texturkoordinate durch Addition eines Offset-Vektors zur Texturkoordinate der aktuellen Position P 0 in der simulierten Geometrie berechnet werden. Fur¨ diese Berechnung ist es erforderlich, die Lange¨ von h zu kennen.

h = 1 − Z (5.6) Bei dem Wert Z handelt es sich hier um den z-Wert der Texturkoordinate von P 0. Anschließend laßt¨ sich der Offset berechnen:

offset = h · LV ecxy/LV ecz (5.7) Der Lichtvektor wird hierbei durch den LV ec angegeben. Es ist zu beachten, dass der Lichtvektor fur¨ alle Berechnungen unter Verwendung eines Normalisierungsfaktors in die Einheit der Textur konvertiert werden muss. Hierbei kann der gleiche Normali- sierungsfaktor verwendet werden, der bereits zur Konvertierung des Blickvektors zum Einsatz kam. Die benotigte¨ Texturkoordinate fur¨ den Schnittpunkt L kann nun wie folgt bestimmt werden:

 0  TPx + offsetx 0 TL =  TPy + offsety  (5.8) 1 Mit Hilfe der neu berechneten Texturkoordinate fur¨ den Punkt L und dem Lichtvek- tor LV ec kann nun ein weiterer Ray-Marching Schritt zur Bestimmung eines mogli-¨ chen Schnittpunkts L0 mit der simulierten Geometrie ausgefuhrt¨ werden. Existiert ein solcher Schnittpunkt L0, so wird er mit dem Punkt P 0 auf Gleichheit uberpr¨ uft.¨ Da es

36 5.5 Rendern des Bildes mit Per-Pixel Displacement Mapping immer zu einer gewissen Ungenauigkeit kommen kann, wird beim Test auf Gleichheit ein Epsilon-Faktor miteinbezogen. Fur¨ den Fall, dass P 0 und L0 verschieden sind, liegt P 0 im Schatten. Das entsprechende Fragment wird dann bei der Beleuchtung abgedun- kelt. Liegt bei P 0 und L0 jedoch Gleichheit vor, so befindet sich P 0 nicht im Schatten und kann normal beleuchtet werden. [14]

5.5.4 Filterung

Bei der Mipmap-Filterung bzw. der anisotropen Filterung der Textur konnen¨ bei Ver- wendung der neu berechneten Texturkoordinaten fur¨ die simulierte Geometrie Proble- me auftreten. Die verschobenen Texturkoordinaten konnen¨ Unstetigkeiten enthalten, welche aus Verdeckungen von simulierter Geometrie in der Textur resultiert. So wer- den zwei benachbarten Pixeln moglicherweise¨ zwei weit voneinander entfernt liegende Bereiche aus der Textur zugeordnet. Aktiviert man Mipmapping oder anisotrope Filte- rung so benotigt¨ die GPU Informationen uber¨ die Ableitungen der Texturkoordinaten. Normalerweise approximiert die GPU diese Ableitungen durch finite Differenzen. Da finite Differenzen bei Unstetigkeiten jedoch inkorrekte Werte der Ableitungen errech- nen, ergibt sich daraus auch die Wahl eines falschen Mipmap-Levels. Somit konnen¨ sichtbare Rander¨ im dargestellten Bild entstehen, wenn Unstetigkeiten in den Textur- koordinaten auftreten. Um diesen Effekt zu verhindern, berechnet man die Ableitungen mit Hilfe der un- veranderten¨ Texturkoordinaten. Moglich¨ ist dieses Vorgehen, weil die veranderten¨ Tex- turkoordinaten in der Theorie auch stetig sind. Lediglich bei unterschiedlichen Be- trachtungswinkeln kann es zu Verdeckungen und somit zu Unstetigkeiten kommen. Daruberhinaus¨ variieren die verschobenen Texturkoordinaten bezogen auf den theore- tisch korrekten Fall in ahnlicher¨ Weise zwischen zwei Pixeln wie es bei den originalen Texturkoordinaten auch der Fall ist. Mit Hilfe der Ableitungen der unveranderten¨ Tex- turkoordinaten kann der Mipmap-Level beim Zugriff auf die Normal- und die Color- Map anschließend korrekt gewahlt¨ werden. Das funktioniert, da die Ableitungen der originalen Texturkoordinaten die Ableitungen der verschobenen Texturkoordinaten re- lativ gut annahern.¨ Der Einsatz von Mipmapping bei einer Distance-Map erscheint als ungeeignet, da fur¨ einen entsprechend kleinen Mipmap-Level nur Mittelwerte in der Distance-Map ge- speichert sind. Zur genauen Darstellung der zu simulierende Strukturen werden jedoch genaue Werte benotigt.¨ Daruberhinaus¨ kann es durch Unstetigkeiten in den verander-¨ ten Texturkoordinaten zur Wahl eines zu groben Mipmap-Levels kommen. Hieraus er- geben sich Probleme bei der Auswertung der Distance-Map. Aus diesen Grunden¨ wird die Distance-Map ohne Mipmapping gefiltert. Hieraus entstehende Aliasing-Effekte sind allerdings nicht auf das Fehlen von Mipmapping zuruckzuf¨ uhren,¨ da die Distanz- Werte nie direkt visualisiert werden, sondern nur bei der Generierung der verschobe- nen Texturkoordinaten zum Einsatz kommen. [4] Zum Vergleich der unterschiedlichen Filterungsmoglichkeiten¨ fur¨ ein mit Displace- ment Mapping dargestelltes Objekt werden hier drei Abbildungen gezeigt. Bei allen

37 5.5 Rendern des Bildes mit Per-Pixel Displacement Mapping drei Bildern wird eine sehr klein strukturierte Farbtextur verwendet. Das erste Bild 5.9 wurde ohne Mipmapping und anisotrope Filterung erstellt. Deutlich sind bei dem hieraus entstandenen Bild die Artefakte zu erkennen, sobald das entsprechende Objekt sich weiter vom Betrachter entfernt.

Abbildung 5.9: Ohne Filterung

(a) Mit GPU-Ableitung (b) Mit eigener Ableitung

Abbildung 5.10: Mipmapping und Anisotrope Filterung

38 5.6 Anwendung von Per-Pixel Displacement Mapping

Zur Erstellung des zweiten Bildes 5.10 kamen Mipmapping sowie anisotrope Filte- rung zum Einsatz. Allerdings wurde zur Wahl des Mipmap-Levels die intern von der GPU berechnete Ableitung gewahlt.¨ Bei dem Ergebnisbild laßt¨ sich gut erkennen, dass der Mipmap-Level an denjenigen Stellen, an welchen die Distance-Map flach ist, kor- rekt gewahlt¨ wurde, so dass keine Artefakte auftreten. Im Gegensatz dazu sind jedoch an den durch Displacement Mapping veranderten¨ Bereichen deutliche Artefakte zu er- kennen. Die Ursache dieser Artefakte ist durch die Unstetigkeiten in den durch Displa- cement Mapping veranderten¨ Texturkoordinaten, welche zur internen Berechnung der Ableitung durch die GPU verwendet werden, und dem daraus resultierenden falsch gewahltem¨ Mipmap-Level zu erklaren.¨ Bei der dritten Abbildung 5.10 hingegen wurden zur Wahl des Mipmap-Levels die eigenen mit Hilfe der unveranderten¨ Texturkoordinaten berechneten Ableitungen ein- gesetzt. Auf diesem Bild sind nun keine Artefakte durch Schwierigkeiten beim Mip- mapping oder der anisotropen Filterung mehr zu erkennen.

5.6 Anwendung von Per-Pixel Displacement Mapping

Das Verfahren des Per-Pixel Displacement Mappings ermoglicht¨ im Vergleich zu Bump Mapping und Parallax Mapping eine deutlich verbesserte Darstellung der einzelnen Strukturen. Da es sich bei der Technik des Per-Pixel Displacement Mappings nicht, wie bei Parallax Mapping, um eine Approximation handelt, lassen sich mit diesem Verfah- ren auch hochfrequente Strukturen mit hoher Amplitude darstellen. Daruberhinaus¨ er- zielt Displacement Mapping auch fur¨ flachere Betrachtungswinkel noch einen hoheren¨ Realitatsgrad¨ als beispielsweise Parallax Mapping. Die Moglichkeit,¨ Selbstverdeckung und - verschattung darzustellen, ist hierbei sicherlich ein wichtiger Faktor. Somit laßt¨ sich mit Per-Pixel Displacement Mapping eine Struktur ideal simulieren. Eingeschrankt¨ wird die Qualitat¨ der Darstellung jedoch dadurch, dass der Algorith- mus des Per-Pixel Displacement Mappings keine Darstellung von Silhouetten ermog-¨ licht. Außerdem ist dieser Algorithmus fur¨ planare Flache¨ konzipiert, weshalb es zu Verzerrungen kommen kann, wenn das Verfahren auf Oberflachen¨ mit einer hohen Krummung¨ angewandt wird. [4] Die Abbildung 5.11 zeigt die Anwendung von Displacement Mapping auf die bereits bekannte Steinstruktur. Zur Demonstration von Displacement Mapping bei schwieri- geren Fallen,¨ in denen Techniken wie Bump Mapping oder Parallax Mapping schon erhebliche Defizite aufweisen, dient die Abbildung 5.12, welche den Einsatz von Dis- placement Mapping zur Visualisierung von Text zeigt.

39 5.6 Anwendung von Per-Pixel Displacement Mapping

Abbildung 5.11: Ergebnis des Displacement Mappings: Steine

Abbildung 5.12: Ergebnis des Displacement Mappings: Text

40 6 Die Beispielszene

6.1 Modellierung der Szene

Eine geeignete Beispielszene zur Demonstration und zum Vergleich von Bump Map- ping, Parallax Mapping und Displacement Mapping wurde mit Hilfe der Software Maya erstellt. Bei Maya, entwickelt von der Firma Alias, handelt es sich um eine 3D Modellierungs- und Animationssoftware, die unter anderem in der Filmindustrie und in der Computerspieleindustrie eingesetzt wird.

Abbildung 6.1: Modellierte Beispielszene

Die Szene wurde komplett aus Polygonen erstellt. Da der verwendete Ansatz des Displacement Mappings am besten fur¨ planare Flachen¨ angewandt werden kann, wur- de weitestgehend auf gekrummte¨ Oberflachen¨ fur¨ Displacement Mapping Objekte ver- zichtet. Modelliert wurde ein Innenhof. Hierbei bieten sich vielfaltige¨ Moglichkeiten¨ zur Anwendung von Displacement Mapping. Die Wande¨ sowie der Fußboden, welche jeweils durch eine einflache Plane realisiert wurden, lassen sich mit dem Verfahren des Displacement Mappings mit unterschiedlichen Steinstrukturen versehen. Da die einzel-

41 6.2 VRML nen Steine nicht ausmodelliert werden mussen,¨ wird die Anzahl der Dreiecke deutlich reduziert. Auch laßt¨ sich mit Hilfe des Displacement Mappings ein besserer Tiefenef- fekt bei den Steinstrukturen erzielen, als es zum Beispiel mit Bump Mapping moglich¨ ist. Daruberhinaus¨ finden sich Anwendungsmoglichkeiten¨ fur¨ Displacement Mapping bei der Tur,¨ welche ebenfalls nur aus einer einfachen Plane modelliert ist und sich mit Hilfe von Displacement Mapping mit Strukturen versehen laßt.¨ Die Darstellung von Text wird in dieser Szene anhand eines Schildes demonstriert. Da das Verfahren des Per-Pixel Displacement Mappings keine Darstellung von Sil- houetten ermoglicht,¨ musste bei der Modellierung auf eine geeignete Wahl der Geome- trie geachtet werden. Fur¨ einen realistischeren Eindruck war es erforderlich die Rand- bereiche der einzelnen Flachen,¨ auf welche Displacement Mapping angewandt wurde, zu verdecken. Hierzu bot sich weitere Geometrie an. Am Beispiel der einzelnen Wande¨ dienen großere¨ Steine an den Kanten der Flachen¨ zur Verdeckung der Randbereiche. Im Anschluss an die Modellierung wurde die Szene entsprechend texturiert. In ei- nem abschließenden Schritt konnten zur Beleuchtung der Szene nun Lichtquellen wie Directional Light, Spot Light und Point Light gesetzt werden. Die Abbildung 6.1 zeigt die modellierte Szene ohne Anwendung von Shadern. Die Darstellung der Szene unter Verwendung von Shadern wird dagegen im Kapitel 7 gezeigt.

6.2 VRML

Im Anschluß an die Modellierung muß die erstellte Szene in das eigene Demonstrations- Programm importiert werden. Zum Austausch der Daten bietet sich das VRML-Datei- format 1 an. VRML ist ein Standard zur Beschreibung von 3D-Szenen und wurde ur- sprunglich¨ fur¨ die Nutzung im Internet entwickelt. Im Jahr 1994 wurde die erste Ver- sion von VRML auf der Basis des Open Inventor Dateiformats von Silicon Graphics (SGI) entwickelt. Mit VRML 1.0 lassen sich statische 3D-Szenen beschreiben. Anima- tionen der Objekte oder umfassende Moglichkeiten¨ zur Interaktion wurden in dieser Version noch nicht zur Verfugung¨ gestellt. Eine Verbesserung stellt hier die Version VRML 2.0 dar, welche 1996 auf der SIGGRAPH vorgestellt wurde. Im Jahr 1997 wurde VRML 2.0 als VRML97-ISO 14772 Standard festgeschrieben. VRML 2.0 basiert auf der Sprache Moving Worlds von Silicon Graphics. Im Gegensatz zu VRML 1.0 werden in dieser Version auch Moglichkeiten¨ zur Animation und zur Interaktion mit den Objek- ten zu Verfugung¨ gestellt. Der Nutzer hat nun die Moglichkeit,¨ in einer VRML-Datei einzelnen Objekte anzuklicken und somit festgelegte Aktionen auszulosen¨ oder in an- dere VRML-Welten zu gelangen. Da viele 3D-Modellierungstools auch Moglichkeiten¨ zum Import und Export von VRML-Szenen bereitstellen, kann VRML auch zum Austausch von Daten zwischen den einzelnen Anwendungen genutzt werden. Dabei bietet das Format unter anderem Moglichkeiten¨ um Objekte, Transformationen und Hierarchien, Lichtquellen, Materia- lien und Texturen zu beschreiben. [7]

1Virtual Reality Modeling Language

42 6.2 VRML

Maya stellt einen integrierten VRML-Exporter zur Verfugung.¨ Zum Import der Daten wurde ein eigener VRML Importer implementiert. Der Importer verfugt¨ uber¨ Funktio- nen zum Import der Punkte, Normalen und Texturkoordinaten der Objekte. Daruber-¨ hinaus ist der Import der verwendeten Materialien, Lichtquellen sowie der verwende- ten Farbtextur moglich.¨ Auch die Hierarchie der modellierten Objekte mit den Trans- formationen laßt¨ sich importieren. Eine explizite Unterstutzung¨ von Shadern ist in VRML nicht integriert. Aus diesem Grund mussten die verwendeten Shader fur¨ die modellierte Szene auf anderem We- ge in die VRML-Datei integriert werden. Hierzu bot der Materialname eine geeigne- te Moglichkeit.¨ So wird bei der Erstellung des Materials in Maya der Name des ver- wendeten in den Materialnamen des Objektes integriert. Im Demonstrations- Programm werden mit Hilfe dieser Information der entsprechende Shader angebunden und die eingelesenen Materialeigenschaften verwendet.

43 7 Ergebnisse

Beim Rendern der modellierten Beispielszene 7.1 kommen die bereits vorgestellten Sha- der fur¨ Bump Mapping, Parallax Mapping sowie Displacement Mapping zum Einsatz. Zum Vergleich der einzelnen Shader wurde die Szene zunachst¨ nur mit Bump Mapping gerendert. Beim zweiten Rendering der Szene wurde sowohl Bump Mapping als auch Parallax Mapping zur Verbesserung der Oberflachenstruktur¨ der Objekte verwendet. Im dritten Test hingegen wurden Bump Mapping und Displacement Mapping einge- setzt.

Abbildung 7.1: Gerenderte Beispielszene

Wie bereits in den Abschnitten 3.5, 4.3 und 5.6 beschrieben, lassen sich deutliche Un- terschiede in der Darstellungsqualitat¨ der einzelnen Verfahren erkennen. Durch den Einsatz von Bump Mapping laßt¨ sich die Darstellung der Oberflachenstruktur¨ im Ver- gleich zum normalen Texture Mapping verbessern, jedoch ist diese Technik haupt- sachlich¨ zur Simulation feiner Strukturen geeignet. Zur Simulation groberer¨ Struktu- ren, wie zum Beispiel den Steinen der Wand oder des Bodens in Abbildung 7.2, er- scheint diese Technik als weniger geeignet, da hier keine deutliche Verbesserung der Oberflachenstruktur¨ beobachtet werden kann.

44 7 Ergebnisse

(a) Bump Mapping

(b) Parallax Mapping

(c) Displacement Mapping

Abbildung 7.2: Vergleich der verschiedenen Verfahren

45 7 Ergebnisse

Die entsprechenden Strukturen wirken unter Bump Mapping relativ flach. Außer- dem beinhaltet das Verfahren keine Selbstverdeckung und Selbstverschattung der si- mulierten Strukturen. Parallax Mapping stellt hier eine Verbesserung bei der Simulation groberer¨ Ober- flachenstrukturen¨ im Vergleich zum Bump Mapping dar. Diese Technik berucksichtigt¨ die Parallaxe und ermoglicht¨ so einen besseren Tiefeneindruck. Allerdings eignet sich dieses Verfahren, ebenso wie Bump Mapping, nicht zur Betrachtung der entsprechen- den Objekte aus einem flachen Winkel. Daruberhinaus¨ stellt auch diese Technik keine Selbstverdeckung und Selbstverschattung zur Verfugung.¨ Die Probleme von Bump Mapping und Parallax Mapping bei der Simulation grobe-¨ rer Oberflachenstrukturen¨ lassen sich durch Einsatz des Displacement Mapping Ver- fahrens vermeiden. Mit Hilfe von Displacement Mapping sind selbst hochfrequente Strukturen mit hoher Amplitude gut darstellbar. Sogar aus einem relativ flachen Be- trachtungswinkel sind die Strukturen noch gut zu erkennen. Außerdem ermoglicht¨ diese Technik die Selbstverdeckung und Selbstverschattung der simulierten Struktu- ren. Hierdurch gewinnt der Betrachter einen realistischeren Eindruck von der Ober- flachenstruktur.¨ Anhand einzelner Ausschnitte der Szene lassen sich die Unterschiede zwischen den einzelnen Verfahren gut erkennen. So ist bei der Darstellung der Wand in Abbildung 7.2 mit Hilfe von Bump Mapping aus einem flachen Betrachtungswinkel keine deut- liche Struktur zu sehen. Dennoch eignet sich Bump Mapping in diesem Beispiel zur Simulation der feineren Strukturen, wie es zum Beispiel an der Steinstruktur am Stein- bogen des Kellerfensters deutlich wird. Die Darstellung der groberen¨ Strukturen hin- gegen kann durch den Einsatz von Parallax Mapping leicht verbessert werden. Erst mit Displacement Mapping jedoch sind die groben Steinstrukturen, sowie die Struktur der Metallplatte und des Kellerfensters deutlich zu erkennen. Anhand von weiteren Beispielen sind die verschiedenen Einsatzmoglichkeiten¨ des Displacement Mappings zu erkennen. So lassen sich neben den Strukturen der Wand und des Bodens auch die Strukturen des Fensters, der Fensterladen¨ und der Metallplat- te, Abbildung 7.3, gut darstellen. Selbst Text, wie in Abbildung 7.3 gezeigt, stellt kein Problem fur¨ Displacement Mapping dar.

46 7 Ergebnisse

(a) Fenster

(b) Schild

(c) Metallplatte

Abbildung 7.3: Ergebnisse des Displacement Mappings im Detail

47 7 Ergebnisse

Der vorgestellte Algorithmus des Per-Pixel Displacement Mappings bringt jedoch auch einige Probleme bei der Darstellung von Objekten in einer Szene mit sich. Das Hauptproblem ist sicherlich das Fehlen der Silhouetten. An den Kanten eines Objektes wird somit deutlich, dass es sich bei diesem Verfahren nur um eine Simulation handelt. Diesem Problem kann jedoch durch eine geeignete Modellierung der Szene begegnet werden. Dazu mussen¨ samtliche¨ Kanten derjenigen Objekte, bei denen Displacement Mapping zum Einsatz kommt, durch andere Objekte verdeckt werden. Dies geschieht in der vorgestellten Szene zum Beispiel durch die Steinbalken in den Ecken zwischen den einzelnen Steinwanden.¨

Abbildung 7.4: Gullideckel

Ein weiteres Problem beim Einsatz von Displacement Mapping in Kombination mit mehreren Objekten laßt¨ sich am Beispiel der Abbildung 7.4 beobachten. Hier sieht es so aus, als wurde¨ der Gullideckel uber¨ dem Boden, welcher mit Displacement Mapping dargestellt wird, schweben. Dieses Problem ergibt sich aus der Berechnung des Displa- cement Mappings. Die Ausgangsflache,¨ in diesem Fall eine einfache Flache¨ fur¨ den Bo- den, wird als Referenzoberflache¨ fur¨ das Displacement Mapping angesehen. Unter die Referenzoberflache¨ wird das Heightfield gelegt. Bei der anschließenden Berechnung zur Simulation der Strukturen mit Hilfe von Sphere Tracing wird vorausgesetzt, dass der hochste¨ Punkt der jeweiligen Struktur stets auf der Hohe¨ der Referenzoberflache¨ liegt. Alle anderen Strukturmerkmale liegen unterhalb dieser Referenzoberflache.¨ So- mit entsteht der Eindruck, als wurde¨ ein Objekt, welches sich uber¨ einem mit Displace- ment Mapping dargestelltem Objekt befindet, uber¨ diesem schweben. Zur Losung¨ die- ses Problems mussten¨ samtliche¨ Displacement Objekte, sobald sie von einem anderen Objekt uberlagert¨ werden, an den Schnittkanten zu diesem Objekt den hochstm¨ ogli-¨ chen Wert in dem Height-Field aufweisen. Zur Texturierung einer Szene werden je-

48 7 Ergebnisse doch haufig¨ Texturen eingesetzt, welche sich wiederholen. Aus diesem Grund ist die vorgeschlagene Losung¨ nur schwer umsetzbar. Wie bereits erlautert,¨ bietet Displacement Mapping als einziges der drei Verfahren die Moglichkeit¨ zur Darstellung von Selbstverschattung. Dabei ist jedoch zu beobachten, dass die Darstellung der Selbstverschattung bei flachen Betrachtungswinkeln proble- matisch ist. Bei einem sehr flachen Betrachtungswinkel reicht die Anzahl der gewahlten¨ Iterationen zur Bestimmung des Schnittpunktes des Blickvektors mit der Distance-Map moglicherweise¨ nicht aus, um den korrekten Schnittpunkt zu bestimmen. Zur Bere- chung der Schatten wird jedoch der Lichtvektor ausgewertet, welcher wieder in einem anderen, eventuell weniger flachem Winkel zur Oberflache¨ steht. Aus diesem Grund wird mit Hilfe des Lichtvektors im Rahmen der Berechnung der Selbstverschattung mit hoher Wahrscheinlichkeit ein korrekter Schnittpunkt mit der Distance-Map gefun- den. Beim anschließenden Vergleich der beiden Schnittpunkt wird jedoch keine Uber-¨ einstimmung festgestellt und somit Schatten fur¨ den aktuellen Schnittpunkt festgelegt. Aus diesem Grund kann man haufig¨ den Effekt beobachten, dass die betrachtete Flache¨ in sehr großen Teilen verschattet wird, sobald man diese bei einer geringeren Anzahl der Iterationen aus einem zu flachem Winkel betrachtet. Dieser Fehler laßt¨ sich durch eine Erhohung¨ der Anzahl von Iterationen zwar beheben, allerdings ist diese Losung¨ nur bedingt geeignet, da hierdurch die Performance stark verschlechtert wird. Im Folgenden soll die Performance beim Einsatz des Bump-, Parallax- und Displace- ment-Shaders untersucht werden. Dabei wird zunachst¨ auf den Speicherverbrauch der einzelnen Shader eingegangen. Die im Bump-Shader verwendeten Texturen, Color- Map und Normal-Map, benotigen¨ insgesamt 1,5 MB Speicher bei einer jeweiligen Auf- losung¨ von 512x512 Pixel. Im Parallax Shader wird zusatzlich¨ ein Height-Field verwen- det. Aus diesem Grund verbraucht der Parallax Shader bei gleicher Auflosung¨ insge- samt 1,75 MB Speicher fur¨ die Texturen. Beim Displacement-Shader wird neben der Color-Map und der Normal-Map mit einer jeweiligen von Auflosung¨ 512x512 noch ei- ne dreidimensionale Distance-Map mit einer Auflosung¨ von 512x512x16 verwendet. Der Speicherverbrauch des Displacement Shaders fur¨ diese Texturen betragt¨ deshalb insgesamt 5,5 MB. Getestet wurden die Shader auf einem System mit einem AMD Athlon XP 3200+, 1GB Speicher und einer NVIDIA GeForce 6800 Ultra. Als einfache Testszene wurde ei- ne Plane mit einem Material und einer Lichtquelle gewahlt.¨ Dabei erreichte der Bump Shader fur¨ eine Auflosung¨ von 512x512 eine mittlere Framerate von 1088 fps. Der Par- allax Shader erreichte in der gleichen Konfiguration eine mittlere Framerate von 907 fps. Ebenfalls getestet wurde der Displacement-Shader, welcher unter den gegebenen Voraussetzungen eine mittlere Framerate von 160 fps erreichte. Mit Hilfe des Programms NVShaderPerf wurde außerdem die theoretische Perfor- mance der Shader ermittelt. Insgesamt zeigen die Ergebnisse deutlich, dass es sich bei Bump Mapping, welches 17 cycles benotigt,¨ um das schnellste Verfahren zur Verbes- serung der Oberflachenstruktur¨ handelt. Parallax Mapping, welches 20 cycles benotigt,¨ ist hingegen nur geringfugig¨ langsamer als Bump Mapping. Ein deutlicher Unterschied im Vergleich zu Bump Mapping und Parallax Mapping laßt¨ sich bei der Laufzeit des

49 7 Ergebnisse

Displacement Mappings erkennen. Displacement Mapping benotigt¨ bei jeweils 16 Ite- rationsschritten fur¨ den Schnittpunkttest und die Berechnung der Selbstverschattung 122 cycles und ist mit 160 fps deutlich langsamer als die anderen beiden Verfahren. Ein ausschlaggebender Grund fur¨ die geringere Framerate beim Displacement Mapping sind die beiden durchgefuhrten¨ Ray-Marching Durchlaufe,¨ wobei allein zur Berech- nung der Selbstverschattung ein gesamter Ray-Marching Durchlauf benotigt¨ wird. Die Shader wurden anschließend auch mit der bereits vorgestellten Beispielszene getestet. Die Beispielszene besteht aus 36532 Dreiecken. Fur¨ die Beleuchtung werden 3 Lichtquellen verwendet. Dabei wird fur¨ jede Lichtquelle ein Renderingpass durch- gefuhrt.¨ Unter diesen Voraussetzungen erreichte die mit Bump Mapping gerenderte Szene durchschnittlich 44 fps. Mit Parallax Mapping wurden durchschnittlich 41 fps gemessen. Unter Verwendung von Displacement Mapping hingegen wurden durch- schnittlich 13 fps erreicht. Auffallend waren dabei die stark schwankenden Frameraten beim Displacement Mapping in Abhangigkeit¨ von dem betrachteten Abschnitt der Sze- ne sowie dem Abstand des Betrachters von der Szene. Je mehr Objekte im betrachteten Teilabschnitt der Szene mit dem Displacement Shader dargestellt werden, desto nied- riger wird die Framerate.

Test \ Shader Bump Mapping Parallax Mapping Displacement Mapping NVShaderPerf 17 cycles 20 cycles 122 cycles Simple Plane 1088 fps 907 fps 160 fps Scene 44 fps 41 fps 13 fps

Tabelle 7.1: Ubersicht¨ der Ergebnisse

50 8 Fazit und Ausblick

In dieser Studienarbeit wurden drei verschiedene Verfahren zur Verbesserung der Ober- flachenstruktur¨ von Objekten vorgestellt: Bump Mapping, Parallax Mapping und Dis- placement Mapping. Bump Mapping bietet sich aufgrund der hohen Performance zur Simulation feiner Oberflachenstrukturen¨ an. Ideal geeignet ist das Bump Mapping so- mit zur Darstellung der Oberflachenstruktur¨ bei Materialien wie Metall, Kunststoff oder Leder. Allerdings beinhaltet das Bump Mapping Verfahren keine Selbstverschat- tung der simulierten Strukturen. Durch eine Erweiterung des Verfahrens um Horizon Mapping [12] besteht allerdings die Moglichkeit,¨ die fehlende Selbstverschattung zu berechnen. Bei der Darstellung hochfrequenter Strukturen mit hoher Amplitude hingegen er- reicht insbesondere das Displacement Mapping gute Ergebnisse im Hinblick auf die Darstellungsqualitat.¨ Ein Kritikpunkt ist jedoch, dass der Algorithmus des Per-Pixel Displacement Mappings nur fur¨ planare Flachen¨ konzipiert ist. Beim Einsatz auf Fla-¨ chen mit einer hohen Krummung¨ kann es deshalb zu Verzerrungen kommen Zur Lo-¨ sung dieses Problems kann eine tetraedrische Projektion im Vertex Shader nach dem Konzept von Wylie [17] eingesetzt werden. Außerdem werden mit dem vorgestellten Per-Pixel Displacement Mapping Algorith- mus bisher die Silhouetten des Objektes, auf welchem das Verfahren angewandt wird, nicht verandert.¨ Durch Erganzung¨ eines Verfahrens zur korrekten Veranderung¨ der Ob- jektsilhouette bei der Anwendung von Per-Pixel Displacement Mapping ließe sich die Darstellungsqualitat¨ allerdings noch weiter verbessern. Wie beim Vergleich der drei Verfahren festgestellt wurde, handelt es sich bei Bump Mapping und Parallax Mapping um zwei sehr schnelle Techniken. Das Per-Pixel Dis- placement Mapping ist zwar um einiges langsamer als Bump Mapping und Parallax Mapping, bietet dafur¨ aber weitaus mehr Moglichkeiten¨ bei der Darstellung der Ober- flachenstrukturen.¨ In Zukunft ist außerdem mit einer weiteren Verbesserung der Per- formance der Graphik-Hardware zu rechnen, so dass auch komplexere Verfahren wie das vorgestellte Displacement Mapping vermehrt in interaktiven Anwendungen ein- gesetzt werden konnen.¨

51 Literaturverzeichnis

[1] James F. Blinn. Simulation of Wrinkled Surfaces. Computer Graphics (Proceedings of SIGGRAPH ’78), 12(3):286–292, 1978.

[2] Robert L. Cook. Shade Trees. In Computer Graphics (Proceedings of SIGGRAPH 84), 18(3):223–231, 1984.

[3] Michael Doggett. Displacement Mapping. ATI Research, 2003.

[4] William Donnelly. Per-Pixel Displacement Mapping with Distance Functions. In GPU Gems 2, Programming Techniques for High Programming Techniques for High- Performance Performance, Graphics and General Graphics and General-Purpose Compu- tation, pages 132–136, 2005. Available from: http://download.nvidia.com/ developer/GPU Gems 2/GPU Gems2 ch08.pdf.

[5] R. Fernando and C. Zeller. GPU Applications. NVIDIA Corporation, 2005.

[6] Randima Fernando and Mark J. Kilgard. The Cg Tutorial : the definitive guide to programmable real-time graphics. Addison-Wesley, 2003.

[7] Gesellschaft fur¨ Infomatik E.V. VRML, December 2005. Availa- ble from: http://www.gi-ev.de/service/informatiklexikon/ informatiklexikon-detailansicht/meldung/90/.

[8] J. C. Hart. Sphere tracing: A geometric method for the antialiased ray tracing of implicit surfaces. The Visual Computer, 12(10):527–545, 1996. Available from: citeseer.ist.psu.edu/hart94sphere.html.

[9] M. Kilgard. A practical and robust bump-mapping technique for today’s GPU’s. Technical report, NVIDIA Corporation, 2000. Available from: citeseer.ist.psu. edu/kilgard00practical.html.

[10] Emmett Kilgariff and Randima Fernando. The GeForce 6 Series GPU Architecture. In GPU Gems 2, Programming Techniques for High Programming Techniques for High- Performance Performance, Graphics and General Graphics and General-Purpose Compu- tation, pages 471–491, 2005.

[11] P. E. Danielsson. Euclidean distance mapping. Computer Graphics and Image Pro- cessing, 14:227–248, 1980.

52 Literaturverzeichnis

[12] Peter-Pike J. Sloan and Michael F. Cohen. Interactive horizon mapping. In Pro- ceedings of the Eurographics Workshop on Rendering Techniques 2000, pages 281– 286, London, UK, 2000. Springer-Verlag. Available from: http://research. microsoft.com/∼cohen/bs.pdf.

[13] Tomomichi Kaneko et al. Detailed Shape Representation with Parallax Mapping. ICAT, 2001.

[14] L. Wang, X. Wang, X. Tong, S. Lin, S. Hu, B. Guo, and H. Y. Shum. View-Dependent Displacement Mapping. ACM Transactions on Graphics (Proceedings of SIGGRAPH 2003), 22(3):334–339, 2003. Available from: http://research.microsoft. com/users/lfwang/vdm.pdf.

[15] Terry Welsh. Parallax Mapping with Offset Limiting: A PerPixel Approximation of Uneven Surfaces, 2004. Available from: http://www.infiscape.com/doc/ parallax mapping.pdf.

[16] William R. Mark, Steve Glanville, and Kurt Akeley. Cg: A system for program- ming graphics hardware in a C-like language. ACM Transactions on Graphics, 2003. Available from: citeseer.ist.psu.edu/mark03cg.html.

[17] Brian Wylie, Kenneth Moreland, Lee Ann Fisk, and Patricia Crossno. Tetrahedral projection using vertex shaders. In VVS ’02: Proceedings of the 2002 IEEE symposium on Volume visualization and graphics, pages 7–12, Piscataway, NJ, USA, 2002. IEEE Press.

53