Upload
seppel-moseman
View
108
Download
0
Embed Size (px)
Citation preview
Die Welt der ShaderDie Welt der Shader
Universität zu KölnWS 14/15 Softwaretechnologie II (Teil 1)Prof. Dr. Manfred ThallerReferent: Lukas Kley
Fortgeschrittene Techniken III
GliederungGliederung1. Was ist ein Shader?2. Verschiedene Shader
2.1 Vertex-Shader2.2 Pixel-Shader
3. Einsatzbeispiele3.1 Per-Pixel-Beleuchtungsmodell3.2 Realistische Wasseroberflächen
1. Was ist ein Shader?1. Was ist ein Shader?
● Kleines Programm, das einmal pro Vertex oder Pixel aufgerufen wird
● Wird vom Grafikprozessor ausgeführt=> sehr schnell
● Geschrieben in speziellen Shader-Assembler-Sprachen
● Seit DirectX 9 innnerhalb einer Effektdatei auch in gewöhnlicher C(++)-Syntax -> High Level Shader Language (HLSL)
● Einsatzgebiet:Aufwändige Spezialeffekte
Fixe Rendering-Pipeline wird durch Shadereinsatz selbst definierbar
2. Verschiedene Shader2. Verschiedene Shader2.1 Vertex-ShaderBeispiel:
Glow-Effekt:
“Hülle” mit Alpha-Blending in der Glühfarbe
Entstehung der Hülle: Jeder Vertex wird entlang seines Normalenvektors verschoben
2.2 Pixel-Shader
Meist kleiner als Vertex-Shader=> werden öfter aufgerufen
Interessant für Per-Pixel Beleuchtung (Bump-Mapping)
Darstellung detaillierter Oberflächen (Wasser, Haut)
3. Einsatzbeispiele3. Einsatzbeispiele3.1 Per-Pixel Beleuchtungsmodell
Nachteile des Direct3D-Beleuchtungsmodells:
Nur auf Vertexbasis
Keine eigenen Lichtberechnungen (Normal-Mapping)
Begrenzte Anzahl von Lichtquellen
Multi-Pass-Verfahren
Anzahl an Registern bei frühen Pixel-Shader Versionen stark begrenzt=> mehrere Durchgänge (Passes) nötig
Ambient-Pass
Pro Lichtquelle ein weiterer Pass (mit Alpha-Blending)
Single-Pass-Verfahren (spätere Vers.)
Einschränkungen der früheren Versionen werden gelockert=>Mehrere Lichtquellen in einem Pass
Seperate Pixel-Shader für 1,2,3,4 Lichtquellen
Vorteil ggü. Multi-Pass:Vertex-Shader wird nur ein Mal aufgerufen
Normal-Mapping
Normalenvektor bestimmt, wie viel Licht eine Oberfläche empfängt
x-, y- und z-Komponenten eines Normalenvektors in den drei Farbkanälen der Textur kodieren:
Vektor (1,0,-0,5) => Farbe (255,127,63)Transformation der Normalenvektoren in
Weltkoordinaten:
3.2 Realistische WasseroberflächenWasseroberflächen reflektieren und brechen Licht
Je flacher der Einfallswinkel des Lichtstrahls auf die Oberfläche, desto höher der Reflexionsanteil
Ansatz: Zwei Render-Targets (Reflexion und Brechung), ein Pixel-Shader
Pixel-Shader sampelt beide Render-Targets und rechnet gewichtet nach Lichtanteil zusammen
Zufällige Verschiebung der Texturkoordinaten für Welleneindruck
ReflexionClipping-Ebene:
Clipping-Ebene an der Wasseroberfläche
Vertex-Shader übergibt Entfernung jedes Vertex zur Clipping-Ebene an Pixel-Shader
Wenn Wert <0: Pixel wird verworfen (s. HLSL-Funktion clip)
Spiegelung:Transformationsmatrix: D3DXMatrixReflect
Culling-Modus umkehren: D3DCULL_CCW auf D3DCULL_CW
Spiegelung der sichtbaren Objekte und Lichtquellen
Alpha-Kanal des Render-Targets: Entfernung des Pixels zur Wasseroberfläche
BrechungEntfernung zur Clipping-Ebene >0: Verwerfen
Stauchung der Szene entlang der y-Achse mit Wasseroberfläche als Zentrum
Auch alle Lichtquellen stauchen
Alpha-Kanal: Entfernung zur Oberfläche
Trübheitseffekt mit Nebel; Nebelstärke abhängig von der Teilstrecke Wasseroberfläche-Pixel
Zusammenfügen der SzenenWasseroberfläche aus zwei Dreiecken
Pixel-Shader berechnet Winkel zwischen Normalenvektor und Verbindungsvektor Kamera-Pixel
Sampeln der Render-Targets mit vPos.
Welleneindruck durch Verschiebung der Koordinaten anhand einer Normal-Map
Alpha-Kanal des Pixels als Faktor für Verschiebung durch die Wellen
Reflektierte und gerenderte Szene mit leicht vergrößertem FoV rendern zur Vermeidung von Fehlern am Rand
Glitzern auf Wasseroberfläche durch Specular Highlighting mit hoher Glanzkraft
Weiterführende Infos zu Shadern im DirectX-SDK, auf msdn.microsoft.com oder in der DirectX-Dokumentation
Vielen Dank für die Aufmerksamkeit!