Vertex Shader: co to je, úkoly a princip fungování

Autor: IT Sectr Publikováno: 2026-06-11 Doba čtení: 10 min

Vertex Shader je programovatelná fáze grafické pipeline (graphics pipeline), která zpracovává každý vrchol trojrozměrného modelu. Podle Khronos Group, 2025, vertex shader přijímá na vstupu atributy vrcholů — souřadnice, normály, barvu a texturové souřadnice — a transformuje je podle dané logiky. Vertex Shader se provádí pro každý vrchol nezávisle, což umožňuje efektivní paralelizaci výpočtů na tisících jader GPU.

Hlavní body

  • Vertex Shader — programovatelná fáze GPU, zpracovávající každý vrchol 3D modelu nezávisle na ostatních.
  • Transformace souřadnic z prostoru objektu do prostoru obrazovky — hlavní úkol vertex shaderu.
  • OpenGL ES 3.0 a Metal Shading Language poskytují standardizovaná API pro psaní vertex shaderů.
  • Výkon Vertex Shader závisí na počtu vrcholů a složitosti kódu shaderu.
  • Skinning a morphing vrcholů — typické úkoly realizované ve vertex shaderu na GPU.

Co je Vertex Shader?

Vertex Shader je programovatelná fáze grafické pipeline (graphics pipeline), která zpracovává každý vrchol trojrozměrného modelu jednotlivě. Vrchol (vertex) je bod v trojrozměrném prostoru obsahující atributy: souřadnice xyz, normály, barvu a UV texturové souřadnice.

Na rozdíl od pevné pipeline (fixed-function pipeline), kde se transformace prováděly podle pevně daného algoritmu, Vertex Shader dává vývojáři plnou kontrolu nad transformací vrcholů. To umožňuje implementaci procedurální animace, deformaci modelů, kosterní skinning a jakékoli matematické transformace na straně GPU.

Místo Vertex Shader v grafické pipeline

Grafická pipeline OpenGL ES zahrnuje sekvenci fází od vstupních dat po konečný obraz. Vertex Shader se nachází po fázi sestavení vrcholů (vertex assembly) a před fází rasterizace. Každý vrchol odeslaný z CPU přes buffer vrcholů prochází Vertex Shaderem přesně jednou a výsledek je předán do další fáze pro sestavení primitiv.

Fáze pipelineÚčel
Vertex SpecificationPřenos dat vrcholů a atributů z VBO
Vertex ShaderZpracování každého vrcholu, transformace souřadnic
TessellationVolitelné dělení geometrie na podprimitiva
Geometry ShaderVolitelné generování nebo odstraňování primitiv
RasterizationPřevod primitiv na fragmenty pro vyplnění

Jak funguje Vertex Shader?

Vertex Shader přijímá na vstupu atributy vrcholu z bufferu vrcholů (VBO) pomocí ukazatelů atributů (vertex attribute pointers) nakonfigurovaných v kódu CPU. Vývojář píše kód shaderu v GLSL (OpenGL Shading Language) nebo podobném jazyce, který je kompilován ovladačem GPU do strojových instrukcí pro konkrétní čip.

Proces zpracování vrcholu

Pro každý vrchol Vertex Shader sekvenčně provádí tři operace: čtení vstupních atributů — aplikaci transformací definovaných vývojářem — zápis výsledků do výstupních proměnných. Minimální povinný výstup je pozice vrcholu v ořezovém prostoru (gl_Position). Všechna ostatní výstupní data (barva, normály, texturové souřadnice) jsou interpolována a předána do další fáze — 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;
}

Hlavní úkoly Vertex Shader

Vertex Shader řeší širokou škálu úkolů grafické pipeline souvisejících s transformací geometrie. Každý úkol je realizován prostřednictvím matematických operací nad vektory a maticemi, prováděných paralelně pro tisíce vrcholů současně.

Transformace souřadnic přes MVP

Základním a nejrozšířenějším úkolem je násobení souřadnic vrcholů maticemi model, view a projection (MVP). Matice MVP transformuje vrchol z lokálního prostoru modelu do ořezového prostoru (clip space), který je pak normalizován a převeden na obrazové souřadnice v automatických fázích pipeline.

Kosterní animace (Skinning)

Pro animované postavy Vertex Shader implementuje kosterní animaci (skinning). Každý vrchol je vázán k několika kostem s určitými váhami. Vertex blending — vážený součet transformací od vázaných kostí — umožňuje plynulou deformaci kůže postavy při pohybu kostry.

Procedurální deformace geometrie

Vertex Shader může modifikovat geometrii na základě času nebo jiných uniform parametrů bez účasti CPU. Wave deformation, šumové posuny založené na Perlinově šumu a efekty vlnění na vodě — všechny tyto efekty jsou realizovány ve vertex shaderu bez opětovného načítání geometrie z RAM.

Vertex Shader vs Fragment Shader: rozdíly

