Vertex Shader ist eine programmierbare Stufe der Grafikpipeline, die jeden Scheitelpunkt eines 3D-Modells unabhängig verarbeitet. Laut Khronos Group, 2025 nimmt der Vertex-Shader Scheitelpunktattribute als Eingabe — Koordinaten, Normalen, Farbe und Texturkoordinaten — und transformiert sie gemäß der definierten Logik. Vertex Shader wird für jeden Scheitelpunkt unabhängig ausgeführt, wodurch Berechnungen effizient auf Tausenden von GPU-Kernen parallelisiert werden können.
Wichtige Punkte
Vertex Shader ist eine programmierbare Stufe der Grafikpipeline, die jeden Scheitelpunkt eines 3D-Modells einzeln verarbeitet. Ein Scheitelpunkt (Vertex) ist ein Punkt im dreidimensionalen Raum, der Attribute enthält: xyz-Koordinaten, Normalen, Farbe und UV-Texturkoordinaten.
Im Gegensatz zur Fixed-Function-Pipeline, bei der Transformationen nach einem starren Algorithmus durchgeführt wurden, gibt der Vertex Shader dem Entwickler die vollständige Kontrolle über die Scheitelpunkttransformation. Dies ermöglicht die Implementierung von prozeduraler Animation, Modellverformung, Skelett-Skinning und beliebigen mathematischen Transformationen auf der GPU-Seite.
Die OpenGL ES Grafikpipeline umfasst eine Abfolge von Stufen von den Eingabedaten bis zum endgültigen Bild. Vertex Shader befindet sich nach der Scheitelpunkt-Assemblierungsstufe und vor der Rasterisierungsstufe. Jeder von der CPU über einen Scheitelpunktpuffer gesendete Scheitelpunkt durchläuft den Vertex Shader genau einmal, und das Ergebnis wird zur Primitivassemblierung an die nächste Stufe weitergeleitet.
| Pipeline-Stufe | Zweck |
|---|---|
| Vertex Specification | Übertragung von Scheitelpunktdaten und Attributen aus VBO |
| Vertex Shader | Verarbeitung jedes Scheitelpunkts, Koordinatentransformation |
| Tessellation | Optionale Unterteilung der Geometrie in Unterprimitiven |
| Geometry Shader | Optionale Generierung oder Entfernung von Primitiven |
| Rasterization | Umwandlung von Primitiven in Fragmente zum Füllen |
Vertex Shader empfängt Scheitelpunktattribute aus dem Scheitelpunktpuffer (VBO) über Scheitelpunktattributzeiger, die im CPU-Code konfiguriert sind. Der Entwickler schreibt Shader-Code in GLSL (OpenGL Shading Language) oder einer gleichwertigen Sprache, die der GPU-Treiber in Maschinenanweisungen für den jeweiligen Chip kompiliert.
Für jeden Scheitelpunkt führt der Vertex Shader nacheinander drei Operationen aus: Lesen der Eingabeattribute — Anwenden der vom Entwickler definierten Transformationen — Schreiben der Ergebnisse in Ausgabevariablen. Die mindestens erforderliche Ausgabe ist die Scheitelpunktposition im Clip-Raum (gl_Position). Alle anderen Ausgabedaten (Farbe, Normalen, Texturkoordinaten) werden interpoliert und an die nächste Stufe — den Fragment Shader — übergeben.
#version 300 es
in vec3 aPosition;
in vec2 aTexCoord;
uniform mat4 uMVP;
out vec2 vTexCoord;
void main() {
gl_Position = uMVP * vec4(aPosition, 1.0);
vTexCoord = aTexCoord;
}
Vertex Shader löst eine breite Palette von Grafikpipeline-Aufgaben im Zusammenhang mit Geometrietransformation. Jede Aufgabe wird durch mathematische Operationen an Vektoren und Matrizen implementiert, die parallel für Tausende von Scheitelpunkten gleichzeitig ausgeführt werden.
Die grundlegende und häufigste Aufgabe ist die Multiplikation der Scheitelpunktkoordinaten mit den Model-, View- und Projection-Matrizen (MVP). Die MVP-Matrix transformiert einen Scheitelpunkt vom lokalen Modellraum in den Clip-Raum, der dann in den automatischen Pipeline-Stufen normalisiert und in Bildschirmkoordinaten umgewandelt wird.
Für animierte Charaktere implementiert der Vertex Shader die Skelettanimation (Skinning). Jeder Scheitelpunkt ist mit bestimmten Gewichten an mehrere Knochen gebunden. Vertex Blending — eine gewichtete Summe der Transformationen der gebundenen Knochen — ermöglicht eine glatte Verformung der Haut des Charakters, wenn sich das Skelett bewegt.
Der Vertex Shader kann Geometrie basierend auf Zeit oder anderen Uniform-Parametern ohne CPU-Beteiligung modifizieren. Wellenverformung, Perlin-Rausch-Verschiebung und Wasserwelleneffekte — all diese Effekte werden im Vertex-Shader implementiert, ohne Geometrie aus dem RAM neu zu laden.
Obwohl beide Shader-Typen programmierbare Stufen der Grafikpipeline sind, lösen Vertex Shader und Fragment Shader grundlegend unterschiedliche Aufgaben und arbeiten auf verschiedenen Stufen der Bildverarbeitung.
| Merkmal | Vertex Shader | Fragment Shader |
|---|---|---|
| Eingabedaten | Scheitelpunktattribute aus VBO | Interpolierte Daten aus VS |
| Anzahl der Aufrufe | Anzahl der Scheitelpunkte | Anzahl der Fragmente |
| Hauptaufgabe | Geometrietransformation | Pixel-Farbberechnung |
| Rechenlast | Geometriekomplexität | Bildschirmauflösung |
| Texturzugriff | Eingeschränkt (über Texture Lookup) | Vollständiger Zugriff |
Der Hauptunterschied ist die Aufruffrequenz. Der Vertex Shader wird einmal pro Scheitelpunkt aufgerufen, während der Fragment Shader für jedes Fragment (Pixel) aufgerufen wird. In einer hochauflösenden Szene übersteigt die Anzahl der Fragment-Shader-Aufrufe die Anzahl der Vertex-Shader-Aufrufe um das Tausendfache, was die Optimierung von Pixelshäddern noch kritischer macht.
Die Leistung des Vertex Shader ist für Echtzeitanwendungen äußerst wichtig, insbesondere in der mobilen Entwicklung mit begrenztem Energieverbrauch. Die Hauptleistungsfaktoren sind die Anzahl der Scheitelpunkte, die Komplexität des Shader-Codes und die GPU-Speicherbandbreite.
Zur Reduzierung der Last auf den Vertex Shader werden folgende Ansätze verwendet. Level of Detail (LOD) — Umschalten auf vereinfachte Modellversionen, wenn sich die Kamera vom Objekt entfernt. Instancing — wiederholtes Zeichnen derselben Geometrie mit verschiedenen Transformationsmatrizen in einem einzigen Draw-Aufruf.
// Vertex Shader mit Instancing-Unterstützung
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;
void main() {
vec4 worldPos = aInstanceMatrix * vec4(aPosition, 1.0);
gl_Position = uViewProjection * worldPos;
}
Vertex Shader hat über verschiedene Grafik-APIs hinweg eine ähnliche Logik, aber unterschiedliche Syntax und Namenskonventionen. Sehen wir uns die Implementierung eines einfachen Vertex-Shaders in GLSL für OpenGL ES 3.0 und in Metal Shading Language für iOS und macOS an.
#version 300 es
in vec4 position;
in vec3 normal;
in vec2 texcoord;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;
out vec3 vNormal;
out vec2 vTexCoord;
out vec3 vPosition;
void main() {
vec4 mvPosition = modelViewMatrix * position;
vPosition = mvPosition.xyz;
vNormal = normalMatrix * normal;
vTexCoord = texcoord;
gl_Position = projectionMatrix * mvPosition;
}
#include <metal_stdlib>
using namespace metal;
struct VertexIn {
float3 position [[attribute(0)]];
float3 normal [[attribute(1)]];
};
struct VertexOut {
float4 position [[position]];
float3 worldNormal;
};
vertex VertexOut
vertexMain(VertexIn in [[stage_in]],
constant float4x4& mvp [[buffer(1)]]) {
VertexOut out;
out.position = mvp * float4(in.position, 1.0);
out.worldNormal = in.normal;
return out;
}
Häufig gestellte Fragen
Vertex Shader ist ein Programm auf der GPU, das jeden Scheitelpunkt eines 3D-Modells verarbeitet und seine Koordinaten in Bildschirmkoordinaten umwandelt. Stellen Sie sich ein Modell als ein Netz von Punkten vor; der Vertex-Shader bewegt diese Punkte nach definierten mathematischen Regeln.
Vertex Shader verarbeitet Scheitelpunkte und ist für die Geometrie zuständig, während Fragment Shader die Farbe jedes Pixels bestimmt. Ersterer wird für jeden Scheitelpunkt (Tausende) aufgerufen, letzterer für jedes Pixel (Millionen).
Vertex Shader wird in einer der Grafik-API entsprechenden Sprache geschrieben: GLSL für OpenGL ES, Metal Shading Language für Metal API auf iOS/macOS, HLSL für Direct3D. Konzeptionell führen sie alle die gleichen Operationen an Scheitelpunkten durch.
Die Komplexität des Vertex-Shaders wirkt sich direkt auf die FPS aus: mehr Anweisungen pro Scheitelpunkt = längere Verarbeitungszeit. Optimierung umfasst die Reduzierung der Scheitelpunktanzahl durch LOD, die Verwendung von Instancing und die Minimierung bedingter Verzweigungen im Shader-Code.
Hauptaufgaben in Spielen: Koordinatentransformation durch MVP-Matrizen, Skinning animierter Charaktere, prozedurale Verformung von Kleidung und Haaren, Morphing zwischen Gesichtsausdrücken und Partikeleffekte mit GPU-Animation.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch