Shader

De la Wikipedia, enciclopedia liberă
Salt la: Navigare, căutare

Un shader este o funcționalitate executată pe procesorul grafic, care redă o parte din scena 3D în aplicații grafice. 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.

Limbaje de programare[modificare | modificare sursă]

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 | modificare sursă]

Sunt 2 tipuri de shadere: Vertex shader și Fragment/Pixel shader. De obicei ele se utilizează în tandem. Vertex shader se execută pentru fiecare vector din modelele afișate. După aceasta modelele se rasterizează, și pentru fiecare pixel individual după aceasta se execută Pixel/Fragment shader. Un vertex shader poate determina culorile din jurul acelui vector, poate schimba poziția sa în spațiu, ș.a. Un pixel shader de obicei calculează culoarea și transparența pixelului respectiv. Pixel shader se execută practic înainte de afișare, când deja majoritatea lucrului cu poziționarea este efectuat.
Din cauza că există mult mai mulți pixeli decât vectori, execuția lor durează mai mult timp decât procesarea vectorilor.
Lucrul cu shaderii 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 | modificare sursă]

Resurse Adiționale[modificare | modificare sursă]

Legături externe[modificare | modificare sursă]

Referințe[modificare | modificare sursă]

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