Notizen zu Texture Mapping, Environment Mapping und Bump Mapping
Texture Mapping
Ziele (Objectives)
- Einführung in Mapping-Methoden
- Textur Mapping (Texture Mapping)
- Environment Mapping
- Bump Mapping
- Grundlegende Strategien berücksichtigen
- Forward vs backward mapping (Vorwärts- vs Rückwärts-Abbildung)
- Punkt-Sampling vs Area Averaging
Die Grenzen der Geometrischen Modellierung
- GPUs rendern zwar über 10 Millionen Polygone pro Sekunde, das reicht aber nicht für viele Phänomene
- Beispiele: Wolken, Gras, Gelände, Haut
Modellierung einer Orange (Beispiel)
- Ausgangspunkt: eine orangefarbene Kugel
- Kugel allein ist zu einfach
- Ersetzen durch komplexere Formen, um Oberfläche abzubilden
- Reines Polygonmodellieren der Dimples ist zu teuer
Textur Mapping als Lösung (Texture Mapping)
- Foto einer Orange auf ein einfaches geometrisches Modell projizieren
- Textur Mapping kann dennoch glatte Oberflächen erzeugen; feine Oberflächenmerkmale fehlen
- Um lokalere Formmerkmale zu erreichen, braucht es zusätzlich andere Verfahren (z. B. Bump Mapping)
Drei Typen des Texture Mapping
- (Image) Texture Mapping: Bilder verwenden, um Flächen von Polygonen auszufüllen
- Environment (Reflection) Mapping: Umgebung als Textur verwenden, um spiegelnde Effekte zu simulieren
- Bump Mapping: Normale Vektoren während des Renderings modifizieren, um Oberflächenstrukturen zu simulieren
Textur Mapping – Überblicksbild
- geometrisches Modell vs. texturierte Geometrie
- texture mapped
Environment Mapping
- (Bildschirm-/Umgebungsabbildung) Mapping
- Simulation hochreflektierender Oberflächen ohne Strahlentracing
- Frühere Verwendung in Filmen (z. B. The Abyss, Terminator 2) und in Videospielen
- Es ist eine Form des Textur-Mappings
Environment Mapping – Grundlagen
- Abbilden der Umgebung → Reflexionen auf Oberflächen
- Verschiedene Ansätze: Sphere Maps, Cube Maps, Cylinder Maps
Reflection (Umgebung reflektieren)
- Grundnotationen: Normalenvektor N, Blickrichtung V, reflektierter Vektor R
- Formel (Reflexion): \mathbf{R} = 2(\mathbf{N} \cdot \mathbf{V})\mathbf{N} - \mathbf{V}
Mapping auf eine Kugel (Sphere Mapping)
- Ursprüngliche Umgebungskartierung mit Längen- und Breitengraden
- OpenGL unterstützt Sphere Mapping, erfordert kreisförmige Textur (wie Fotos mit Fischaugen-Objektiv)
Hemisphere Map als Textur
- Falls alle Objekte auf eine Hemisphäre abgebildet werden, bleibt unklar, ob sich ein Objekt wirklich auf der Kugel befindet
- Lösung: Karteninhalt auf Kugel/Textur legen und dann auf Objekten verwenden
- Alternativen: Cube Maps, Cylinder Maps
Cube Map
- sechs Seiten eines Würfels als Texture Maps
- In OpenGL/WebGL: cube map Texture-Sampler verwenden (textureCube)
- Koordinaten: dreidimensionale Koordinaten, üblicherweise durch die Vertex-Position gegeben
- Beispielbefehl: vec4 texColor = textureCube(mycube, texcoord);
Indexing in die Cube Map
- Objekt liegt im Ursprung
- Bestimme die zu benutzende Würfelseite über die größten Betrag der Koordinaten
- Restliche Koordinaten liefern die Texture-Koordinaten auf dieser Seite
- Formel zur Rekonstruktion (Beispiel): \mathbf{R} = 2(\mathbf{N} \cdot \mathbf{V})\mathbf{N} - \mathbf{V} \quad (R \text{ als Richtung})
OpenGL/WebGL-Implementierung
- WebGL unterstützt nur Cube Maps; Desktop OpenGL unterstützt auch Sphere Maps
- Zuerst eine Abbildung erstellen, Bilder aus einer Kamera verwenden, dann in WebGL texturieren
- Textur auf Objekt anwenden
Cube Maps – Implementierung in WebGL
- Definiere sechs 2D-Textur Maps, die die Seiten eines Würfels repräsentieren
- In WebGL: vec4 texColor = textureCube(mycube, texcoord);
- Texturkoordinaten müssen 3D sein; üblicherweise durch die Vertexposition gegeben
Environment Maps mit Shaders
- Umgebungskarten werden oft in Weltkoordinaten berechnet, die sich durch Modeling-Matrix unterscheiden
- Modeling-Matrix ggf. als Uniform an das Shader-Programm übergeben
- Falls nötig: Reflexions-Map oder Brechungs-Map für Effekte wie Wasser
Probleme/Limitierungen
- Annahme: Umgebung ist sehr weit entfernt (ähnlich wie Unterschied zwischen Nah-/ Fernlicht)
- Objekt kann nicht konkav sein (kein Selbstreflexionen möglich)
- Keine Spiegelungen zwischen Objekten
- Für jedes Objekt braucht man eine eigene Reflexionskarte
- Falls der Betrachter sich bewegt, braucht man eine neue Karte
Formung der Cube Map
- Verwende sechs Kameras, jeweils mit einem 90° Blickwinkel
- Beispielbild aus Maya (Szenenaufbau)
WebGL-Doing-it-Beispiel
- Beispielcode-Muster: gl.textureMap2D( gl.TEXTURECUBEMAPPOSITIVEX, level, rows, columns, border, gl.RGBA, gl.UNSIGNED_BYTE, image1 )
- Gleiches Prinzip für die anderen fünf Seiten
- Eine Texture-Objekt-Gruppe aus sechs Bildern erstellen
Cube Maps – Beispiel: Raum voller Farben
- Rot, Grün, Blau, Cyan, Magenta, Gelb als Texel-Farben pro Wand
- Jede Raumwand könnte als Texel (eine einzelne Textur) codiert sein
- Beispielwerte: Rot, Grün, Blau, Cyan, Magenta, Gelb als 1x1 Texturen
Cube Map – Textur-Objekt-Erzeugung und Setup
- Texture-Objekt erstellen: cubeMap = gl.createTexture(); gl.bindTexture(gl.TEXTURECUBEMAP, cubeMap);
- Füllen der sechs Seiten mit Farbdaten (1x1 Texturen) mittels texImage2D
- Auswahl der aktiven Textur und Verknüpfung mit Shader-Uniform
Vertex Shader (Beispiel)
- Berechnung von R (Reflexionsrichtung) im Vertex-Shader: \mathbf{R} = \text{reflect}(\text{eyePos}.xyz, \text{N}.xyz)
- Weitergabe an den Fragment-Shader über eine Varying-Variable
Fragment Shader (Beispiel)
- Abfrage aus der Cube-Map: \text{texColor} = \text{textureCube}(\textMap, R); \; \; \; \text{gl_FragColor} = \textColor;
Sphere Mapping (Fortführung)
- Originale Technik der Blinn und Newell basierend auf Längengrad-/Breitengrad-Parametrisierung
- OpenGL/OpenGL ES unterstützen Sphere Mapping; benötigt eine kreisförmige Textur (kreisförmige Karte)
Bump Mapping
- Ziel: Realistische Oberflächenunterschiede durch Veränderung der Normale statt geometrischer Erhöhung
- Beispiel: Orange mit Texturabbildung der Orange, aber Licht- und Blickrichtung führen zu falscher Orientierung der Dimples
- Besser: Normale perturbieren und Farbwert pro Fragment neu berechnen
Mathematische Grundlagen des Bump Mapping (Blinn)
- Parametrisierung der Fläche: p(u,v) = \begin{bmatrix} x(u,v) \ y(u,v) \ z(u,v) \end{bmatrix}^T
- Tangentenvektoren: pu = \begin{bmatrix} \partial x/\partial u \ \partial y/\partial u \ \partial z/\partial u \end{bmatrix}^T,\, pv = \begin{bmatrix} \partial x/\partial v \ \partial y/\partial v \ \partial z/\partial v \end{bmatrix}^T
- Normalenvektor: \mathbf{n} = \frac{pu \times pv}{|pu \times pv|}
Displacement-Funktion (Bump-Displacement)
- Die Bump-/Hoch-Delle wird durch eine Funktion d(u,v) beschrieben
- Pseudo-Position: p' = p + d(u,v)\, \mathbf{n}, \; d(u,v) \ll 1
Perturbierte Normalen
- Kleinere Änderungen der Tangentenebenen führen zu einer verschobenen Normale
- Formeln (vereinfachte/für Shader übliche Darstellung):
- p'u = pu + \frac{\partial d}{\partial u} \mathbf{n} + d(u,v) \mathbf{n}_u
- p'v = pv + \frac{\partial d}{\partial v} \mathbf{n} + d(u,v) \mathbf{n}_v
- \mathbf{n}' = p'u \times p'v \approx \mathbf{n} + \frac{\partial d}{\partial u} (\mathbf{n} \times \mathbf{p}v) + \frac{\partial d}{\partial v} (\mathbf{p}u \times \mathbf{n})
Normalen-Approximation
- Die Vektoren liegen in der Tangentialebene, daher wird die Normale in der Tangentialebene verschoben
- Vorberechnete Arrays nutzen und die Normalen während des Shadings perturbieren:
- \mathbf{n}' \approx \mathbf{n} + \frac{\partial d}{\partial u} (\mathbf{n} \times \mathbf{p}v) + \frac{\partial d}{\partial v} (\mathbf{p}u \times \mathbf{n})
Bildverarbeitung für Normal Maps
- Ausgangsfunktion wird sampelt und als Textur gespeichert: d(u,v) wird als Normalmap genutzt
- Ableitungen von d werden als Finite-Differenzen approximiert:
- \frac{\partial d}{\partial u} \approx d{ij} - d{i-1,j}, \quad \frac{\partial d}{\partial v} \approx d{ij} - d{i,j-1}
Wie man das umsetzt
- Ziel: Perturbation auf alle Punkte der Oberfläche anwenden
- Vertex-Lighting reicht oft nicht aus; muss auf Fragment-Ebene erfolgen
- Fixed-Function-Pipeline genügt nicht; benötigt Fragment-Programmierung (Fragment Shader)
Ausblick: Kurven und Oberflächen (nächster Abschnitt)
Weiterführende Hinweise
- Alle Beschreibungen stammen aus den Folien/Transkripten der Vorlesung zur Computergraphik an der Universität Rostock
Environment and Bump Mapping
Ziele
- Reflection (Environment) Maps
- Cube Maps
- Spherical Maps
- Bump Maps
Environment Mapping (Umgebungsabbildung)
- Eine Methode, um das Aussehen hochreflektierender Oberflächen ohne Ray Tracing zu erzeugen
- Anwendungen in Filmen (The Abyss, Terminator 2) und in Videospielen
- Es ist eine Form der Textur-Mapping
Environment Mapping – Grundlagen
- Reflektierte Umgebung auf Oberflächen abbilden
- Unterschiedliche Ansätze: Sphere Maps, Cube Maps, Cylinder Maps
Abbilden der Umgebung
- Normalen N, Blickrichtung V, reflektierte Richtung R
- Box-/Kugel- bzw. Cylinder-Methoden
Mapping auf eine Kugel (Sphere Mapping)
- OpenGL unterstützt Sphere Mapping; nutzt eine kreisförmige Textur (Fischaugen-Charakter)
Hemisphere Map als Textur
- Falls man Object-to-Sphere Mapping benutzt, muss man aufpassen, ob es wirklich der Reflexionsumgebung entspricht
- Cube Maps, Cylinder Maps als Alternativen
Cube Map
- sechs Seiten eines Würfels als Texturen
- Koordinaten: 3D-Texturkoordinaten, meist durch die Objektposition gegeben
- Wenn N die Oberflächen-Normalen sind und V der Blickrichtungseinheitsvektor, dann wird die Richtung R genutzt, um die Cube-Map abzurufen
Indexing in Cube Maps
- Konstruktion der Richtung und Auswahl der passenden Würfelseite
- Beispiel einer Formel: R = 2(\mathbf{N} \cdot \mathbf{V}) \mathbf{N} - \mathbf{V}
OpenGL/OpenGL ES Implementierung
- WebGL unterstützt Cube Maps; Desktop OpenGL unterstützt zusätzlich Sphere Maps
- Zunächst Cube Map aus sechs Bildern erzeugen und an Shader-Programme übergeben
- Beispiel: vec4 texColor = textureCube(mycube, texcoord);
Cube Maps – Praktische Implementierung
- sechs 2D-Textur-Maps definieren, die jeweilige Seite des Würfels repräsentieren
- TexCoord müssen 3D sein; oft wird der Vertex-Positionstexturkoordinaten verwendet
Environment Maps mit Shaders
- Environment Maps werden üblicherweise in Weltkoordinaten berechnet, daher ggf. Modeling-Matrix berücksichtigen
- Modeling-Matrix als Uniform an Shader weitergeben
- Reflexionsmap oder Brechungsmap (Refraction) für Effekte wie Wasser möglich
Probleme/Limitierungen
- Umgebung wird als weit entfernt angenommen (kein Nahsicht-Reflexion)
- Objekte dürfen nicht konvex/selbstreflektierend sein; keine Reflexionen zwischen Objekten ohne separate Karten
- Jede Objekteinheit braucht eine eigene Reflexionskarte; Bewegung des Betrachters erfordert ggf. neue Map
Formung der Cube Map
- Sechs Kameras, je 90° Blickfeld
- Praxisbeispiel: Maya-Ansicht der Szene
WebGL-Beispiel-Implementierung
- WebGL-Codebeispiel: Laden der sechs Faces in TEXTURECUBEMAPPOSITIVEX/Y/Z etc.
- Nutzen von 3D-Texturkoordinaten, typischerweise aus den Vertex-Positionskoordinaten abgeleitet
Beispiel: Reflektierender Raum mit farbigen Wänden
- Sechs Farben für sechs Würfelseiten als Texelwerte
- Farben: Rot, Grün, Blau, Cyan, Magenta, Gelb
- Jede Wand repräsentiert ein Texel (1x1 Textur)
Cube Map – Shader-Beispiele
- Vertex-Shader: Berechnung von R durch
\mathbf{R} = \text{reflect}(\text{eyePos}, \text{N}) - Fragment-Shader: Abfrage aus Cube-Map:
\text{texColor} = \text{textureCube}(\textMap, R)
- Vertex-Shader: Berechnung von R durch
Sphere Mapping (Zusatz)
- Ursprüngliche Umgebungsabbildung mit Längengrad-/Breitengrad-Parametrisierung
- Sphere Maps benötigen eine kreisförmige Textur, vergleichbar mit Fischaugen-Bild
Bump Mapping – Details
- Ziel: realistische Oberflächenstrukturen durch Normalperturbation
- Grundlagen der Geometrie: Tangentenebene, Normalenberechnung
Bump Mapping – wichtige Formeln
- Tangentialebene: p(u,v) = [x(u,v), y(u,v), z(u,v)]^T
- Tangentenvektoren: pu = [\partial x/\partial u, \partial y/\partial u, \partial z/\partial u]^T, \quad pv = [\partial x/\partial v, \partial y/\partial v, \partial z/\partial v]^T
- Normalenvektor: \mathbf{n} = \frac{pu \times pv}{|pu \times pv|}
- Displacement-Funktion: p' = p + d(u,v) \mathbf{n}, \quad d(u,v) \ll 1
- Perturbierte Normalen
- p'u = pu + \frac{\partial d}{\partial u} \mathbf{n} + d(u,v) \mathbf{n}_u
- p'v = pv + \frac{\partial d}{\partial v} \mathbf{n} + d(u,v) \mathbf{n}_v
- \mathbf{n}' = p'u \times p'v \approx \mathbf{n} + \frac{\partial d}{\partial u} (\mathbf{n} \times \mathbf{p}v) + \frac{\partial d}{\partial v} (\mathbf{p}u \times \mathbf{n})
- Ableitung/Herleitung: Ableitungen liegen in der Tangentialebene; Normalen werden angepasst
Bildverarbeitung für Normalmaps
- Textur-Datei enthält d(u,v) als Normalmap
- Ableitungen mit Finite-Differenzen (z. B. zentrale Differenzen):
- \frac{\partial d}{\partial u} \approx d{ij} - d{i-1,j}, \quad \frac{\partial d}{\partial v} \approx d{ij} - d{i,j-1}
Praktische Umsetzung
- Anwenden der Perturbation auf alle Fragmenten nötig; Vertex-Lighting reicht nicht aus
- Fragment-Programm (Fragment Shader) erforderlich, um per-Pixel-Normalperturbation zu berechnen
Ausblick
- Weiterführende Themen: Curves and Surfaces (nächstes Kapitel)
Kurze Zusammenfassung der Kernpunkte
- Texture Mapping nutzt Bilder, Environment Mapping nutzt Umgebungsdaten, Bump Mapping perturbiert Normale
- Cube Maps ermöglichen realistische Spiegelungen ohne Ray Tracing
- Normal Maps ermöglichen feine Oberflächenstrukturen ohne mehr Polygonen
- Wichtige Konzepte: Koordinatensysteme, Forward vs backward mapping, Aliasing vs Area Averaging, Fragment-Shader-basierte Implementierung