Fragment Shader — was es ist, Aufgaben und Funktionsprinzip

Autor: IT Sectr Veröffentlicht: 2026-06-11 Lesezeit: 10 Min.

Fragment Shader ist eine programmierbare Stufe der Grafikpipeline, die die endgültige Farbe jedes Fragments (Pixels) eines Bildes bestimmt. Laut Khronos Group, 2025 empfängt der Fragment-Shader interpolierte Daten vom Vertex Shader und führt Berechnungen für Beleuchtung, Texturierung und Farbeffekte durch. Fragment Shader wird für jedes Pixel aufgerufen, was ihn zur ressourcenintensivsten Stufe der Grafikpipeline macht.

Wichtigste Erkenntnisse

  • Fragment Shader — eine programmierbare GPU-Stufe, die die Farbe jedes Pixels auf dem Bildschirm bestimmt.
  • Anzahl der Aufrufe entspricht der Bildschirmauflösung, was ihn zur Hauptrechenlast des Renderns macht.
  • Texturierung und Phong-Beleuchtung sind typische Aufgaben, die im Fragment-Shader implementiert werden.
  • GLSL und Metal Shading Language bieten Standardwerkzeuge zum Schreiben von Fragment Shadern.
  • Leistung des Fragment Shaders ist entscheidend für 60 FPS in mobilen Anwendungen.

Was ist Fragment Shader?

Fragment Shader (Fragment- oder Pixelshader) ist eine programmierbare Stufe der Grafikpipeline, die die endgültige Farbe jedes Bildfragments berechnet. Ein Fragment ist ein potenzielles Pixel, das nach dem Bestehen von Tiefen- und Schablonentests zu einem sichtbaren Pixel auf dem Bildschirm wird.

Der Fragment Shader wird nach der Rasterisierung ausgeführt, wenn 3D-Primitive (Dreiecke) bereits in eine Menge von Fragmenten umgewandelt wurden. Der Shader empfängt interpolierte Attribute — Texturkoordinaten, Normalen, Farben, die im Vertex Shader für die Dreiecksscheitel berechnet und für jedes Pixel innerhalb des Dreiecks linear interpoliert wurden.

Entwicklungsgeschichte des Fragment Shaders

Vor dem Aufkommen programmierbarer Shader (vor DirectX 8 / OpenGL 2.0) wurde die Pixelfarbenberechnung von einer festen Pipeline mit einem begrenzten Satz von Operationen durchgeführt. Der programmierbare Fragment Shader erschien im Jahr 2001 und erweiterte die Grafikfähigkeiten radikal: Entwickler erhielten die vollständige Kontrolle über die Farbe jedes Pixels, was fotorealistische Beleuchtung, komplexe Materialien und Posteffekte ermöglichte.

Wie funktioniert Fragment Shader?

Fragment Shader wird von der GPU für jedes vom Rasterisierer erzeugte Fragment gestartet. Jeder Shader-Aufruf verarbeitet ein Fragment, liest seine Eingabedaten, führt Benutzercode aus und schreibt den Ausgabewert — die Fragmentfarbe im RGBA-Format.

Eingabe- und Ausgabedaten

Die Eingabedaten des Fragment Shaders umfassen interpolierte Attribute vom Vertex Shader (Texturkoordinaten, Normalen, Farben), uniforme Variablen (Lichtquellen, Matrizen) und Textursampler. Die Ausgabedaten sind der Farbvektor (gl_FragColor in OpenGL ES 2.0 oder eine benutzerdefinierte Variable in ES 3.0), der in den Farbpuffer geschrieben wird.

glsl
#version 300 es
precision mediump float;

in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;

void main() {
    fragColor = texture(uTexture, vTexCoord);
}

Hauptaufgaben von Fragment Shader

Fragment Shader ist für die visuelle Qualität des Bildes verantwortlich. Alle Effekte, die der Benutzer auf dem Bildschirm sieht — Farbe, Schatten, Reflexionen, Transparenz — werden in dieser Stufe der Grafikpipeline berechnet.

