Shader: co to je, druhy shaderů a jak fungují

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

Shader (shader) — je program, který běží na GPU pro zpracování grafických dat: vrcholů, fragmentů nebo výpočetních úloh. Na rozdíl od běžného kódu na CPU pracuje shader paralelně na stovkách jader a zpracovává každý prvek nezávisle. Podle údajů Khronos Group (2025) se shadery používají ve 100% moderních 3D aplikací — od mobilních her po UI efekty v systémových aplikacích. Vývojáři píší shadery ve specializovaných jazycích: GLSL, HLSL, Metal Shading Language nebo SPIR-V.

Hlavní

  • Shader — program pro GPU, běžící paralelně na stovkách jader pro každý prvek scény.
  • Druhy shaderů: vrcholové, fragmentové, compute, geometry, tessellation a mesh-shadery.
  • Jazyky: GLSL (OpenGL), HLSL (DirectX), MSL (Metal), SPIR-V (Vulkan) — všechny se kompilují do strojového kódu GPU.
  • Shadery v mobilním vývoji se používají pro efekty, post-processing, osvětlení a výpočty.
  • Optimalizace shaderů: přesnost mediump, minimalizace větvení a ATF (Adaptive Texture Fetch) pro mobilní GPU.

Co je Shader?

Shader — je malý program napsaný ve specializovaném jazyce a spouštěný na GPU. Každý shader zpracovává jeden datový prvek — vrchol, fragment (pixel) nebo pracovní prvek — nezávisle na ostatních. Paralelismus GPU umožňuje spouštět tisíce instancí shaderu současně.

Termín zavedlo Pixar v 80. letech 20. století pro popis programů řídících vzhled povrchů v RenderManu. V reálném čase se shadery objevily s NVIDIA GeForce 3 (2001) — první grafickou kartou s programovatelným pipeline. Před shadery se grafika konfigurovala pomocí pevných parametrů: barva, textura, režim míchání.

Podle údajů Unity Technologies (2025) používá průměrná mobilní hra 50–200 shaderů. Každý shader má varianty (variants) pro různé platformy, úrovně kvality a konfigurace osvětlení. Počet variant může dosáhnout 10 000 na projekt.

Architektura shaderu se dělí na vstupní data (atributy, uniform proměnné, textury), programový kód a výstupní data (barva, pozice). Uniform proměnné se nastavují z CPU před spuštěním shaderu a jsou neměnné pro všechny prvky snímku. Atributy jsou data na prvek (souřadnice vrcholu, normála, UV souřadnice).

Model provádění SIMT

SIMT (Single Instruction, Multiple Threads) — model provádění shaderů na GPU. Jedna instrukce se načte jednou, ale provádí se stovkami vláken na různých datech. Například Fragment Shader pro 1000 pixelů spouští 1000 vláken se stejným kódem, ale každé vlákno dostává své vlastní UV souřadnice a interpolované atributy.

Důležitý důsledek SIMT: větvení v shaderech jsou drahá. Pokud uvnitř bloku if polovina vláken jde jednou větví a polovina druhou, GPU provádí obě větve sekvenčně pro všechna vlákna. Výkon klesá na 50%. Vyhýbejte se dynamickým větvením v shaderech nebo je minimalizujte pomocí předběžných výpočtů na CPU.

Druhy shaderů

Moderní GPU podporují několik typů shaderů, každý pro svou fázi grafického nebo výpočetního pipeline. Podívejme se na hlavní druhy: vrcholové, fragmentové, compute a moderní mesh-shadery.

Typ shaderuFáze pipelineZpracováváJazyk
Vertex ShaderVrcholovýKaždý vrcholGLSL, HLSL
Fragment ShaderFragmentovýKaždý pixelGLSL, HLSL
Compute ShaderVýpočetníLibovolná dataGLSL, HLSL
Geometry ShaderGeometrickýPrimitivaGLSL, HLSL
Tessellation ShaderTeselacePloškyGLSL, HLSL
Mesh ShaderMesh pipelineTask + MeshHLSL, MSL

Vertex Shader

Vertex Shader zpracovává každý vrchol geometrie: transformuje souřadnice, vypočítává osvětlení, předává data fragment shaderu. Toto je povinná fáze grafického pipeline — bez ní se vrcholy nedostanou na obrazovku. Vertex Shader je volán pro každý vrchol každého snímku.

