Die Welt der Shader Universität zu Köln WS 14/15 Softwaretechnologie II (Teil 1) Prof. Dr. Manfred...

Post on 06-Apr-2015

107 views 0 download

transcript

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!