Texturierung

Die häufigste Operation ist das Abtasten einer Farbe aus einer Textur mittels interpolierter UV-Koordinaten. Sampler2D und die Funktion texture() ermöglichen es, die Pixelfarbe aus einem Texturatlas zu ermitteln. Die Filterung (bilinear, trilinear, anisotrop) wird über Sampler-Parameter gesteuert und beeinflusst die Bildschärfe bei verschiedenen Betrachtungswinkeln.

Phong-Beleuchtung

Das Phong-Beleuchtungsmodell wird im Fragment Shader pro Pixel berechnet und liefert glattere Glanzlichter als die Vertex-Beleuchtung (Gouraud-Shading). Die Phong-Beleuchtung umfasst drei Komponenten: Umgebungslicht (ambient), diffuse und spiegelnde Reflexion (specular).

glsl
// Fragment shader with Phong lighting
in vec3 vNormal;
in vec3 vPosition;
uniform vec3 uLightDir;
uniform vec3 uLightColor;

void main() {
    vec3 norm = normalize(vNormal);
    float diff = max(dot(norm, uLightDir), 0.0);
    fragColor = vec4(uLightColor * diff, 1.0);
}

Post-Effekte und Blending

Der Fragment Shader ermöglicht die Nachbearbeitung: Farbkorrektur über Lookup-Tabellen (LUT), Weichzeichnen (blur), Glüheffekt (bloom) und Tonemapping für HDR-Rendering. All diese Effekte arbeiten auf Pixelebene und werden in Echtzeit ausgeführt.

Fragment Shader Leistung und Optimierung

Die Leistung des Fragment Shaders ist der Hauptfaktor, der die FPS in modernen mobilen Spielen begrenzt. Da der Shader für jedes Pixel aufgerufen wird, kann selbst eine geringfügige Erhöhung der Codekomplexität zu einem merklichen Abfall der Bildrate führen.

Hauptleistungsprobleme

  • Overdraw — erneutes Zeichnen desselben Pixels aufgrund von Objektüberlappungen. Besonders kritisch für halbtransparente Objekte.
  • Bedingte Verzweigungen — Verzweigungen im Fragment Shader verringern die SIMD-Ausführungseffizienz, da die GPU beide Zweige ausführen muss.
  • Texturabfragen — jede Texturabfrage hat eine Latenz von Dutzenden GPU-Taktzyklen. Die Minimierung der Sampler-Anzahl beschleunigt den Shader.

Optimierungsmethoden für Fragment Shader

Für mobile GPUs (Qualcomm Adreno, ARM Mali) wird empfohlen: mediump precision für Float-Variablen verwenden, Texturabfragen kombinieren, Early-Z-Tests anwenden, um unsichtbare Fragmente vor der Shader-Ausführung zu verwerfen.

MethodeBeschreibungGewinn
Mediump precision16-Bit-Genauigkeit statt 32-BitBis zu 2x Geschwindigkeit
Early-ZTiefentest vor dem ShaderWeniger Aufrufe
Texture atlasingEine Textur statt mehrererWeniger Wechsel

Fragment Shader vs Vertex Shader: Vergleich

Beide Shader-Typen sind vom Entwickler programmierbar, arbeiten aber auf unterschiedlichen Pipelinestufen und lösen unterschiedliche Aufgaben. Fragment Shader ist aufgrund der Anzahl der Aufrufe wesentlich ressourcenintensiver.

ParameterFragment ShaderVertex Shader
Anzahl der AufrufeMillionen (Bildschirmauflösung)Tausende (Anzahl der Scheitel)
EingabedatenInterpolierte AttributeScheitelattribute
HauptfunktionBerechnung der FragmentfarbeGeometrietransformation
TexturzugriffVollständig (mehrere Sampler)Eingeschränkt
LeistungseinflussHoch (abhängig von Auflösung)Mäßig (abhängig von Geometrie)

