A "shader" szónak több jelentése van . Ez a cikk csak az egyiket ismerteti.
Shader ( angolul shader "shading") - egy számítógépes program , amelyet videokártya-processzorok (GPU) által történő végrehajtásra terveztek . A Shaderek az egyik speciális programozási nyelven (lásd alább ) vannak írva, és a GPU utasításaiba vannak összeállítva .
A háromdimenziós grafikával és videóval dolgozó programok ( játékok , GIS , CAD , CAM stb.) shadereket használnak a geometriai objektumok vagy képek paramétereinek meghatározására, a kép megváltoztatására (nyírási, visszaverődési, fénytörési , sötétítési hatások létrehozására). , figyelembe véve a megadott abszorpciós paramétereket és a fényszórást , textúrák geometriai objektumokra történő felviteléhez stb.).
Korábban a játékfejlesztők egy algoritmust implementáltak geometriai objektumokból képek manuális létrehozására ( renderelés ): összeállítottak egy algoritmust a jelenet látható részeinek meghatározására, összeállítottak egy algoritmust a textúra-leképezéshez, és olyan algoritmusokat állítottak össze, amelyek nem szabványos videoeffektusokat hoznak létre . A rajzolás felgyorsítása érdekében néhány renderelő algoritmust implementáltak hardver szinten - videokártya segítségével . A játékfejlesztők használhatták a videokártya által megvalósított algoritmusokat, de nem kényszeríthették a videokártyát saját algoritmusok végrehajtására, például egyedi effektusok létrehozására. A központi processzoron nem szabványos algoritmusok futottak , lassabban (grafikus feldolgozási feladatoknál), mint a videokártya processzorai . Nézzünk két példát.
A probléma megoldására a videokártyák elkezdték hozzáadni a fejlesztők által igényelt (hardver) algoritmusokat. Hamar világossá vált, hogy lehetetlen és kivitelezhetetlen az összes algoritmus megvalósítása; úgy döntött, hogy hozzáférést biztosít a fejlesztőknek a videokártyához - lehetővé téve a GPU -blokkok tetszőleges csővezetékekbe való összeállítását, amelyek különböző algoritmusokat valósítanak meg. A videokártya processzoraira tervezett programokat "shadereknek" nevezik. A shaderek összeállításához speciális nyelveket fejlesztettek ki. Most már nem csak a geometriai objektumokról ("geometria"), a textúrákról és a rajzoláshoz (képalkotáshoz) szükséges egyéb adatokról, hanem a GPU utasításairól is betöltötték a videokártyákat.
A shaderek használata előtt procedurális textúragenerálást alkalmaztak (például az Unreal játékban animált víz- és tűztextúrák létrehozására) és multitextúrát (a Quake 3 játékban használt shader nyelv erre épült ). Ezek a mechanizmusok nem biztosítottak olyan rugalmasságot, mint a shaderek.
Az újrakonfigurálható grafikus csővezetékek megjelenésével lehetővé vált a matematikai számítások elvégzése a GPU-n ( GPGPU ). A legismertebb GPGPU-mechanizmusok az nVidia CUDA , a Microsoft DirectCompute és a nyílt forráskódú OpenCL , Vulkan a Khronos Group konzorciumtól .
Eleinte a videokártyákat több speciális processzorral szerelték fel, amelyek különböző utasításokat támogattak . A Shadereket három típusra osztották attól függően, hogy melyik processzor fogja végrehajtani őket (attól függően, hogy milyen utasításkészletek állnak rendelkezésre):
Ezután a videokártyákat univerzális processzorokkal (GPU) kezdték felszerelni, amelyek támogatják mindhárom típusú shader utasításkészletét ( egyesítették a shader architektúrát ). A shaderek típusokra való felosztását megőriztük, hogy leírjuk a shader célját. Lehetővé vált általános célú számítások elvégzése a GPU-n (nem csak a számítógépes grafikával kapcsolatos), például bányászat , neurális hálózatok .
Vertex shaderekA vertex shader a poliéder csúcsokhoz kapcsolódó adatokkal működik , mint például a csúcsok (pontok) koordinátái a térben, a textúra koordinátái, a csúcsszín, az érintővektor, a binormális vektor, a normálvektor. A vertex shader használható csúcsok megtekintésére és perspektivikus transzformációjára, textúra koordináták generálására, megvilágítás kiszámítására stb.
Mintakód egy vertex shaderhez DirectX ASM -ben :
vs.2.0 dcl_position v0 dcl_texcoord v3 m4x4 opos, v0, c0 mov oT0,v3 Geometrikus árnyékolókA geometria-shader, ellentétben a vertex shaderrel, nem csak egy csúcsot, hanem az egész primitívet is képes feldolgozni. A primitív lehet egy szakasz (két csúcs) és egy háromszög (három csúcs), és ha van információ a szomszédos csúcsokról ( angol szomszédság ), legfeljebb hat csúcsot lehet feldolgozni egy háromszög primitívhez. A geometria shader képes primitíveket generálni menet közben (a CPU használata nélkül).
A geometriai árnyékolókat először az Nvidia 8-as sorozatú grafikus kártyáin használták.
Pixel (töredék) árnyékolókA pixel shader bitmap töredékekkel és textúrákkal működik – a képpontokhoz kapcsolódó adatokat (például szín, mélység, textúra koordináták) dolgozza fel. A pixel shader a grafikai folyamat utolsó szakaszában használatos a kép töredékének kialakítására.
Mintakód egy pixel shaderhez a DirectX ASM -ben :
ps.1.4 texldr0, t0 mul r0, r0, v0Előnyök:
Hibák:
A piac különböző igényeinek kielégítésére (a számítógépes grafikának számos alkalmazása van) számos shader programozási nyelvet hoztak létre.
Általában a shader-írás nyelvei speciális adattípusokat (mátrixok, mintavevők, vektorok stb.), beépített változók és konstansok készletét (a szabványos 3D API-funkciókkal való interakcióhoz) biztosítják a programozó számára.
Professzionális renderelésAz alábbiakban olyan shader programozási nyelvek találhatók, amelyek a maximális renderelési minőség elérésére összpontosítanak. Az ilyen nyelveken az anyagok tulajdonságait absztrakciókkal írják le. Ez lehetővé teszi olyan személyek számára, akik nem rendelkeznek speciális programozási ismeretekkel és nem ismerik a hardvermegvalósítások jellemzőit, hogy kódot írjanak. Például a művészek írhatnak ilyen shadereket, hogy "a megfelelő megjelenést" biztosítsák (textúra leképezés, fényelhelyezés stb.).
Általában az ilyen shaderek feldolgozása meglehetősen erőforrás-igényes: a fotorealisztikus képek elkészítése nagy számítási teljesítményt igényel. Általában a számítástechnika nagy részét nagy számítógépcsoportok vagy blade rendszerek végzik .
RenderMan A Pixar RenderMan szoftverében megvalósított shader programozási nyelv volt az első shader programozási nyelv. A Rob Cook által kifejlesztett és a RenderMan interfész specifikációjában leírt RenderMan API a professzionális renderelés de facto szabványa, amelyet a Pixar egész munkája során használnak . OSL OSL - angol. Az Open Shading Language [1] a Sony Pictures Imageworks [2] által kifejlesztett shader programozási nyelve, amely hasonlít a C nyelvre . A Sony Pictures Imageworks által kifejlesztett szabadalmaztatott Arnold programban, a renderelésre , valamint a Blender [3] ingyenes programban használják, amely háromdimenziós számítógépes grafika létrehozására szolgál. Valós idejű renderelés GLSL A GLSL ( az Open GL Shading Language ) [ 4] az OpenGL szabványban leírt shader programozási nyelv, amely a C nyelv ANSI C szabványban leírt verzióján alapul . A nyelv támogatja az ANSI C legtöbb funkcióját, támogatja a háromdimenziós grafikával (vektorok, mátrixok) végzett munka során gyakran használt adattípusokat . A „shader” szó a GLSL-ben egy önállóan összeállított, azon a nyelven írt egységre utal. A „program” szó egy összefüggő shader-készletre utal. cg A Cg ( C for g raphics ) egy árnyékoló programozási nyelv, amelyet az nVidia és a Microsoft fejlesztett ki . A nyelv hasonló a C -hez és a HLSL -hez, amelyeket a Microsoft fejlesztett ki, és a DirectX 9 tartalmazza . A nyelv az "int", "float", "half" típusokat használja ( 16 bites lebegőpontos szám ). A nyelv funkciókat és struktúrákat támogat. A nyelvnek sajátos optimalizálásai vannak "csomagolt tömbök" ( angolul packed arrays ) formájában: az olyan deklarációk, mint a "float a[4]" és a "float4 a" különböző típusoknak felelnek meg; a második deklaráció létrehoz egy "csomagolt tömböt"; a "csomagolt tömb" műveletei gyorsabbak, mint a normál. Annak ellenére, hogy a nyelvet az nVidia fejlesztette ki, a forráskód az ATI GPU videokártyáinak utasításaiba fordítható . Meg kell jegyezni, hogy minden shader programnak megvannak a maga sajátosságai, amelyeket speciális forrásokból lehet megtanulni. Shader programozási nyelvek DirectX-hez DirectX ASM A DirectX ASM egy alacsony szintű shader programozási nyelv, amelyet DirectX -hez terveztek . A nyelv szintaxisa hasonló az x86 processzorok assembly nyelvi szintaxisához . A nyelvnek több változata létezik, amelyek a támogatott GPU-utasítások és hardverkövetelmények tekintetében különböznek egymástól. Egy vertex shader 100-200 utasításból állhat. A pixel shader utasítások száma korlátozottabb; például az 1.4-es nyelvi verzióban egy pixel shader nem tartalmazhat 32 utasításnál többet. HLSL A HLSL ( H igh L Level S hader L Anguage ) egy magas szintű shader programozási nyelv, amelyet DirectX -hez terveztek, és hasonló a C -hez . Ez egy kiegészítő a DirectX ASM nyelvhez . Lehetővé teszi struktúrák, eljárások és függvények használatát.