Fragment Shader

Fragment Shader (nebo Pixel Shader) — nejnáročnější fáze na zdroje. Vypočítává konečnou barvu každého fragmentu pomocí textur, osvětlení a materiálu. Fragment Shader se provádí pro každý pixel pokrytý geometrií, s ohledem na všechny aplikované textury a efekty. Optimalizace tohoto shaderu přináší největší nárůst výkonu.

Compute Shader

Compute Shader — univerzální shader pro libovolné výpočty na GPU. Na rozdíl od grafických shaderů není vázán na geometrii nebo pixely. Compute Shader pracuje s libovolnými datovými buffery pomocí pracovních skupin. Používá se pro fyziku, simulaci částic, post-efekty a inferenci neuronových sítí.

Mesh Shader

Mesh Shader — nejnovější typ shaderu, který se objevil v NVIDIA Turing (2018) a Metal 3. Mesh Shader nahrazuje vrcholový, geometrický a teselační shader jedním mesh pipeline. Pracuje ve dvojici s Task Shader: Task Shader rozhoduje, které mesh skupiny vykreslit, Mesh Shader generuje geometrii za běhu.

Jazyky pro psaní shaderů

Shadery se píší ve specializovaných jazycích, které se kompilují do strojového kódu GPU. Výběr jazyka závisí na platformě a API. Podívejme se na hlavní jazyky: GLSL, HLSL, Metal Shading Language a meziformát SPIR-V.

GLSL (OpenGL Shading Language)

GLSL — jazyk shaderů pro OpenGL, OpenGL ES a WebGL. Syntaxe je založena na C s přidáním vektorových typů (vec2, vec4, mat4) a vestavěných funkcí (texture, normalize, reflect). GLSL ES — verze pro mobilní zařízení s omezenou přesností (lowp, mediump, highp). Podle údajů Khronos (2025) zůstává GLSL nejrozšířenějším jazykem shaderů díky cross-platformovosti.

glsl
#version 300 es
precision mediump float;
in vec2 v_texCoord;
uniform sampler2D u_texture;
out vec4 fragColor;

void main() {
    fragColor = texture(u_texture, v_texCoord);
}

Jednoduchý fragment shader čte barvu z textury podle UV souřadnic. precision mediump nařizuje GPU používat poloviční přesnost pro float — zrychluje provádění na mobilních zařízeních o 25–40%.

HLSL (High-Level Shader Language)

HLSL — jazyk shaderů od Microsoftu pro DirectX. Syntaxe je bližší C++ s podporou tříd, struktur a šablon. HLSL se používá v aplikacích pro Windows a přes Shader Model 6.7+ podporuje Ray Tracing, Mesh Shaders a Sampler Feedback. Pro mobilní vývoj se HLSL nepoužívá přímo, ale kompiluje se do SPIR-V pro Vulkan.

Metal Shading Language

MSL (Metal Shading Language) — jazyk shaderů od Apple, založený na C++14. Na rozdíl od GLSL a HLSL se MSL kompiluje spolu s aplikací, což eliminuje JIT kompilaci na zařízení. MSL podporuje ukazatele, šablony a standardní knihovnu C++. Používá se na všech zařízeních Apple: iPhone, iPad, Mac, Apple TV.

cpp
#include <metal_stdlib>
using namespace metal;
struct VertexOut {
    float4 position [[position]];
    float2 texCoord;
};

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

MSL používá atributy [[position]], [[stage_in]] a [[texture(N)]] pro vázání zdrojů. Překladač Apple generuje optimalizovaný kód pro aktuální GPU s ohledem na počet registrů a cache.

SPIR-V

SPIR-V — mezilehlý binární formát shaderů, standard pro Vulkan. Shadery se píší v GLSL nebo HLSL, kompilují do SPIR-V a načítají do aplikace Vulkan. SPIR-V není vázán na konkrétní jazyk — existují překladače z Rust, Python, OpenCL C do SPIR-V.

Shadery v mobilním vývoji

Shadery na mobilních platformách mají omezení ve srovnání s desktopem: méně registrů, omezená přesnost a chybějící podpora některých instrukcí. Podívejme se na specifika shaderů na Android (Vulkan/OpenGL ES) a iOS (Metal).

