Cuvântul „shader” are mai multe sensuri . Acest articol descrie doar unul dintre ele.
Shader ( în engleză shader „shading”) - un program de calculator conceput pentru a fi executat de procesoarele plăcilor video (GPU) . Shaders sunt scrise într-unul dintre limbajele de programare specializate (vezi mai jos ) și compilate în instrucțiuni pentru GPU.
Programele care lucrează cu grafică tridimensională și video ( jocuri , GIS , CAD , CAM etc.) folosesc shadere pentru a determina parametrii obiectelor geometrice sau a imaginilor, pentru a schimba imaginea (pentru a crea efecte de forfecare, reflexie, refracție , întunecare). , ținând cont de parametrii de absorbție și împrăștierea luminii specificați , pentru impunerea texturilor pe obiecte geometrice etc.).
Anterior, dezvoltatorii de jocuri implementau manual un algoritm pentru crearea imaginilor din obiecte geometrice ( redare ): au compilat un algoritm pentru determinarea părților vizibile ale unei scene, au compilat un algoritm pentru maparea texturii și au compilat algoritmi care creează efecte video non-standard . Pentru a accelera desenul, au fost implementați niște algoritmi de randare la nivel hardware - folosind o placă video . Dezvoltatorii de jocuri ar putea folosi algoritmii implementați de placa video, dar nu au putut forța placa video să-și execute proprii algoritmi, de exemplu, pentru a crea efecte personalizate. Pe procesorul central au fost executați algoritmi non-standard , mai lenți (pentru sarcinile de procesare grafică) în comparație cu procesoarele plăcii video . Să luăm în considerare două exemple.
Pentru a rezolva problema, plăcile video au început să adauge algoritmi (hardware) solicitați de dezvoltatori. Curând a devenit clar că implementarea tuturor algoritmilor era imposibilă și impracticabilă; a decis să ofere dezvoltatorilor acces la placa video - pentru a permite blocurilor GPU să fie asamblate în conducte arbitrare care implementează diferiți algoritmi. Programele concepute pentru a rula pe procesoarele unei plăci video sunt numite „shaders”. Au fost dezvoltate limbaje speciale pentru compilarea shaderelor. Acum nu numai date despre obiecte geometrice ("geometrie"), texturi și alte date necesare desenului (imagini), ci și instrucțiuni pentru GPU au fost încărcate în plăcile video.
Înainte de utilizarea shader-urilor, a fost folosită generarea de texturi procedurale (de exemplu, folosită în jocul Unreal pentru a crea texturi animate de apă și foc) și multitexturing (limbajul shader folosit în jocul Quake 3 se baza pe acesta ). Aceste mecanisme nu au oferit aceeași flexibilitate ca shaders.
Odată cu apariția conductelor grafice reconfigurabile, a devenit posibilă efectuarea de calcule matematice pe GPU ( GPGPU ). Cele mai cunoscute mecanisme GPGPU sunt nVidia CUDA , Microsoft DirectCompute și open-source OpenCL , Vulkan de la consorțiul Khronos Group .
La început , plăcile video erau echipate cu mai multe procesoare specializate care acceptau diferite seturi de instrucțiuni . Shaderele au fost împărțite în trei tipuri, în funcție de procesorul care le va executa (în funcție de ce seturi de instrucțiuni sunt disponibile):
Apoi, plăcile video au început să fie echipate cu procesoare universale (GPU) care acceptă seturi de instrucțiuni pentru toate cele trei tipuri de shadere ( au unificat arhitectura shader ). Împărțirea shader-urilor în tipuri a fost păstrată pentru a descrie scopul unui shader. A devenit posibil să se efectueze calcule de uz general pe GPU (nu legate doar de grafica computerizată), cum ar fi minerit , rețele neuronale .
Umbritoare de vârfVertex shader operează pe date asociate cu vârfurile poliedrului , cum ar fi coordonatele vârfurilor (punctului) în spațiu, coordonatele texturii, culoarea vârfurilor, vectorul tangent, vectorul binormal, vectorul normal. Vertex Shader poate fi folosit pentru transformarea vederii și în perspectivă a nodurilor, pentru generarea coordonatelor texturii, pentru calcularea luminii etc.
Exemplu de cod pentru un vertex shader în DirectX ASM :
vs.2.0 dcl_position v0 dcl_texcoord v3 m4x4 oPos, v0, c0 mov oT0, v3 Umbritoare geometriceUn shader geometrie, spre deosebire de un vertex shader, este capabil să proceseze nu numai un vârf, ci întreaga primitivă. O primitivă poate fi un segment (două vârfuri) și un triunghi (trei vârfuri), iar dacă există informații despre vârfuri adiacente ( în engleză adjacență ), până la șase vârfuri pot fi procesate pentru o primitivă triunghiulară. Shaderul de geometrie este capabil să genereze primitive din mers (fără a utiliza CPU).
Umbritoarele geometriei au fost folosite pentru prima dată pe plăcile grafice din seria 8 ale Nvidia .
Umbritoare de pixeli (fragmente).Pixel shader funcționează cu fragmente bitmap și cu texturi - prelucrează datele asociate pixelilor (de exemplu, culoarea, adâncimea, coordonatele texturii). Pixel shader-ul este utilizat în ultima etapă a conductei grafice pentru a forma un fragment al imaginii.
Exemplu de cod pentru un pixel shader în DirectX ASM :
ps.1.4 textldr0, t0 mul r0, r0, v0Avantaje:
Defecte:
Pentru a satisface diferitele nevoi ale pieței (grafica pe computer are multe aplicații), au fost create un număr mare de limbaje de programare shader.
De obicei, limbajele pentru scrierea shaderelor oferă programatorului tipuri speciale de date (matrice, eșantionare, vectori etc.), un set de variabile și constante încorporate (pentru interacțiunea cu funcționalitatea standard API 3D).
Redare profesionalăUrmătoarele sunt limbaje de programare shader care se concentrează pe obținerea unei calități maxime de randare. În astfel de limbaje, proprietățile materialelor sunt descrise folosind abstracții. Acest lucru permite persoanelor care nu au abilități speciale de programare și nu cunosc caracteristicile implementărilor hardware să scrie cod. De exemplu, artiștii pot scrie astfel de shadere pentru a oferi „aspectul potrivit” (maping texturii, plasarea luminii etc.).
De obicei, procesarea unor astfel de shadere necesită destul de mult resurse: crearea de imagini fotorealiste necesită multă putere de calcul. De obicei, cea mai mare parte a calculelor este realizată de grupuri mari de computere sau sisteme blade .
RenderMan Limbajul de programare shader implementat în software -ul RenderMan de la Pixar a fost primul limbaj de programare shader. API -ul RenderMan , dezvoltat de Rob Cook și descris în specificația interfeței RenderMan, este standardul de facto pentru randarea profesională, folosit în întreaga activitate a Pixar . OSL OSL - engleză. Open Shading Language [1] este un limbaj de programare shader dezvoltat de Sony Pictures Imageworks [2] care seamănă cu limbajul C. Este folosit în programul proprietar Arnold dezvoltat de Sony Pictures Imageworks și destinat redării , și în programul gratuit Blender [3] destinat creării de grafică tridimensională pe computer. Redare în timp real GLSL GLSL ( Open GL Shading Language ) [ 4 ] este un limbaj de programare shader descris în standardul OpenGL și bazat pe versiunea limbajului C descrisă în standardul ANSI C . Limbajul acceptă majoritatea caracteristicilor ANSI C, acceptă tipuri de date care sunt adesea folosite atunci când lucrați cu grafice tridimensionale (vectori, matrice). Cuvântul „shader” în GLSL se referă la o unitate compilată independent scrisă în limba respectivă. Cuvântul „program” se referă la un set de shadere compilate legate între ele. cg Cg ( C pentru grafică ) este un limbaj de programare shader dezvoltat de nVidia împreună cu Microsoft . Limbajul este similar cu C și HLSL , dezvoltat de Microsoft și inclus cu DirectX 9 . Limbajul folosește tipurile „int”, „float”, „half” ( un număr în virgulă mobilă de 16 biți ). Limbajul suportă funcții și structuri. Limbajul are optimizări deosebite sub formă de „packed arrays” ( în engleză packed arrays ): declarații precum „float a[4]” și „float4 a” corespund diferitelor tipuri; a doua declarație creează o „matrice împachetată”; operațiunile cu o „matrice împachetată” sunt mai rapide decât cu una normală. În ciuda faptului că limbajul a fost dezvoltat de nVidia, codul sursă poate fi compilat în instrucțiuni pentru plăcile video GPU de la ATI . Trebuie remarcat faptul că toate programele shader au propriile lor caracteristici, care pot fi învățate din surse specializate. Limbaje de programare Shader pentru DirectX DirectX ASM DirectX ASM este un limbaj de programare shader de nivel scăzut conceput pentru DirectX . Sintaxa limbajului este similară cu sintaxa limbajului de asamblare pentru procesoarele x86 . Există mai multe versiuni ale limbajului, care diferă unele de altele în seturile de instrucțiuni GPU acceptate și cerințele hardware. Un vertex shader poate consta din 100-200 de instrucțiuni. Numărul de instrucțiuni pentru pixel shader este mai limitat; de exemplu, în versiunea de limbă 1.4, un pixel shader nu poate include mai mult de 32 de instrucțiuni. HLSL HLSL ( High Level S hader Language ) este un limbaj de programare shader de nivel înalt conceput pentru DirectX și similar cu C. Este un add-on pentru limbajul DirectX ASM . Vă permite să utilizați structuri, proceduri și funcții.