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.

Shaders sunt scrise în GLSL sau HLSL, sunt compilate pe CPU, apoi trimise și executate pe GPU.

Limbaje de programare

modificare

Curent 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

modificare

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

modificare

Resurse Adiționale

modificare

Legături externe

modificare

Referințe

modificare
  1. ^ Despre OpenGL, descrierea platformei OpenGL
  2. ^ Developing games - Microsoft, Descrierea posibilităților platformei DirectX.