Fragment Shader — is een programmeerbare fase van de grafische pijplijn die de uiteindelijke kleur van elk fragment (pixel) van een afbeelding bepaalt. Volgens gegevens van Khronos Group, 2025, ontvangt de fragmentshader geïnterpoleerde gegevens van de Vertex Shader en voert berekeningen uit voor belichting, texturering en kleureffecten. Fragment Shader wordt voor elke pixel aangeroepen, wat het de meest resource-intensieve fase van de grafische pijplijn maakt.
Belangrijkste punten
Fragment Shader (fragment- of pixelshader) — is een programmeerbare fase van de grafische pijplijn die de uiteindelijke kleur van elk fragment van de afbeelding berekent. Een fragment is een potentiële pixel die, na het doorstaan van diepte- en stenciltests, een zichtbare pixel op het scherm wordt.
Fragment Shader wordt uitgevoerd na rasterisatie, wanneer driedimensionale primitieven (driehoeken) al zijn omgezet in een set fragmenten. De shader ontvangt aan de ingang geïnterpoleerde attributen — textuurcoördinaten, normalen, kleuren die in de Vertex Shader voor de hoekpunten van de driehoek zijn berekend en lineair geïnterpoleerd voor elke pixel erin.
Vóór de komst van programmeerbare shaders (vóór DirectX 8 / OpenGL 2.0) werd de pixelkleurberekening uitgevoerd door een vaste pijplijn met een beperkte set bewerkingen. Programmeerbare Fragment Shader verscheen in 2001 en breidde de grafische mogelijkheden radicaal uit: ontwikkelaars kregen volledige controle over de kleur van elke pixel, wat fotorealistische belichting, complexe materialen en post-effecten mogelijk maakte.
Fragment Shader wordt door de GPU gestart voor elk fragment dat door de rasterizer is gegenereerd. Elke shader-aanroep verwerkt één fragment, leest de invoergegevens, voert de gebruikerscode uit en schrijft de uitvoerwaarde — de kleur van het fragment in RGBA-formaat.
De invoergegevens van Fragment Shader omvatten geïnterpoleerde attributen van de Vertex Shader (textuurcoördinaten, normalen, kleuren), uniforme variabelen (lichtbronnen, matrices) en textuur samplers. De uitvoergegevens — kleurvector (gl_FragColor in OpenGL ES 2.0 of gebruikersvariabele in ES 3.0) die naar de kleurbuffer wordt geschreven.
#version 300 es
precision mediump float;
in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;
void main() {
fragColor = texture(uTexture, vTexCoord);
}
Fragment Shader is verantwoordelijk voor de visuele kwaliteit van het beeld. Alle effecten die de gebruiker op het scherm ziet — kleur, schaduwen, reflecties, transparantie — worden precies in deze fase van de grafische pijplijn berekend.
De meest voorkomende bewerking — het ophalen van kleur uit een textuur op basis van geïnterpoleerde UV-coördinaten. Sampler2D en de functie texture() maken het mogelijk de pixelkleur uit een texture-atlas te verkrijgen. Filtratie (bilineair, trilineair, anisotroop) wordt geregeld via samplerparameters en beïnvloedt de scherpte van het beeld onder verschillende kijkhoeken.
Het Phong-belichtingsmodel (Phong shading) wordt in Fragment Shader voor elke pixel berekend, wat gladdere highlights geeft dan vertexbelichting (Gouraud shading). Phong lighting omvat drie componenten: ambient (omgevingslicht), diffuse (diffuus) en specular (spiegelend).
// Fragment shader met Phong-belichting
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);
}
Fragment Shader maakt het mogelijk nabewerking toe te passen: kleurcorrectie via LUT-tabellen, vervaging (blur), gloei-effect (bloom) en tonemapping voor HDR-rendering. Al deze effecten werken op pixelniveau en worden in realtime uitgevoerd.
Prestaties van Fragment Shader — de belangrijkste factor die FPS beperkt in moderne mobiele games. Omdat de shader voor elke pixel wordt aangeroepen, kan zelfs een kleine toename in codecomplexiteit leiden tot een merkbare daling van de framerate.
Voor mobiele GPU's (Qualcomm Adreno, ARM Mali) wordt aanbevolen: gebruik mediump precision voor float-variabelen, combineer texture lookups, pas early-z-tests toe om onzichtbare fragmenten vóór shader-uitvoering te verwijderen.
| Methode | Beschrijving | Winst |
|---|---|---|
| Mediump precision | 16-bits precisie in plaats van 32-bits | Tot 2x snelheid |
| Early-Z | Dieptetest vóór de shader | Vermindering aanroepen |
| Texture atlasing | Eén textuur in plaats van meerdere | Minder omschakelingen |
Beide shader-types worden door de ontwikkelaar geprogrammeerd, maar werken in verschillende fasen van de pijplijn en lossen verschillende taken op. Fragment Shader is aanzienlijk resource-intensiever vanwege het aantal aanroepen.
| Parameter | Fragment Shader | Vertex Shader |
|---|---|---|
| Aantal aanroepen | Miljoenen (schermresolutie) | Duizenden (aantal hoekpunten) |
| Invoergegevens | Geïnterpoleerde attributen | Hoekpuntattributen |
| Hoofdfunctie | Berekening fragmentkleur | Transformatie van geometrie |
| Toegang tot texturen | Volledig (meerdere samplers) | Beperkt |
| Impact op prestaties | Hoog (afhankelijk van resolutie) | Matig (afhankelijk van geometrie) |
Fragment Shader kan eenvoudig zijn (textuur lookup) of complex (meerlaagse belichting). Laten we twee praktische voorbeelden bekijken: basistexturering en een gradiënteffect met behulp van tijd.
#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);
}
#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;
}
Veelgestelde vragen
Fragment Shader — is een mini-programma op de GPU dat bepaalt welke kleur elke pixel op het scherm krijgt. Als Vertex Shader de vorm van het object bepaalt, dan bepaalt Fragment Shader hoe dat object eruitziet — textuur, belichting, kleur.
Fragment Shader wordt voor elke pixel op het scherm aangeroepen. Op een apparaat met een resolutie van 2532x1170 (iPhone) zijn dat bijna 3 miljoen aanroepen per frame. Bij 60 FPS wordt de shader 180 miljoen keer per seconde uitgevoerd, wat enorme rekenkracht vereist.
In Fragment Shader worden geïmplementeerd: textureren, belichting (Phong, PBR), schaduwen, reflecties, refracties, bloom, scherptediepte, kleurcorrectie, LUT-filters en procedurele textuur generatie.
Gebruik mediump precision voor float, verminder het aantal texture lookups, pas early-z afwijzing toe, combineer shader-bewerkingen en vermijd voorwaardelijke vertakkingen in de shader.
Het is hetzelfde. De term Fragment Shader wordt gebruikt in OpenGL / Vulkan, en Pixel Shader in de terminologie van Direct3D (Microsoft). Functioneel zijn ze identiek: beide berekenen de kleur van elk fragment/pixel.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook