Shader - Shader
V počítačové grafice je shader typ počítačového programu původně používaného pro stínování ve 3D scénách (vytváření příslušných úrovní světla , tmy a barev v vykresleném obrázku). Nyní vykonávají řadu specializovaných funkcí v různých oblastech v kategorii speciálních efektů počítačové grafiky , nebo také post-processing videa nesouvisející se stínováním, nebo dokonce provádějí funkce nesouvisející s grafikou .
Tradiční shadery počítají efekty vykreslování na grafickém hardwaru s vysokou mírou flexibility. Většina shaderů je kódována (a běží) na grafické jednotce (GPU), i když to není přísný požadavek. K programování vykreslovacího kanálu GPU se používají stínovací jazyky , které většinou v minulosti nahradily potrubí s pevnými funkcemi, které umožňovalo pouze běžné funkce transformace geometrie a stínování pixelů ; pomocí shaderů lze použít přizpůsobené efekty. Polohy a barvy ( odstín , sytost , jas a kontrast ) všech pixelů , vrcholy , a / nebo textury použitých pro konstrukci konečného poskytnuté obraz může být měněn pomocí algoritmů definovaných v shaderu, a může být upravena vnějšími proměnnými nebo textury zavedený počítačovým programem, který volá shader.
Shadery jsou široce používány v postprocesu kinematografie , počítačově generovaných snímcích a videohrách k produkci řady efektů. Kromě jednoduchých modelů osvětlení zahrnuje složitější použití shaderů: změnu odstínu , sytosti , jasu ( HSL/HSV ) nebo kontrastu obrazu; produkující rozostření , světelný květ , objemové osvětlení , normální mapování (pro hloubkové efekty), bokeh , stínování cel , posterizace , mapování nárazů , zkreslení , chroma klíčování (pro takzvané efekty „bluescreen/ greenscreen “), detekce hran a pohybu , jako stejně jako psychedelické efekty, jaké jsou vidět v demoscénu .
Dějiny
Toto použití termínu „shader“ představila veřejnosti společnost Pixar s verzí 3.0 jejich specifikace rozhraní RenderMan , původně publikované v květnu 1988.
S vývojem jednotek pro zpracování grafiky začaly hlavní knihovny grafického softwaru, jako je OpenGL a Direct3D, podporovat shadery. První GPU s podporou shaderu podporovaly pouze stínování pixelů , ale shadery vrcholů byly rychle zavedeny, jakmile si vývojáři uvědomili sílu shaderů. První grafická karta s programovatelným pixelovým shaderem byla Nvidia GeForce 3 (NV20), vydaná v roce 2001. Geometrické shadery byly představeny s Direct3D 10 a OpenGL 3.2. Grafický hardware se nakonec vyvinul směrem k jednotnému modelu shaderu .
Design
Shadery jsou jednoduché programy, které popisují vlastnosti vrcholu nebo pixelu . Vrcholové shadery popisují atributy (poloha, souřadnice textur , barvy atd.) Vrcholu, zatímco pixelové shadery popisují vlastnosti (barva, hloubka z a hodnota alfa ) pixelu. Vrcholový shader je volán pro každý vrchol v primitivu (možná po teselaci ); tedy jeden vrchol dovnitř, jeden (aktualizovaný) vrchol ven. Každý vrchol je poté vykreslen jako řada pixelů na povrch (blok paměti), který bude nakonec odeslán na obrazovku.
Shadery nahrazují část grafického hardwaru, která se obvykle nazývá Fixed Function Pipeline (FFP), takzvaně proto, že provádí mapování osvětlení a textur napevno. Shadery poskytují programovatelnou alternativu k tomuto pevně zakódovanému přístupu.
Základní grafický kanál je následující:
- CPU posílá instrukce (kompilované programy stínovacích jazyků ) a geometrická data do grafické procesorové jednotky umístěné na grafické kartě.
- V rámci shaderu vrcholů se geometrie transformuje.
- Pokud je shader geometrie v jednotce grafického zpracování a je aktivní, budou provedeny některé změny geometrií ve scéně.
- Pokud je teselační shader v jednotce grafického zpracování a je aktivní, lze geometrie ve scéně rozdělit .
- Vypočtená geometrie je triangulována (rozdělena na trojúhelníky).
- Trojúhelníky jsou rozděleny na fragmentové čtyřkolky (jedna fragmentová čtveřice je 2 × 2 fragmentový primitiv).
- Fragmentové čtyřkolky jsou upraveny podle shaderu fragmentů.
- Provede se hloubkový test; fragmenty, které projdou, budou zapsány na obrazovku a mohou být smíchány do vyrovnávací paměti rámců .
Grafický kanál používá tyto kroky k transformaci trojrozměrných (nebo dvourozměrných) dat na užitečná dvojrozměrná data pro zobrazení. Obecně se jedná o velkou pixelovou matici neboli „ frame buffer “.
Typy
Běžně se používají tři typy shaderů (pixelové, vrcholové a geometrické shadery), přičemž nedávno bylo přidáno několik dalších. Zatímco starší grafické karty využívají samostatné procesní jednotky pro každý typ shaderu, novější karty obsahují unifikované shadery, které jsou schopné spustit jakýkoli typ shaderu. To umožňuje grafickým kartám efektivněji využívat výpočetní výkon.
2D shadery
2D shadery působí na digitální obrázky , nazývané také textury v oblasti počítačové grafiky. Upravují atributy pixelů . 2D shadery se mohou podílet na vykreslování 3D geometrie . V současné době je jediným typem 2D shaderu pixelový shader.
Pixel shadery
Pixelové shadery, známé také jako fragmentové shadery, výpočetní barvy a další atributy každého „fragmentu“: jednotka vykreslovací práce ovlivňující nejvýše jeden výstupní pixel . Nejjednodušší druhy shaderů pixelů produkují jeden pixel na obrazovce jako hodnotu barvy; jsou také možné složitější shadery s více vstupy/výstupy. Pixelové shadery se pohybují od jednoduše vždy produkujících stejnou barvu, přes použití hodnoty osvětlení , až po bump mapping , stíny , zrcadlové zvýraznění , průsvitnost a další jevy. Mohou změnit hloubku fragmentu (pro ukládání do vyrovnávací paměti Z ) nebo mohou zobrazit více než jednu barvu, pokud je aktivních více cílů vykreslování . V 3D grafice samotný pixelový shader nemůže vytvářet některé druhy komplexních efektů, protože pracuje pouze s jedním fragmentem, bez znalosti geometrie scény (tj. Vrcholových dat). Pixelové shadery však mají znalosti o vykreslování souřadnic obrazovky a mohou vzorkovat obrazovku a blízké pixely, pokud je obsah celé obrazovky předán jako textura shaderu. Tato technika může umožnit širokou škálu dvojrozměrných efektů postprocesingu, jako je rozostření nebo detekce /vylepšení hran pro shadery kreslených /cel . Pixelové shadery lze také použít v mezistupních na jakékoli dvojrozměrné obrázky- sprity nebo textury -v potrubí , zatímco vrcholové shadery vždy vyžadují 3D scénu. Například pixelový shader je jediným druhem shaderu, který může fungovat jako postprocesor nebo filtr pro video stream poté, co byl rastrován .
3D shadery
3D shadery fungují na 3D modelech nebo jiné geometrii, ale mohou také přistupovat k barvám a texturám použitým k kreslení modelu nebo sítě . Vrcholové shadery jsou nejstarším typem 3D shaderu, obecně provádějící úpravy na základě jednotlivých vrcholů. Novější shadery geometrie mohou generovat nové vrcholy z shaderu. Tessellation shadery jsou nejnovější 3D shadery; působí na dávky vrcholů najednou a přidávají detaily - například rozdělují model na menší skupiny trojúhelníků nebo jiných primitivů za běhu, vylepšují věci jako křivky a nerovnosti nebo mění jiné atributy.
Vrcholové shadery
Vertex shadery jsou nejrozšířenějším a nejběžnějším druhem 3D shaderu a jsou spuštěny jednou pro každý vrchol daný grafickému procesoru. Účelem je transformovat 3D polohu každého vrcholu ve virtuálním prostoru na 2D souřadnici, ve které se zobrazuje na obrazovce (stejně jako hodnotu hloubky pro Z-buffer). Shadery vrcholů mohou manipulovat s vlastnostmi, jako jsou souřadnice polohy, barvy a textury, ale nemohou vytvářet nové vrcholy. Výstup shaderu vrcholů jde do další fáze v potrubí, což je buď shader geometrie, pokud je k dispozici, nebo rasterizer . Vertex shadery umožňují výkonnou kontrolu nad detaily polohy, pohybu, osvětlení a barev v jakékoli scéně zahrnující 3D modely .
Geometry shadery
Geometrické shadery byly představeny v Direct3D 10 a OpenGL 3.2; dříve k dispozici v OpenGL 2.0+ s využitím rozšíření. Tento typ shaderu může generovat nová grafická primitiva , jako jsou body, čáry a trojúhelníky, z těch primitiv, které byly odeslány na začátek grafického kanálu .
Programy shaderů geometrie se provádějí za shadery vrcholů. Jako vstup berou celý primitiv, případně s informacemi o sousedství. Například při práci s trojúhelníky jsou tři vrcholy vstupem shaderu geometrie. Shader pak může emitovat nula nebo více primitiv, které jsou rastrovány a jejich fragmenty nakonec přeneseny do pixelového shaderu .
Mezi typické použití geometrického shaderu patří generování sprintů bodů, geometrické mozaikování , vytlačování objemu stínů a vykreslování jedním průchodem na mapu krychle . Typickým příkladem výhod geometrických shaderů v reálném světě by byla automatická modifikace složitosti sítě. Geometrickému shaderu je předána řada liniových proužků představujících kontrolní body křivky a v závislosti na požadované složitosti může shader automaticky generovat další čáry, z nichž každý poskytuje lepší aproximaci křivky.
Teselace shadery
Od OpenGL 4.0 a Direct3D 11 byla přidána nová třída shaderu s názvem tessellation shader. K tradičnímu modelu přidává dvě nové úrovně shaderů: shessery pro řízení teselace (také známé jako shadery trupu) a shadery pro hodnocení mozaikování (také známé jako doménové shadery), které společně umožňují rozdělení jednodušších sítí za běhu na jemnější sítě na matematickou funkci. Funkce může souviset s řadou proměnných, zejména se vzdáleností od pozorovací kamery, aby bylo umožněno aktivní škálování úrovně detailů . To umožňuje objektům blízko kamery mít jemné detaily, zatímco vzdálenější objekty mohou mít hrubší sítě, přesto se jeví jako srovnatelné v kvalitě. Rovněž může drasticky snížit požadovanou šířku pásma sítě tím, že umožní, aby byly sítě rafinovány jednou uvnitř shaderových jednotek namísto převzorkování velmi složitých sítí z paměti. Některé algoritmy mohou převzorkovat libovolnou libovolnou síť, zatímco jiné umožňují „naznačování“ v sítích, aby diktovaly nejcharakterističtější vrcholy a hrany.
Primitivní a síťové shadery
Kolem roku 2017 přidala mikroarchitektura AMD Vega podporu pro novou shaderovou fázi - primitivní shadery - poněkud podobné výpočetním shaderům s přístupem k datům nezbytným pro zpracování geometrie. Podobně Nvidia představila v roce 2018 svou mikroarchitekturou Turing síťové a úkolové shadery, které poskytují podobnou funkčnost a podobně jako primitivní shadery AMD jsou také modelovány podle výpočetních shaderů.
V roce 2020 AMD a Nvidia vydaly mikroarchitektury RDNA 2 a Ampere, které podporují stínování sítě pomocí DirectX 12 Ultimate . Tyto síťové shadery umožňují GPU zvládnout složitější algoritmy, přenést více práce z CPU na GPU a při intenzivním vykreslování algoritmu zvýšit řádovou rychlost nebo počet trojúhelníků ve scéně. Intel oznámil, že GPU Intel Arc Alchemist dodávané v Q1 2022 budou podporovat síťové shadery.
Shadery pro sledování paprsků
Shadery sledování paprsků jsou podporovány společností Microsoft prostřednictvím DirectX Raytracing , společností Khronos Group prostřednictvím Vulkan , GLSL a SPIR-V , Apple prostřednictvím Metal .
Vypočítejte shadery
Compute shadery nejsou omezeny na grafické aplikace, ale používají stejné prostředky spouštění pro GPGPU . Mohou být použity v grafických kanálech, např. Pro další fáze v animačních nebo osvětlovacích algoritmech (např. Kachlové dopředné vykreslování ). Některá rozhraní API pro vykreslování umožňují výpočetním shaderům snadno sdílet datové prostředky s grafickým kanálem.
Paralelní zpracování
Shadery jsou napsány tak, aby aplikovaly transformace na velkou sadu prvků najednou, například na každý pixel v oblasti obrazovky nebo na každý vrchol modelu. To se dobře hodí pro paralelní zpracování a většina moderních GPU má více shaderových kanálů, které to usnadňují, což výrazně zlepšuje propustnost výpočtu.
Programovací model se shadery je podobný funkci vyššího řádu pro vykreslování, přičemž shadery bere jako argumenty a poskytuje specifický tok dat mezi průběžnými výsledky, což umožňuje paralelnost dat (napříč pixely, vrcholy atd.) A paralelismus potrubí (mezi fázemi). (viz také zmenšení mapy ).
Programování
Jazyk, ve kterém jsou programovány shadery, závisí na cílovém prostředí. Oficiálním stínovacím jazykem OpenGL a OpenGL ES je OpenGL Shading Language , známý také jako GLSL, a oficiálním stínovacím jazykem Direct3D je High Level Shader Language , známý také jako HLSL. Cg , stínovací jazyk třetí strany, který produkuje shadery OpenGL i Direct3D, byl vyvinut společností Nvidia ; od roku 2012 je však zastaralá. Společnost Apple vydala svůj vlastní stínovací jazyk s názvem Metal Shading Language jako součást rámce Metal .
Editory shaderů GUI
Moderní platformy pro vývoj videoher, jako jsou Unity a Unreal Engine, stále více obsahují editory založené na uzlech, které dokážou vytvářet shadery bez potřeby skutečného kódu; uživateli se místo toho zobrazí směrovaný graf připojených uzlů, který uživatelům umožňuje směrovat různé textury, mapy a matematické funkce do výstupních hodnot, jako je difúzní barva, zrcadlová barva a intenzita, drsnost/kovovost, výška, normální atd. . Automatická kompilace pak z grafu vytvoří skutečný kompilovaný shader.
Viz také
Reference
Další čtení
- Upstill, Steve (1990). RenderMan Companion: Průvodce programátora k realistické počítačové grafice . Addison-Wesley. ISBN 0-201-50868-0.
- Ebert, David S ; Musgrave, F. Kenton ; Peachey, Darwyn ; Perlin, Ken ; Worley, Steven (1994). Texturování a modelování: procedurální přístup . AP Professional. ISBN 0-12-228730-4.
- Fernando, Randima ; Kilgard, Mark (2003). The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics . Addison-Wesley Professional. ISBN 0-321-19496-9.
- Rost, Randi J (2004). OpenGL stínovací jazyk . Addison-Wesley Professional. ISBN 0-321-19789-5.
externí odkazy
- Rozšíření shaderu geometrie OpenGL
- Riemer's DirectX & HLSL Tutorial : HLSL Tutorial using DirectX with much sample code
- Fáze potrubí (Direct3D 10)