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 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.
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 Specification | Přenos dat vrcholů a atributů z VBO |
| Vertex Shader | Zpracování každého vrcholu, transformace souřadnic |
| Tessellation | Volitelné dělení geometrie na podprimitiva |
| Geometry Shader | Volitelné generování nebo odstraňování primitiv |
| Rasterization | Převod primitiv na fragmenty pro vyplnění |
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.
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.
#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 ř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ě.
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.
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.
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.
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.
| Charakteristika | Vertex Shader | Fragment Shader |
|---|---|---|
| Vstupní data | Atributy vrcholů z VBO | Interpolovaná data z VS |
| Počet volání | Počet vrcholů | Počet fragmentů |
| Hlavní úkol | Transformace geometrie | Výpočet barvy pixelu |
| Výpočetní zátěž | Složitost geometrie | Rozlišení obrazovky |
| Přístup k texturám | Omezený (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 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.
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).
// 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;
}
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.
#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;
}
Často kladené otázky
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.
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).
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.
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.
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í
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í.
Přečtěte si také