Vertex-Shader
# Vertex-Shader

Vertex-Shader (auch: Vertexshader, Abk. VS) sind ein Typus von Shadern. Sie werden im Verlauf der Grafikpipeline, also der Verarbeitung eines 3D-Objektes auf der Grafikkarte, ausgeführt. Vertex-Shader sind in diesem Zusammenhang für die Verarbeitung aller Eckpunkte des 3D-Modells (der sogenannten Vertices) zuständig. Deshalb wird im Normalfall für jeden Vertex der Vertex-Shader einmal aufgerufen, woher auch der Name rührt.

## Funktion

Ein Vertex-Shader dient dazu, die Geometrie einer Szene zu manipulieren. Dazu werden die Koordinaten der Vertizes (Eckpunkte von dreidimensionalen Objekten) der Oberflächen transformiert (was sowohl eine Verschiebung, eine Rotation oder eine Skalierung umfassen kann, eventuell auch Kombinationen). So lässt sich die Form von Objekten beeinflussen, was sich wiederum auch in ihrer Beleuchtung niederschlägt. Eine typische Modifikation des Modells, die im Vertex-Shader ausgeführt wird, betrifft die Koordinatensysteme. So rechnet der Vertex-Shader die Position der Vertizes aus dem Koordinatensystem des 3D-Modells erst in das globale Koordinatensystem, was sich alle 3D-Objekte teilen, um. Danach kann er die Vertizes auch noch in das Kamerakoordinatensystem umrechnen. Da der Vertex-Shader jedoch pro Vertex aufgerufen wird, kann der Vertex-Shader keine neuen Punkte zum 3D-Modell hinzufügen. Diese Aufgabe übernimmt hingegen der Geometry-Shader, der auch meist nach dem Vertex-Shader aufgerufen wird. Auf modernen Grafikkarten kann es auch Tessellation-Shader zum Hinzufügen neuer Vertizes geben. Hinsichtlich des Funktionsumfangs ersetzt der Vertex-Shader somit das ältere und weniger flexible Transform & Lighting (T&L).

Mit Hilfe von Vertex-Shadern sind Effekte wie Vertex Lighting, Terrain-/Objektdeformation, Wasserwellen oder Fischaugenobjektiv möglich. Die meisten heutigen Grafikchips enthalten Shadereinheiten, die die Vertex-Shader ausführen. Dadurch müssen diese Geometrie Berechnungen nicht auf der CPU des Systems laufen, wodurch sie entlastet wird und für andere Aufgaben eingesetzt werden kann. In der Regel werden mehrere Shadereinheiten in GPUs verbaut, damit diese nicht zum Flaschenhals der Grafikpipeline werden.

Zusätzliche Informationen zur Verarbeitungskette und zur Programmierung von Shadern gibt es in dem Artikel Shader.

## Kompatibilität

### Hardware

Die folgende Tabelle zeigt eine Übersicht, welche Grafikkarten bzw. Grafikchips mit welcher DirectX-Version welche Vertex-Shader-Version unterstützen. Der Vollständigkeit halber ist auch T&L, der Vorläufer von Vertex-Shadern, mitaufgenommen. Hierbei ist zu beachten, dass Grafikchips in der Regel ältere Versionen ebenfalls unterstützen, so können beispielsweise Vertex-Shader-3.0-Chips auch mit Vertex-Shadern der Version 2.0 arbeiten. Diese Abwärtskompatibilität übernimmt hauptsächlich der Grafikkartentreiber und nicht der Grafikprozessor.

| VS-Version | nötige DirectX Version | 3DLabs | ATI | Intel | Matrox | NVIDIA | S3 Graphics | SiS | XGI |
| - | - | - | - | - | - | - | - | - | - |
| T&L | 7.0 | – | Radeon-7000-Serie | – | – | GeForce 256, GeForce-2-Serie, GeForce 4 MX | – | – | – |
| 1.0/1.1 | 8.1 | Wildcat VP | Radeon 8500 – 9250 | – | Parhelia-Serie | GeForce-3-Serie, GeForce-4-Serie | – | Xabre-Serie | Volari V3-Serie (außer V3XT) |
| 2.0 | 9.0 | Wildcat Realizm | Radeon 9500 – 9800, X300 - X850 | Intel GMA 900 | – | GeForce-FX-Serie | DeltaChrome, GammaChrome, Chrome-S2x-Serie | Mirage 3, Mirage 3+ | Volari V3XT, Volari V5-Serie, Volari V8-Serie, Volari 8300, Volari XP10 |
| 3.0 | 9.0c | – | Radeon-X1-Serie | Intel GMA 950, 3000, X3000 | – | GeForce-6-Serie, GeForce-7-Serie | – | – | – |
| 4.0 | 10 | – | Radeon-HD-2000-Serie | – | – | Geforce-8-Serie, Geforce-9-Serie, Geforce-200-Serie | – | Mirage 4 | – |
| 4.1 | 10.1 | – | Radeon-HD-3000-Serie | – | – | Geforce-200-Serie | Chrome-400/500-Serie | – | – |
| 5.0 | 11.0 | – | Radeon-HD-5000-Serie | – | – | Geforce-400-Serie | – | – | – |

### Software

Weil je nach Shader-Version der Funktionsumfang und die Programmierbarkeit stark unterschiedlich ausfallen kann, steht ein Entwickler prinzipiell vor der Wahl,

* ganz auf Vertex-Shader zu verzichten und alles mit Hilfe der CPU zu berechnen. Dieser Ansatz ist heute nicht mehr gängig, weil so gut wie jede heutige 3D-Anwendung ohnehin Leistungsvoraussetzungen stellt, die hinreichend schnelle Grafikkarten voraussetzt, welche aber wiederum so aktuell sind, dass sie bereits Vertex-Shader-Einheiten enthalten.
* viele Vertex-Shader-Versionen zu unterstützen, indem er für jede zu unterstützende Version eigene, optimierte Shader schreibt (sogenannte Renderpfade). Hierbei werden alle Grafikkarten unterstützt, die mit den angepeilten Shader-Versionen kompatibel sind.
* nur Vertex-Shader-Versionen ab einer bestimmten Version zu unterstützen.

Ab DirectX Version 10 wird die sogenannte Fixed-Function-Pipeline, eine vorgegebene Vertex- und Pixel-Shader-Kombination für einfache Aufgaben, nicht mehr unterstützt. Der Programmierer muss also immer einen Vertex-Shader vorgeben.