Shadery na Androidu

Android používá GLSL ES pro OpenGL a SPIR-V pro Vulkan. OpenGL ES 3.2 podporuje shadery s výchozí přesností mediump. Vulkan vyžaduje explicitní kompilaci GLSL do SPIR-V přes glslangValidator. Na Androidu se shadery načítají z textových zdrojů nebo z kompilovaných SPIR-V souborů.

Qualcomm Adreno GPU optimalizuje shadery na úrovni ovladače. Doporučení: používejte mediump pro barvu a UV, highp pouze pro pozice; vyhýbejte se vzorkování textur ve vrcholových shaderech; seskupujte výpočty do vektorů (vec4 místo 4x float). Podle údajů Qualcomm (2025) tyto optimalizace přinášejí zlepšení o 30–50%.

Shadery na iOS

iOS používá výhradně Metal Shading Language. Shadery se kompilují do strojového kódu spolu s aplikací přes Xcode. Metal poskytuje Shader Debugger a GPU Capture pro profilování shaderů. Apple GPU (TBDR) má specifické optimalizace: early fragment test, memoryless render targets a programovatelné míchání.

Podle údajů Apple WWDC 2024 je pro iOS shadery kritické používat half místo float, omezit tlak na registry (max 64 registrů) a vyhýbat se závislému vzorkování textur. iOS shadery by měly být kompaktní — optimální velikost 50–100 ALU instrukcí.

Shadery v Unity a Unreal Engine

Herní enginy Unity a Unreal Engine poskytují vizuální editory shaderů (Shader Graph, Material Editor) a abstraktní jazyky (ShaderLab, USF). Vývojář píše shader v jazyce vysoké úrovně a engine jej kompiluje pro cílovou platformu. Unity používá HLSL jako mezijazyk, Unreal — USF (Unreal Shader Format).

Optimalizace shaderů

Optimalizace shaderů — klíčová fáze vývoje grafiky pro mobilní zařízení. Špatně napsaný shader může snížit FPS z 60 na 20. Podívejme se na hlavní pravidla a techniky optimalizace.

Přesnost výpočtů

Používejte minimální dostatečnou přesnost: lowp pro barvu a UV, mediump pro normály a osvětlení, highp pouze pro pozice a matice. Podle údajů ARM (2025) jsou operace mediump 2krát rychlejší než highp na Mali GPU. V GLSL ES se to nastavuje pomocí precision kvalifikátorů.

Minimalizace vzorkování textur

Vzorkování textur — nejdražší operace v shaderu (10–30 cyklů oproti 1–2 pro ALU instrukci). Snižte počet vzorků: spojujte textury do atlasů, používejte ukládání v uniform polích místo textur, kešujte výsledky sousedních pixelů pomocí derivačních instrukcí.

Vyhýbejte se větvení

Dynamická větvení (if s uniform proměnnou) snižují výkon pipeline SIMT. Nahrazujte větvení matematickými funkcemi: mix(), step(), smoothstep() a clamp(). Tyto funkce se provádějí v 1–2 instrukcích, zatímco větvení může stát 8–16 instrukcí kvůli divergenci vláken.

glsl
// Špatně: dynamické větvení v shaderu
if (u_enableLight) {
    color *= computeLighting(normal);
}

// Dobře: matematické nahrazení větvení
color *= mix(1.0, computeLighting(normal),
              float(u_enableLight));

mix() provádí lineární interpolaci mezi dvěma hodnotami. Když je u_enableLight=0, vrací se 1.0 — barva se nemění. Když je u_enableLight=1, vrací se výsledek osvětlení. Žádné větvení — všechna vlákna provádějí stejný kód.

Příklady shaderů

Podívejme se na praktické příklady shaderů pro mobilní vývoj — od jednoduchého stínování po procedurální generování textur. Každý příklad demonstruje konkrétní techniku.

Phong stínování (vertex shader)

Phong model — klasický model osvětlení s difúzní a zrcadlovou složkou. Vertex Shader vypočítává osvětlení pro každý vrchol, Fragment Shader pouze interpoluje výsledek (Gouraud shading). Vhodný pro mobilní zařízení díky nízké ceně.

