Vertex Shader: wat is het, taken en werkingsprincipe

Auteur: IT Sectr Gepubliceerd: 2026-06-11 Leestijd: 10 min

Vertex Shader is een programmeerbare fase van de grafische pijplijn (graphics pipeline) die elk hoekpunt van een driedimensionaal model verwerkt. Volgens Khronos Group, 2025, ontvangt de vertex shader de attributen van hoekpunten — coördinaten, normalen, kleur en textuurcoördinaten — en transformeert ze volgens de opgegeven logica. Vertex Shader wordt voor elk hoekpunt onafhankelijk uitgevoerd, wat efficiënte parallelle verwerking op duizenden GPU-kernen mogelijk maakt.

Belangrijkste punten

  • Vertex Shader — programmeerbare fase van de GPU die elk hoekpunt van een 3D-model onafhankelijk van anderen verwerkt.
  • Coördinatentransformatie van objectruimte naar schermruimte — de hoofdtaak van de vertex shader.
  • OpenGL ES 3.0 en Metal Shading Language bieden gestandaardiseerde API's voor het schrijven van vertex shaders.
  • Prestaties van Vertex Shader hangen af van het aantal hoekpunten en de complexiteit van de shader code.
  • Skinnen en morphing van hoekpunten — typische taken die in de vertex shader op de GPU worden geïmplementeerd.

Wat is Vertex Shader?

Vertex Shader is een programmeerbare fase van de grafische pijplijn (graphics pipeline) die elk hoekpunt van een driedimensionaal model afzonderlijk verwerkt. Een hoekpunt (vertex) is een punt in de driedimensionale ruimte met attributen: xyz-coördinaten, normalen, kleur en UV-textuurcoördinaten.

In tegenstelling tot de vaste functie pijplijn (fixed-function pipeline), waar transformaties werden uitgevoerd volgens een vast algoritme, geeft Vertex Shader de ontwikkelaar volledige controle over de transformatie van hoekpunten. Dit maakt procedurele animatie, modelvervorming, skelet-skinnen en wiskundige transformaties aan de GPU-zijde mogelijk.

Plaats van Vertex Shader in de grafische pijplijn

De grafische pijplijn van OpenGL ES omvat een reeks fasen van invoergegevens tot het uiteindelijke beeld. Vertex Shader bevindt zich na de fase van hoekpuntsamenstelling (vertex assembly) en vóór de rasterisatiefase. Elk hoekpunt dat via de vertex buffer van de CPU wordt verzonden, gaat precies één keer door de Vertex Shader en het resultaat wordt doorgegeven aan de volgende fase voor de samenstelling van primitieven.

PijplijnfaseDoel
Vertex SpecificationDoorgeven van vertexgegevens en attributen uit VBO
Vertex ShaderVerwerking van elk hoekpunt, coördinatentransformatie
TessellationOptionele onderverdeling van geometrie in subprimitieven
Geometry ShaderOptionele generatie of verwijdering van primitieven
RasterizationOmzetten van primitieven naar fragmenten voor opvulling

Hoe werkt Vertex Shader?

Vertex Shader ontvangt de attributen van het hoekpunt uit de vertex buffer (VBO) via attribuut pointers (vertex attribute pointers) die in de CPU-code zijn geconfigureerd. De ontwikkelaar schrijft de shader code in GLSL (OpenGL Shading Language) of een vergelijkbare taal, die door de GPU-driver wordt gecompileerd naar machine-instructies voor de specifieke chip.

Het verwerkingsproces van een hoekpunt

Voor elk hoekpunt voert Vertex Shader achtereenvolgens drie bewerkingen uit: lezen van invoerattributen — toepassen van door de ontwikkelaar gedefinieerde transformaties — schrijven van resultaten naar uitvoervariabelen. De minimaal verplichte uitvoer is de positie van het hoekpunt in de clip space (gl_Position). Alle andere uitvoergegevens (kleur, normalen, textuurcoördinaten) worden geïnterpoleerd en doorgegeven aan de volgende fase — Fragment Shader.

glsl
#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;
}

Belangrijkste taken van Vertex Shader

Vertex Shader lost een breed scala aan taken van de grafische pijplijn op die verband houden met geometrietransformatie. Elke taak wordt geïmplementeerd via wiskundige bewerkingen op vectoren en matrices, die parallel worden uitgevoerd voor duizenden hoekpunten tegelijk.

Coördinatentransformatie via MVP

De basis en meest voorkomende taak is het vermenigvuldigen van hoekpuntcoördinaten met de model-, view- en projectiematrices (MVP). MVP-matrix transformeert het hoekpunt van de lokale modelruimte naar de clip space, die vervolgens wordt genormaliseerd en omgezet naar schermcoördinaten in de automatische pijplijnfasen.

Skeletanimatie (Skinnen)

Voor geanimeerde personages implementeert Vertex Shader skeletanimatie (skinnen). Elk hoekpunt is gekoppeld aan meerdere botten met specifieke gewichten. Vertex blending — de gewogen som van transformaties van gekoppelde botten — maakt vloeiende vervorming van de huid van het personage mogelijk bij beweging van het skelet.

Procedurele vervorming van geometrie

Vertex Shader kan geometrie wijzigen op basis van tijd of andere uniform-parameters zonder tussenkomst van de CPU. Wave deformation, ruisverplaatsingen op basis van Perlin noise en rimpelingseffecten op water — al deze effecten worden geïmplementeerd in de vertex shader zonder geometrie uit het RAM te herladen.

Vertex Shader vs Fragment Shader: verschillen

Hoewel beide shader-types programmeerbare fasen van de grafische pijplijn zijn, lossen Vertex Shader en Fragment Shader fundamenteel verschillende taken op en werken ze in verschillende stadia van beeldverwerking.

