Slovo „shader“ má několik významů . Tento článek popisuje pouze jeden z nich.
Shader ( anglicky shader "shading") - počítačový program navržený tak, aby jej spouštěly procesory grafických karet (GPU) . Shadery jsou napsány v jednom ze specializovaných programovacích jazyků (viz níže ) a zkompilovány do instrukcí pro GPU.
Programy pracující s trojrozměrnou grafikou a videem ( hry , GIS , CAD , CAM atd.) používají shadery k určení parametrů geometrických objektů nebo obrázků, ke změně obrazu (k vytváření efektů smyku, odrazu, lomu , ztmavení , s přihlédnutím ke specifikovaným parametrům absorpce a rozptylu světla , pro nanášení textur na geometrické objekty atd.).
Dříve vývojáři her implementovali algoritmus pro vytváření obrázků z geometrických objektů ( rendering ) ručně: sestavili algoritmus pro určování viditelných částí scény, sestavili algoritmus pro mapování textur a zkompilovali algoritmy, které vytvářejí nestandardní video efekty . Pro urychlení kreslení byly implementovány některé vykreslovací algoritmy na hardwarové úrovni – pomocí grafické karty . Vývojáři her mohli používat algoritmy implementované grafickou kartou, ale nemohli přinutit grafickou kartu, aby spustila své vlastní algoritmy, například pro vytváření vlastních efektů. Na centrálním procesoru byly prováděny nestandardní algoritmy , pomalejší (pro úlohy zpracování grafiky) ve srovnání s procesory grafické karty . Uvažujme dva příklady.
Aby se problém vyřešil, grafické karty začaly přidávat (hardwarové) algoritmy požadované vývojáři. Brzy se ukázalo, že je nemožné a nepraktické implementovat všechny algoritmy; se rozhodl poskytnout vývojářům přístup ke grafické kartě - aby umožnil sestavování bloků GPU do libovolných potrubí, která implementují různé algoritmy. Programy navržené ke spuštění na procesorech grafické karty se nazývají „shadery“. Pro kompilaci shaderů byly vyvinuty speciální jazyky. Nyní byly do grafických karet načteny nejen údaje o geometrických objektech ("geometrie"), texturách a dalších datech nezbytných pro kreslení (zobrazování), ale také pokyny pro GPU.
Před použitím shaderů se používalo procedurální generování textur (používá se například ve hře Unreal k vytváření animovaných vodních a ohnivých textur) a multitexturing (na něm byl založen jazyk shaderů používaný ve hře Quake 3 ). Tyto mechanismy neposkytovaly stejnou flexibilitu jako shadery.
S příchodem rekonfigurovatelných grafických kanálů bylo možné provádět matematické výpočty na GPU ( GPGPU ). Nejznámějšími mechanismy GPGPU jsou nVidia CUDA , Microsoft DirectCompute a open-source OpenCL , Vulkan z konsorcia Khronos Group .
Nejprve byly grafické karty vybaveny několika specializovanými procesory , které podporovaly různé sady instrukcí . Shadery byly rozděleny do tří typů podle toho, který procesor je bude provádět (podle toho, jaké instrukční sady jsou k dispozici):
Poté se grafické karty začaly vybavovat univerzálními procesory (GPU), které podporují instrukční sady všech tří typů shaderů ( sjednotily architekturu shaderů ). Pro popis účelu shaderu bylo zachováno rozdělení shaderů na typy. Bylo možné provádět obecné výpočty na GPU (netýkající se pouze počítačové grafiky), jako je těžba , neuronové sítě .
Vertexové shaderyVrcholový shader pracuje s daty spojenými s polyhedronovými vrcholy , jako jsou souřadnice vrcholu (bodu) v prostoru, souřadnice textury, barva vrcholu, vektor tečny, binormální vektor, normální vektor. Vertex shader lze použít pro zobrazení a perspektivní transformaci vrcholů, pro generování souřadnic textur, pro výpočet osvětlení atd.
Ukázkový kód pro vertex shader v DirectX ASM :
vs. 2.0 dcl_position v0 dcl_texcoord v3 m4x4 oPos, v0, c0 mov oT0,v3 Geometrické shaderyGeometry shader je na rozdíl od vertex shaderu schopen zpracovat nejen jeden vrchol, ale celé primitivum. Primitivem může být úsečka (dva vrcholy) a trojúhelník (tři vrcholy), a pokud existují informace o sousedních vrcholech ( anglicky adjacency ), lze pro trojúhelníkové primitivum zpracovat až šest vrcholů. Geometry shader je schopen generovat primitiva za chodu (bez použití CPU).
Geometry shadery byly poprvé použity na grafických kartách Nvidia řady 8.
Pixelové (fragmentové) shaderyPixel shader pracuje s bitmapovými fragmenty a texturami – zpracovává data spojená s pixely (například barvu, hloubku, souřadnice textury). Pixel shader se používá v poslední fázi grafického potrubí k vytvoření fragmentu obrazu.
Ukázkový kód pro pixel shader v DirectX ASM :
ps.1.4 texldr0, t0 mul r0, r0, v0výhody:
nedostatky:
Pro splnění různých potřeb trhu (počítačová grafika má mnoho aplikací) bylo vytvořeno velké množství shader programovacích jazyků.
Jazyky pro psaní shaderů obvykle poskytují programátorovi speciální datové typy (matice, samplery, vektory atd.), sadu vestavěných proměnných a konstant (pro interakci se standardní funkcí 3D API).
Profesionální vykreslováníNásledují shader programovací jazyky, které jsou zaměřeny na dosažení maximální kvality vykreslování. V takových jazycích jsou vlastnosti materiálů popsány pomocí abstrakcí. To umožňuje lidem, kteří nemají speciální programovací dovednosti a neznají vlastnosti hardwarových implementací, psát kód. Umělci mohou například psát takové shadery, aby poskytli „správný vzhled“ (mapování textury, umístění světla atd.).
Obvykle je zpracování takových shaderů poměrně náročné na zdroje: vytváření fotorealistických obrázků vyžaduje hodně výpočetního výkonu. Převážná část výpočtů je obvykle prováděna velkými počítačovými clustery nebo blade systémy .
RenderMan Programovací jazyk shaderů implementovaný v softwaru RenderMan společnosti Pixar byl prvním programovacím jazykem pro shadery. RenderMan API , vyvinuté Robem Cookem a popsané ve specifikaci rozhraní RenderMan, je de facto standardem pro profesionální vykreslování, který se používá v celé práci Pixaru . OSL OSL - anglicky. Open Shading Language [1] je programovací jazyk shaderů vyvinutý společností Sony Pictures Imageworks [2] , který se podobá jazyku C . Používá se v proprietárním programu Arnold vyvinutém společností Sony Pictures Imageworks a určeném pro vykreslování a ve volném programu Blender [3] určeném pro vytváření trojrozměrné počítačové grafiky. Vykreslování v reálném čase GLSL GLSL ( The Open GL Shading Language ) [ 4] je shader programovací jazyk popsaný ve standardu OpenGL a založený na verzi jazyka C popsané ve standardu ANSI C. Jazyk podporuje většinu funkcí ANSI C, podporuje datové typy , které se často používají při práci s trojrozměrnou grafikou (vektory, matice). Slovo "shader" v GLSL odkazuje na nezávisle zkompilovanou jednotku napsanou v tomto jazyce. Slovo „program“ označuje sadu kompilovaných shaderů propojených dohromady. cg Cg ( C pro g raphics ) je shader programovací jazyk vyvinutý společností nVidia společně s Microsoftem . Jazyk je podobný jazykům C a HLSL , které vyvinul Microsoft a je součástí DirectX 9 . Jazyk používá typy "int", "float", "half" ( 16bitové číslo s plovoucí desetinnou čárkou ). Jazyk podporuje funkce a struktury. Jazyk má zvláštní optimalizace ve formě "packed arrays" ( anglicky packed arrays ): deklarace jako "float a[4]" a "float4 a" odpovídají různým typům; druhá deklarace vytvoří "sbalené pole"; operace s "sbaleným polem" jsou rychlejší než s normálním. Navzdory skutečnosti, že jazyk byl vyvinut společností nVidia, zdrojový kód lze zkompilovat do pokynů pro grafické karty GPU od ATI . Je třeba poznamenat, že všechny shader programy mají své vlastní charakteristiky, které lze zjistit ze specializovaných zdrojů. Shader programovací jazyky pro DirectX DirectX ASM DirectX ASM je nízkoúrovňový shader programovací jazyk určený pro DirectX . Syntaxe jazyka je podobná syntaxi jazyka symbolických instrukcí pro procesory x86 . Existuje několik verzí jazyka, které se od sebe liší sadami podporovaných instrukcí GPU a hardwarovými požadavky. Vertexový shader se může skládat ze 100-200 instrukcí. Počet instrukcí pro pixel shader je omezenější; například v jazykové verzi 1.4 nemůže pixel shader obsahovat více než 32 instrukcí. HLSL HLSL ( High L evel S hader L anguage ) je programovací jazyk shaderů na vysoké úrovni určený pro DirectX a podobný C. Jedná se o doplněk pro jazyk DirectX ASM . Umožňuje používat struktury, procedury a funkce.