glsl
#version 300 es
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_normal;
uniform mat4 u_mvp;
uniform mat4 u_modelView;
out vec3 v_color;

void main() {
    vec3 normal = normalize(mat3(u_modelView) * a_normal);
    vec3 lightDir = normalize(vec3(0.0, 1.0, 1.0));
    float diff = max(dot(normal, lightDir), 0.0);
    v_color = vec3(0.8, 0.2, 0.2) * (0.3 + diff * 0.7);
    gl_Position = u_mvp * a_position;
}

Shader vypočítává difúzní osvětlení: skalární součin normály a směru světla. Výsledek se mísí s ambient (0.3) a diffuse (0.7) složkami. Provádí 10–15 ALU instrukcí na vrchol — přijatelné pro 100 000 polygonů při 60 FPS na mobilním GPU.

Procedurální textura (fragment shader)

Procedurální textury se generují ve Fragment Shader bez načítání ze souboru. Šetří video paměť a zjednodušuje animaci. Příklad — šachovnice s proměnnou velikostí buněk. Jen několik ALU instrukcí — minimální zátěž GPU.

glsl
#version 300 es
precision mediump float;
in vec2 v_uv;
uniform float u_cells;
out vec4 fragColor;

void main() {
    vec2 cell = floor(v_uv * u_cells);
    float isWhite = mod(cell.x + cell.y, 2.0);
    fragColor = mix(vec4(0.1, 0.1, 0.1, 1.0),
                     vec4(0.9, 0.9, 0.9, 1.0),
                     isWhite);
}

8 ALU instrukcí — ideální shader pro mobilní zařízení. u_cells nastavuje počet buněk na osu. floor a mod — levné operace, provedené v 1 cyklu na všech mobilních GPU.

Často kladené otázky

Čím se liší shader od běžného programu v C++?

Shader se provádí na GPU v režimu SIMT — jedna instrukce pro stovky vláken. Běžný program v C++ — na CPU v režimu MIMD. Shader nemá přístup k souborovému systému, vstupu/výstupu a dynamické paměti. Přijímá data přes buffery a textury a vrací pozici nebo barvu.

Jaký jazyk shaderů se učit pro mobilní vývoj?

GLSL — pro OpenGL ES a WebGL, cross-platform. Metal Shading Language — pro iOS. HLSL — základ pro Unity a Unreal Engine. Začněte s GLSL — porozumění základům je přenositelné na jakýkoli jazyk shaderů.

Proč shadery zpomalují na mobilních zařízeních?

Hlavní důvody: vysoká přesnost (highp místo mediump), nadměrné vzorkování textur, dynamická větvení a překročení limitu registrů. Používejte RenderDoc nebo Xcode GPU Frame Debugger pro analýzu shaderů.

Co je compute shader a k čemu slouží?

Compute Shader — shader pro libovolné výpočty na GPU: fyzika částic, zpracování obrazu, simulace látek. Na rozdíl od Fragment Shader není vázán na pixely a může zapisovat do libovolných bufferů.

Lze psát shadery bez znalosti programovacích jazyků?

Ano, pomocí vizuálních editorů: Shader Graph v Unity, Material Editor v Unreal Engine nebo Metal Shader Converter. Generují kód shaderu na základě nodového schématu. Pro hlubokou optimalizaci bude potřeba porozumění jazyku shaderů.

Závěr

  • Shader — paralelní program pro GPU, zpracovává vrcholy, fragmenty nebo libovolná data hromadně.
  • Typy shaderů: Vertex, Fragment, Compute, Geometry, Tessellation a Mesh — každý odpovídá za svou fázi pipeline.
  • Jazyky: GLSL (OpenGL), HLSL (DirectX), MSL (Metal), SPIR-V (Vulkan) — kompilují se do strojového kódu GPU.
  • Mobilní specifika: přesnost mediump, minimální vzorkování textur, absence dynamických větvení.
  • Optimalizace: mix() místo if, half přesnost, ATF, spojování textur do atlasů a předběžné výpočty na CPU.
  • Použití: Phong osvětlení, procedurální textury, post-efekty, fyzika částic a UI efekty.
  • Nástroje: RenderDoc, Xcode GPU Debugger, Qualcomm Adreno Profiler a Mali Offline Compiler pro analýzu shaderů.

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é