Fragment Shader Codebeispiele

Fragment Shader kann einfach (Texturabfrage) oder komplex (mehrschichtige Beleuchtung) sein. Betrachten wir zwei praktische Beispiele: grundlegende Texturierung und ein Gradienteneffekt mit Zeit.

Grundlegende Texturierung in GLSL

glsl
#version 300 es
precision mediump float;
in vec2 vTexCoord;
in vec3 vColor;
uniform sampler2D uDiffuseMap;
out vec4 fragColor;

void main() {
    vec4 texColor = texture(uDiffuseMap, vTexCoord);
    fragColor = texColor * vec4(vColor, 1.0);
}

Beispiel in Metal Shading Language

cpp
#include <metal_stdlib>
using namespace metal;

struct FragmentIn {
    float2 texCoord;
    float3 normal;
};

fragment float4
fragmentMain(FragmentIn in [[stage_in]],
              texture2d<float> tex [[texture(0)]]) {
    constexpr sampler s(filter = linear);
    float4 color = tex.sample(s, in.texCoord);
    return color;
}

Häufig gestellte Fragen

Was ist Fragment Shader einfach erklärt?

Fragment Shader ist ein Miniprogramm auf der GPU, das bestimmt, welche Farbe jedes Pixel auf dem Bildschirm hat. Wenn der Vertex Shader die Form des Objekts bestimmt, dann bestimmt der Fragment Shader, wie dieses Objekt aussieht — Textur, Beleuchtung, Farbe.

Warum ist Fragment Shader so ressourcenintensiv?

Fragment Shader wird für jedes Pixel auf dem Bildschirm aufgerufen. Auf einem Gerät mit einer Auflösung von 2532x1170 (iPhone) sind das fast 3 Millionen Aufrufe pro Frame. Bei 60 FPS wird der Shader 180 Millionen Mal pro Sekunde ausgeführt, was enorme Rechenleistung erfordert.

Welche Effekte kann man im Fragment Shader erstellen?

Im Fragment Shader werden implementiert: Texturierung, Beleuchtung (Phong, PBR), Schatten, Reflexionen, Brechungen, bloom, Tiefenschärfe, Farbkorrektur, LUT-Filter und prozedurale Texturgenerierung.

Wie optimiert man Fragment Shader auf mobilen Geräten?

Verwenden Sie mediump precision für float, reduzieren Sie die Anzahl der Texturabfragen, wenden Sie Early-Z-Culling an, kombinieren Sie Shader-Operationen und vermeiden Sie bedingte Verzweigungen innerhalb des Shaders.

Was ist der Unterschied zwischen Fragment Shader und Pixel Shader?

Es ist dasselbe. Der Begriff Fragment Shader wird in OpenGL / Vulkan verwendet, Pixel Shader in der Direct3D-Terminologie (Microsoft). Funktionell sind sie identisch: beide berechnen die Farbe jedes Fragments/Pixels.

Zusammenfassung

  • Fragment Shader — eine programmierbare GPU-Stufe, die die Farbe jedes Bildpixels berechnet.
  • Anzahl der Aufrufe entspricht der Bildschirmauflösung, was ihn zur ressourcenintensivsten Rendering-Stufe macht.
  • Texturierung, Phong-Beleuchtung und Post-Effekte sind die Hauptaufgaben des Fragment-Shaders.
  • Leistung hängt direkt von der Anzahl der Texturabfragen und der Verwendung von highp precision ab.
  • Mediump precision und Early-Z-Tests sind die wichtigsten Optimierungstechniken für mobile GPUs.
  • OpenGL ES verwendet den Begriff Fragment Shader, Direct3D verwendet Pixel Shader — die Bedeutung ist dieselbe.
  • GLSL und Metal Shading Language sind die Hauptsprachen zum Schreiben von Fragment Shadern in der mobilen Entwicklung.

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.

Projekt besprechen

Lesen Sie auch