8. Shadery

Nežli si shrneme, jak vypadá tzv. standardní vykreslovací řetězec, tj. typický proces, který zajistí vykreslení 3D scény, definujme pojem shader.

Shader je počítačový program sloužící k řízení jednotlivých částí programovatelného grafického řetězce grafické karty (přesněji GPU). K tvorbě takových programů slouží specializované programovací jazyky tzv. shader jazyky (například jazyk GLSL pro OpenGL, Cg od společnosti NVIDIA nebo HLSL od společnosti Microsoft určený pro API DirectX, Xbox a Xbox 360). Shadery se rozdělují na několik základních typů podle toho, pro kterou jednotku grafického řetězce jsou určeny. V současnosti patří mezi nejdůležitější vertex, pixel a geometry shader. S příchodem posledních generací grafických karet a nových verzí grafických rozhraní (DirectX a OpenGL) se rovněž začínají rychle prosazovat shadery pro realizaci tzv. teselace.

Vertex shader

Program, který se provede na každém vrcholu (vertexu) vstupní geometrie scény. Mezi nejčastější operace patří transformace vrcholu (násobení pohledovou a "world" maticí). Pomocí transformací lze však dosáhnout i různých grafických efektů — např. simulace pohybu vodní hladiny. Vždy do programu vstoupí jeden vrchol, je upraven a zase vystoupí, nelze tedy vrcholy přidávat či odebírat.

Podívejte se např. jak je možné "hrát" si s Vertex (a Fragment - viz dále) shadery v Unity - https://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

Geometry shader

Geometry shader na rozdíl od vertex shaderu umožňuje přidávat nebo odebírat vrcholy a tím ovlivňovat výslednou geometrii. Geometry shader lze využít například pro generování jednoduché vegetace (trávy) na povrchu nějakého objektu či k doplnění detailů existujícího modelu (např. vytvoření ostnů na modelu dinosaura) v reálném čase.

Na následujícím videu je vidět, jak lze po aplikaci geometry shaderu modifikovat geometrii 3D objektů:


Pixel (fragment) shader

Pixel shader je prováděn na každém pixelu rasterizované scény — pracuje tedy s jejím 2D obrazem. Mezi nejčastější operace patří aplikace textur případně další modifikace barvy pixelu.

Pixel shader je ukázán také ve výše uvedeném odkazu - https://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

Teselace

S příchodem Direct3D 11 a OpenGL 3.2 byl vykreslovací řetězec (3D pipeline) rozšířen o nové stupně realizující teselaci. Jedná se o hardwarovou podporu vykreslování opakujících se vzorů.

Typicky je tak možné díky teselaci výrazně zjemnit trojúhelníkovou síť modelu a získat tak realističtější obraz (např. pomocí matematické aproximace nových vrcholů nebo tzv. displacement maps). Velmi zajímavé video vysvětluje principy, výhody i limity:



Dva z těchto celkem tří stupňů jsou programovatelné. Názvy příslušných shaderů se u jednotlivých rozhraní liší. Pro Direct3D jsou to Hull-shader a Domain-shader, pro OpenGL potom Tessellation control shader (TC) a Tessellation evaluation shader (TE). Tyto shadery umožňují měnit geometrii objektů (podobně jako geometry shader). Díky podpoře teselace zakotvené přímo v hardware (GPU) je možné do scény přidat velmi velké množství detailů (a to tam kde jsou potřeba např. dle vzdálenosti od kamery).