210 likes | 365 Views
Computer Graphics Shader. Inhalt. Shader Beispiel. Pipeline Memory Resources Input-Assembler Vertex-Shader Geometry-Shader & Stream-Output Rasterizer Pixel-Shader Output-Merger Texturen Mipmaps Koordinaten Filtering 3D Räume Object Space World Space View Space Projection Space
E N D
Computer Graphics Shader
Inhalt • Shader • Beispiel • Pipeline • Memory Resources • Input-Assembler • Vertex-Shader • Geometry-Shader & Stream-Output • Rasterizer • Pixel-Shader • Output-Merger • Texturen • Mipmaps • Koordinaten • Filtering • 3D Räume • Object Space • World Space • View Space • Projection Space • Screen Space
Pipeline • Drei programmierbare Stufen • Vertex-Shader • Geometry-Shader • Pixel-Shader • Alle anderen Stufen sind nur über Zustände einstellbar Quelle: [DX07]
Memory Resources • Symbolisiert den Arbeitsspeicher der Grafikkarte • Ressourcen: • Vertex Buffer • Index Buffer • Texturen • Shaderkonstanten • Stateblocks • ... • Stateblocks werden unterteilt in: • Rasterizer States • Depth-Stencil States • Sampler States • Blend States Quelle: [DX07]
Input-Assembler • Liest Daten aus einem Index Buffer und ein oder mehreren Vertex Buffern • Setzt die gelesenen Daten zu Primitiven zusammen (assemble): • Linien • Dreiecken • ... • Fügt systemgenerierte Daten hinzu, z.B. Vertex ID • Gibt die Daten an die Pipeline weiter Quelle: [DX07]
Vertex-Shader • Bearbeitet die vom Input Assembler übergebenen Vertices • Daraus folgt, dass der Vertex-Shader für jeden Vertex einmal ausgeführt wird • Zu den Aufgaben gehören: • Transformation der Position • Bearbeitung der Texturkoordinaten • Per Vertex Lichtberechnungen • Displacement Mapping • ... Quelle: [DX07]
Geometry-Shader & Stream-Output • Bearbeitet die vom Vertex-Shader ausgegebenen Vertices, die zu Primitiven zusammengesetzt werden • Der Geometry-Shader wird für jedes Primitiv (Linie, Dreieck, ...) einmal ausgeführt • Der Geometry-Shader kann Geometrie hinzufügen bzw. aus der Pipeline entfernen (limited geometry amplification und de-amplification) • Über den Stream-Output können Geometrie Daten in die Memory Resources geschrieben werden • Diese Vorgang unterbricht nicht die Pipeline, sondern findet parallel dazu statt Quelle: [DX07]
Rasterizer • Zuständig für „Clipping“ • Abbilden auf den Viewport • Rasterung in Pixel • Interpolation der Vertex Daten • Reicht die interpolierten Daten an den Pixel-Shader weiter Quelle: [DX07]
Pixel-Shader • Bearbeitet die vom Rasterizer übergebenen Pixel • Der Pixel-Shader wird für jeden Pixel einmal ausgeführt • Zu den Aufgaben gehören: • Color Transformationen • Per Pixel Lichtberechnungen • Texturen samplen • Bump Mapping • Evtl. Tiefenwert bearbeiten • ... Quelle: [DX07]
Output-Merger • Kombiniert die vom Pixel-Shader ausgegebenen Farben mit den bereits vorhanden Farben des Buffers (Blending) • Schreibt den neuen Wert auf den Buffer Quelle: [DX07]
Texturen • Ansammlung von “Texel“ • Ein Texel bildet die kleinste Einheit einer Textur • Besteht aus 1 bis 4 Komponenten (je nach Format: RGBA, R, GR, ...) • Texturen können im Shader „beliebig“ oft gelesen (fetch oder sample) werden • Es existieren vier verschiedene Textur-Typen: • 1D-Texturen • 2D-Texturen • 3D-Texturen (Volumetextures) • Cubemaps
Mipmaps • Stammt aus dem lateinischen „multum in parvo“, bedeutet übersetzt soviel wie „Viel in Kleinem“ • Bilden eine Anreihung von Texturen, bei der jede Folgetextur immer das gleiche Bild repräsentiert • Mit jedem neuen Mipmap-Level wird die Auflösung der Textur halbiert • Die Grafikkarte kann feststellen welcher Mipmap-Level die nächste Auflösung zur gewünschten Ausgabe besitzt • Verringert Aliasing und erhöht damit die Bildqualität • Erhöhter Speicherverbrauch
Texturkoordinaten • Zum Adressieren einer Textur werden je nach Typ 1 bis 3 Koordinaten benötigt • Die Koordinaten werden meistens als u, v und w bezeichnet • Linear adressiert von: • 0 bis 1 bei 1D-Texturen • (0, 0) bis (1, 1) bei 2D-Texturen • (0, 0, 0) bis (1, 1, 1) bei 3D-Texturen • Unterschied zwischen DX9 und DX10 in der Adressierung. Unter DX10 befindet sich der erste Texel auf der Koordinate (0, 0) Quelle: [DX07] Quelle: [AMD07]
Filtering • In den meisten Fällen wird die Textur beim Lesen „magnified“ oder „minified“ • Magnification: Mehrere Pixel werden auf einen Texel abgebildet • Ergebnis ist grob • Lösung durch Linear- bzw. Bilinear-Filtering • Minification: Ein einzelner Pixel wird auf mehrere Texel abgebildet • Ergebnis besitzt starkes Aliasing • Lösung durch Mipmap-Filtering Quelle: [DX07]
3D Räume • Object Space • World Space • View Space • Projection Space • Screen Space
Object Space & World Space • Object Space • Oft Model Space genannt • Wird bevorzugt zur Erstellung der Objekte verwendet • Objekt wird um den Nullpunkt erstellt, dadurch können Transformationen (z.B. Rotation) leichter ausgeführt werden • World Space • Raum den sich alle Objekte teilen • Modelle • Licht • Kamera • ...
View Space • Auch oft Camera Space genannt • Bestimmt die äußeren Kameraeinstellungen • Position und Ausrichtung • Die Kamera bildet den Ursprung im View Space • Die Ausrichtung der Kamera bildet die z-Achse des View Space World Space View Space Quelle: [DX07]
Projection Space & Screen Space • Bestimmt die inneren Kameraeinstellungen • Field of View, Near Clip Plane und Far Clip Plane • Führt eine perspektivische Transformation bzw. Projektion aus • Objekte näher an der Kamera erscheinen größer als weiter entfernte Objekte • Objekte werden anhand ihrer Entfernung zur Kamera (z-Wert im View Space) transformiert • View Frustum wird auf einen „Einheitswürfel“ abgebildet • In diesem besitzen alle sichtbaren Objekte: • x- und y-Werte zwischen -1 und +1 • z-Werte zwischen 0 und 1 • Screen Space • Bestimmt die Position auf dem Frame Buffer • Die linke, obere Ecke bildet den Ursprung mit der Koordinate (0, 0) • Der letzte Punkt im Raum wird durch Koordinate (w-1, h-1) definiert, wobei w die Breite des Frame Buffers und h die Höhe des Frame Buffers (in Pixel) angibt • Positive x-Achse verläuft nach rechts • Positive y-Achse verläuft nach unten
Shader • Eingabedaten werden in zwei Kategorien unterteilt: • Varying Inputs: • Variieren für jeden Vertex bzw. Pixel • Per Vertex Daten: Position, Normale, Texturkoordinaten, ... • Per Pixel Daten: Texturkoordinaten, Normale, ... • Werden über spezielle Eingaberegister an den Shader übergeben • Uniform Inputs: • Sind für alle Vektoren, Pixel und Primitive gleich und variieren beim Durchlaufen der Pipeline nicht • Shaderkonstanten • Lichtposition • Kameraposition • Transformationsmatrizen • ... • Texturen • Ausgabedaten werden über spezielle Ausgaberegister an die Pipeline weitergegeben
Quellen [DX07] Direct X Documentation 2007 [AMD07] Harnessing the Power of DirectX 10