Ačkoli oba typy shaderů jsou programovatelné fáze grafické pipeline, Vertex Shader a Fragment Shader řeší zásadně odlišné úkoly a pracují v různých fázích zpracování obrazu.

CharakteristikaVertex ShaderFragment Shader
Vstupní dataAtributy vrcholů z VBOInterpolovaná data z VS
Počet voláníPočet vrcholůPočet fragmentů
Hlavní úkolTransformace geometrieVýpočet barvy pixelu
Výpočetní zátěžSložitost geometrieRozlišení obrazovky
Přístup k texturámOmezený (přes texture lookup)Plný přístup

Klíčový rozdíl je četnost volání. Vertex Shader je volán jednou na vrchol, zatímco Fragment Shader — pro každý fragment (pixel). Ve scéně s vysokým rozlišením počet volání Fragment Shader převyšuje počet volání Vertex Shader tisíckrát, což činí optimalizaci pixel shaderů ještě kritičtější.

Výkon a optimalizace Vertex Shader

Výkon Vertex Shader je kritický pro aplikace v reálném čase, zejména v mobilním vývoji s omezenou spotřebou energie. Hlavní faktory výkonu — počet vrcholů, složitost kódu shaderu a šířka pásma paměti GPU.

Faktory ovlivňující výkon

  • Vertex count — počet vrcholů odeslaných na GPU za snímek. Modely s miliony polygonů vytvářejí vysokou zátěž na vertex shader.
  • Shader complexity — počet instrukcí v shaderu. Vnořené smyčky a podmíněné skoky (divergence) snižují paralelní výkon SIMD bloků.
  • Bandwidth — rychlost čtení dat vrcholů z videopaměti. Formát atributů (float32, float16, normalizované celé číslo) přímo ovlivňuje šířku pásma.

Metody optimalizace vertex shaderů

Pro snížení zátěže Vertex Shader se používají následující přístupy. Level of Detail (LOD) — přepnutí na zjednodušené verze modelů při vzdalování kamery od objektu. Instancing — vícenásobné vykreslení stejné geometrie s různými transformačními maticemi v jednom volání vykreslení (draw call).

glsl
// Vertex Shader s podporou instancování
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;

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

Příklady kódu Vertex Shader

Vertex Shader v různých grafických API má podobnou logiku, ale odlišnou syntaxi a konvence pojmenování. Podívejme se na implementaci základního vertex shaderu v GLSL pro OpenGL ES 3.0 a v Metal Shading Language pro iOS a macOS.

Příklad v GLSL pro 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;
}

Příklad v 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;
}

Často kladené otázky

Co je Vertex Shader jednoduše řečeno?

Vertex Shader je program na GPU, který zpracovává každý vrchol 3D modelu a převádí jeho souřadnice na souřadnice obrazovky. Představte si model jako síť bodů; vertex shader pohybuje těmito body podle daných matematických pravidel.

Čím se Vertex Shader liší od Fragment Shader?

Vertex Shader zpracovává vrcholy a odpovídá za geometrii, zatímco Fragment Shader určuje barvu každého pixelu. První je volán pro každý vrchol (tisíce), druhý pro každý pixel (miliony).

V jakých jazycích se píše Vertex Shader?

Vertex Shader se píše v jazyce odpovídajícím grafickému API: GLSL pro OpenGL ES, Metal Shading Language pro Metal API na iOS/macOS, HLSL pro Direct3D. Koncepčně všechny provádějí stejné operace nad vrcholy.

Jak Vertex Shader ovlivňuje výkon?

Složitost vertex shaderu přímo ovlivňuje FPS: více instrukcí na vrchol = delší zpracování. Optimalizace zahrnuje snížení počtu vrcholů pomocí LOD, použití instancingu a minimalizaci podmíněných skoků v kódu shaderu.

Jaké úkoly řeší Vertex Shader ve hrách?

Hlavní úkoly ve hrách: transformace souřadnic pomocí MVP matic, skinning animovaných postav, procedurální deformace oblečení a vlasů, morphing mezi výrazy obličeje a efekty částic s animací na GPU.

Shrnutí

  • Vertex Shader — programovatelná fáze grafické pipeline, zpracovávající každý vrchol 3D modelu nezávisle.
  • Hlavní úkol — transformace souřadnic vrcholů z lokálního prostoru do prostoru obrazovky pomocí MVP matic.
  • Vertex Shader se provádí paralelně na mnoha jádrech GPU, zajišťuje vysoký výkon při milionech vrcholů.
  • Skinning, morphing a procedurální animace se realizují ve vertex shaderu bez účasti CPU.
  • Počet volání Vertex Shader je roven počtu vrcholů — výrazně méně než volání Fragment Shader.
  • Optimalizace zahrnuje LOD modely, instancing a minimalizaci větvení v kódu shaderu.
  • GLSL a Metal Shading Language — hlavní jazyky pro vertex shadery v mobilním vývoji.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také