Definice
Shader je malý program, který běží přímo na grafické kartě a určuje, jak se vykreslí geometrie nebo jednotlivý pixel. Spouští se v tisících kopií najednou, každá nad jiným vrcholem nebo pixelem, což je zdroj jeho výkonu i jeho omezení.
Jiný způsob uvažování
Běžný program zpracovává data postupně. Shader je napsaný z pohledu jednoho vrcholu nebo jednoho pixelu a grafická karta ho spustí paralelně nad všemi. Nemůžete se proto ptát, co dělá soused, a nemůžete si mezi jednotlivými spuštěními nic pamatovat.
Základní typy
Vertex shader zpracovává vrcholy geometrie a rozhoduje, kam se promítnou. Fragment shader určuje výslednou barvu pixelu. Compute shader se nevěnuje vykreslování vůbec a používá grafickou kartu jako obecný paralelní procesor.
Příklady z praxe
Obarvení podle výšky
Fragment shader dostane pro každý pixel jeho výšku v terénu a podle ní vybere barvu: nízko tráva, vysoko sníh. Celá mapa se obarví jedním průchodem bez jediného cyklu v kódu.
vec3 color = mix(grass, snow, smoothstep(0.4, 0.8, height));
Časté omyly
- MýtusShader se stará jen o stínování a světlo.
- Ve skutečnostiNázev je historický. Dnešní shadery řídí celý vykreslovací řetězec a compute shadery se používají i na úlohy bez jakéhokoli vztahu ke grafice, například na fyzikální simulace nebo trénink modelů.
Časté dotazy
- Jaký je rozdíl mezi vertex a fragment shaderem?
- Vertex shader běží jednou pro každý vrchol geometrie a rozhoduje, kam se vrchol promítne na obrazovku. Fragment shader běží jednou pro každý pixel, který geometrie pokryje, a určuje jeho výslednou barvu. Vertexů bývají tisíce, fragmentů miliony, takže fragment shader je obvykle to, co rozhoduje o výkonu.
- V jakém jazyce se shadery píší?
- Podle grafického API. OpenGL a WebGL používají GLSL, Direct3D jazyk HLSL, Metal jazyk MSL a Vulkan přijímá mezikód SPIR-V, do kterého se ostatní jazyky překládají. Všechny vycházejí syntaxí z jazyka C a koncepty jsou mezi nimi přenositelné, takže kdo umí jeden, zvládne rychle i další.
Zdroje
- Shader(otevře se v novém okně)