KenmerkVertex ShaderFragment Shader
InvoergegevensVertexattributen uit VBOGeïnterpoleerde gegevens uit VS
Aantal aanroepenAantal hoekpuntenAantal fragmenten
HoofdtaakGeometrietransformatieBerekening van pixelkleur
RekenbelastingComplexiteit van geometrieSchermresolutie
Toegang tot texturenBeperkt (via texture lookup)Volledige toegang

Het belangrijkste verschil is de aanroepfrequentie. Vertex Shader wordt één keer per hoekpunt aangeroepen, terwijl Fragment Shader wordt aangeroepen voor elk fragment (pixel). In een scène met hoge resolutie overtreft het aantal Fragment Shader-aanroepen het aantal Vertex Shader-aanroepen duizenden keren, wat optimalisatie van pixelshaders nog kritischer maakt.

Prestaties en optimalisatie van Vertex Shader

Prestaties van Vertex Shader zijn cruciaal voor realtime toepassingen, vooral in mobiele ontwikkeling met beperkt energieverbruik. De belangrijkste prestatie factoren zijn het aantal hoekpunten, de complexiteit van de shader code en de bandbreedte van het GPU-geheugen.

Factoren die de prestaties beïnvloeden

  • Vertex count — het aantal hoekpunten dat per frame naar de GPU wordt verzonden. Modellen met miljoenen polygonen creëren een hoge belasting op de vertex shader.
  • Shader complexity — het aantal instructies in de shader. Geneste lussen en voorwaardelijke sprongen (divergence) verminderen de parallelle prestaties van SIMD-blokken.
  • Bandwidth — de snelheid van het lezen van vertexgegevens uit het videogeheugen. Het attribuutformaat (float32, float16, genormaliseerd geheel getal) beïnvloedt rechtstreeks de bandbreedte.

Optimalisatiemethoden voor vertex shaders

Om de belasting van Vertex Shader te verminderen, worden de volgende benaderingen toegepast. Level of Detail (LOD) — overschakelen naar vereenvoudigde versies van modellen wanneer de camera van het object af beweegt. Instancing — het meerdere keren tekenen van dezelfde geometrie met verschillende transformatiematrices in één tekenaanroep (draw call).

glsl
// Vertex Shader met instantie-ondersteuning
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;

void main() {
    vec4 worldPos = aInstanceMatrix * vec4(aPosition, 1.0);
    gl_Position = uViewProjection * worldPos;
}

Voorbeelden van Vertex Shader code

Vertex Shader heeft in verschillende grafische API's een vergelijkbare logica, maar een andere syntaxis en naamgevingsconventies. Laten we de implementatie van een basis vertex shader in GLSL voor OpenGL ES 3.0 en in Metal Shading Language voor iOS en macOS bekijken.

Voorbeeld in GLSL voor OpenGL ES 3.0

glsl
#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;
}

Voorbeeld in Metal Shading Language

cpp
#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;
}

Veelgestelde vragen

Wat is Vertex Shader in eenvoudige bewoordingen?

Vertex Shader is een programma op de GPU dat elk hoekpunt van een 3D-model verwerkt en de coördinaten omzet in schermcoördinaten. Stel je het model voor als een raster van punten; de vertex shader verplaatst deze punten volgens bepaalde wiskundige regels.

Wat is het verschil tussen Vertex Shader en Fragment Shader?

Vertex Shader verwerkt hoekpunten en is verantwoordelijk voor de geometrie, terwijl Fragment Shader de kleur van elke pixel bepaalt. De eerste wordt aangeroepen voor elk hoekpunt (duizenden), de tweede voor elke pixel (miljoenen).

In welke talen wordt Vertex Shader geschreven?

Vertex Shader wordt geschreven in de taal die overeenkomt met de grafische API: GLSL voor OpenGL ES, Metal Shading Language voor Metal API op iOS/macOS, HLSL voor Direct3D. Conceptueel voeren ze allemaal dezelfde bewerkingen uit op hoekpunten.

Hoe beïnvloedt Vertex Shader de prestaties?

De complexiteit van de vertex shader beïnvloedt direct de FPS: meer instructies per hoekpunt = langere verwerking. Optimalisatie omvat het verminderen van het aantal hoekpunten via LOD, het gebruik van instancing en het minimaliseren van voorwaardelijke sprongen in de shader code.

Welke taken lost Vertex Shader op in games?

De belangrijkste taken in games: coördinatentransformatie via MVP-matrices, skinnen van geanimeerde personages, procedurele vervorming van kleding en haar, morphing tussen gezichtsuitdrukkingen en deeltjeseffecten met animatie op de GPU.

Samenvatting

  • Vertex Shader — programmeerbare fase van de grafische pijplijn, verwerkt elk hoekpunt van een 3D-model onafhankelijk.
  • Hoofdtaak — transformeren van hoekpuntcoördinaten van lokale ruimte naar schermruimte via MVP-matrices.
  • Vertex Shader wordt parallel uitgevoerd op meerdere GPU-kernen, wat hoge prestaties garandeert bij miljoenen hoekpunten.
  • Skinnen, morphing en procedurele animatie worden geïmplementeerd in de vertex shader zonder CPU tussenkomst.
  • Aantal aanroepen van Vertex Shader is gelijk aan het aantal hoekpunten — aanzienlijk minder dan Fragment Shader aanroepen.
  • Optimalisatie omvat LOD-modellen, instancing en minimalisatie van vertakkingen in de shader code.
  • GLSL en Metal Shading Language — de belangrijkste talen voor vertex shaders in mobiele ontwikkeling.

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.

Bespreek het project

Lees ook