Shader
Un shader este un program ce se execută pe unitatea de procesare grafică GPU și redă scena 3D monitorul 2D, ori într-o imagine bitmap. Shaderele sunt compilate din cod sursă, scris în limbajul GLSL ori altul, cu o sintaxă asemănatoare limbajului C. Ele sunt folosite în așa tehnologii precum OpenGL, Vulkan, WebGL, Direct 3D. Cuvântul provine din limba engleză, "Shade" însemnând "umbră", "shader" fiind "cel care umbrește", deoarece inițial destinația lor era de a calcula, în dependență de locul sursei luminii, părțile luminate și cele umbrite ale unui corp. În sensul mai larg al cuvântului, shaderele au fost introduse ca etape adiționale de transformare în alte tehnologii grafice înainte de a fi introduse în tehnologiile 3D.
Limbaje de programare
modificareCurent există două interfețe pentru aplicații grafice, OpenGL și DirectX (sau Direct3D). OpenGL este un standard deschis utilizat pe toate platformele[1], pe când DirectX este un standard proprietar, elaborat și distribuit de Microsoft în sistemul de operare Windows și dispozitivele lansate de Microsoft precum XBox.[2] OpenGL utilizează limbajul GLSL (Graphics Library Shading Language), iar DirectX utilizează limbajul HLSL (High Level Shading Language). Principiile de lucru sunt similare. Ambele limbaje au fost construite pe baza limbajului C.
Tipurile de shadere și principiul de lucru
modificareAcest articol sau această secțiune are bibliografia incompletă sau inexistentă. Puteți contribui prin adăugarea de referințe în vederea susținerii bibliografice a afirmațiilor pe care le conține. |
Sunt cinci tipuri de shadere. Cel mai frecvent se utilizează două dintre ele: Vertex Shader și Fragment Shader. Celelalte sunt Tessellation Control Shader, Tessellation Evaliattion Shader, Geometry Shader. Shaderele de teselare sunt apărute in OpenGL versiunea 4. Vertex shader se execută pentru fiecare vertex din modelele afișate. Apoi primitivele din Vertex Shader se interpolează, și se execută Fragment Shader pentru fiecare pixel. În Vertex Shader pot fi produse manipulări asupra coordonatei și asupra culorii vertexului. Un Fragment Shader de obicei calculează culoarea și transparența pixelului respectiv. Datele pot fi afișate la ecran ori într-o imagine rastru, adesea folosită pentru a produce textură. Alte calcule pot fiefectuate în Fragment Shader, cum ar fi harta de adâncimi, folosită la calcularea umbrelor. Fragment Shader este ultima etapă programabilă care se execută înainte de se execută practic înainte de afișare, când deja majoritatea lucrului cu poziționarea este efectuat.
Lucrul cu shaderele este bazat pe vectori și matrici, și OpenGL și DirectX oferă funcții pentru operarea cu matricile (normalizare, înmulțire).
Tot ce ține de shadere se rotește în jurul performanței. OpenGL și DirectX paralelizează acest proces, folosind avantajul procesoarelor grafice, de a conține sute de nuclee care pot procesa informația în paralel. Shaderii sunt operații de genul SIMD (o singură instrucțiune, multe date).
Exemplu de vertex shader în OpenGL ES:
varying vec3 vNormal;
void main() {
vNormal = normal;
gl_Position = projectionMatrix *
modelViewMatrix *
vec4(position,1.0);
}
Exemplu de un simplu Fragment Shader în OpenGL ES, care face posibilă umbrirea obiectului alb-negru în dependență de poziția luminii:
varying vec3 vNormal;
void main() {
//definim coordonatele luminii
vec3 light = vec3(0.5,0.2,1.0);
//normalizam, e nevoie ca lungimea vectorului sa fie 1
light = normalize(light);
//calculam produsul vectorilor Normală și lumină pentru a afla unghiul de incidență
float dProd = max(0.0, dot(vNormal, light));
//setăm culoarea pixelului
gl_FragColor = vec4(dProd, dProd, dProd, 1.0);
}
Vezi și
modificareResurse Adiționale
modificare- GLSL: OpenGL Shading Language @ Lighthouse 3D - GLSL Tutorial
- Steve Upstill: The RenderMan Companion: A Programmer's Guide to Realistic Computer Graphics, Addison-Wesley, ISBN 0-201-50868-0
- David S. Ebert, F. Kenton Musgrave, Darwyn Peachey, Ken Perlin, Steven Worley: Texturing and modeling: a procedural approach, AP Professional, ISBN 0-12-228730-4. Ken Perlin is the author of Perlin noise, an important procedural texturing primitive.
- Randima Fernando, Mark Kilgard. The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics, Addison-Wesley Professional, ISBN 0-321-19496-9
- Randi J. Rost: OpenGL Shading Language, Addison-Wesley Professional, ISBN 0-321-19789-5
- Riemer's DirectX & HLSL Tutorial Arhivat în , la Wayback Machine.: HLSL Tutorial using DirectX with lots of sample code
- HLSL Tutorials Arhivat în , la Wayback Machine.: HLSL tutorials on shader structure and how to implement multiple types of lighting.
- GPGPU: general purpose GPU
- MSDN: Pipeline Stages (Direct3D 10)
Legături externe
modificare- OpenGL geometry shader extension
- AMD RenderMonkey Arhivat în , la Wayback Machine. - unealtă pentru a dezvolta și experimenta cu shadere.
Referințe
modificare- ^ Despre OpenGL, descrierea platformei OpenGL
- ^ Developing games - Microsoft, Descrierea posibilităților platformei DirectX.