Note de curs, programare grafică, 2 decembrie 2013

From Algopedia
Revision as of 14:18, 6 February 2014 by Dan (talk | contribs) (Created page with "În acest curs am prezentat o viziune de ansamblu asupra OpenGL ES 2.0, prezentând caracteristicile generale ale tuturor claselor de obiecte suportate și a liniei de procesa...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

În acest curs am prezentat o viziune de ansamblu asupra OpenGL ES 2.0, prezentând caracteristicile generale ale tuturor claselor de obiecte suportate și a liniei de procesare.

Clasele de obiecte

Buffers

Obiectele de tip buffer se folosesc pentru stocarea de date în memoria plăcii video. Ele pot conține orice fel de informație, de orice tip de date și de orice dimensiune (cu condiția să poată fi stocată).

Textures

Obiectele de tip textură se folosesc, de regulă, pentru stocarea de imagini în memoria plăcii video și aplicarea acestora pe suprafețele obiectelor desenate.

În situații mai complexe, ele pot fi folosite și ca destinație pentru linia de procesare. Altfel spus, placa grafică poate să deseneze și în texturi, nu doar pe ecran.

Programs

Obiectele de tip program conțin partea programabilă a liniei de procesare. Trebuie menționat faptul că placa video nu poate desena nimic fără să folosească un program.

Programale sunt întotdeauna compuse din două secvențe de cod, numite shadere.

Shaders

Obiectele de tip shader stochează secvențele de cod care vor fi rulate pe placa grafică. Secvențele de cod pot fi transmise sub formă de cod scris în OpenGL ES Shading Language 1.00 sau sub formă de cod binar, deja compilat.

Există două tipuri de obiecte de tip shader:

  • vertex shader: de regulă se folosește pentru transformările spațiale (poziționarea obiectelor în spațiu);
  • fragment shader: de regulă se folosește pentru colorarea suprafețelor obiectelor.

Framebuffers

Obiectele de tip framebuffer stochează imaginea generată de linia de procesare. Framebufferul implicit este ecranul.

Folosirea obiectelor de tip frambuffer permit desenarea în memorie, fără a afecta imaginea de pe ecran.

Un obiect de tip framebuffer este format din trei componente, care pot fi privite ca straturi diferite ale aceleiași imagini. Aceste componente sunt:

  • culoarea: pentru fiecare pixel al imagini, stochează culoarea acestuia, sub forma a 4 numere (numite și canale de culoare): roșu, verde, albastru și alfa;
  • adâncimea: pentru fiecare pixel al imagini, stochează adâncimea acestuia - se folosește pentru a determina care sunt porțiunile vizibile ale obiectelor desenate;
  • sencil: pentru fiecare pixel al imagini, stochează nu număr folosit în testul stencil - se folosește pentru efecte grafice 2D

Renderbuffers

Obiectele de tip renderbuffer pot fi atașate la obiectele de tip framebuffer. Și texturile pot fi atașate.

Linia de procesare

Linia de procare este formată dintr-o secvență fixă de pași care puși cap la cap iau date brute de intrare și generează o imagine care este afișată pe ecran sau scrisă în memorie.

Trebuie menționat că pentru generarea unei imagini obișnuite, linia de procesare trebuie executată de câteva milioane de ori. De obicei, aceasta se execută de către placa grafică la nivel hardware, în paralel, pe mii de microcipuri identice.

Operațiile principale ale liniei de procesare sunt:

  • vertex processing: primește raw data (date brute) și returnează vertexes (vârfuri);
  • primitive processing: primește vertexes (vârfuri) și returnează primitives (primitive);
  • rasterization: primește primitives (primitive) și returnează fragments (fragmente);
  • fragment processing: primește fragments (fragmente) și returnează pixels (pixeli);
  • pixel processing: primește pixels (pixeli) și returnează output image (imaginea);

Raw data (date brute)

Datele brute sunt vectori de orice fel de tip de date care, de obicei, sunt stocați cu ajutorul obiectelor de tip buffer în memoria plăcii video. Acești vectori conțin date care vor fi ulterior folosite de către linia de procesare pentru generarea imaginii. Cade în sarcina programatorului să contruiască aceste date și să le transmită plăcii video.

Vertexes (vârfuri)

Un vârf este un punct în spațiu, dat prin coordonate omogene, căruia i se pot atașa și alte caracteristici, după cum consideră necesar programatorul. Aceste vârfuri definesc conturul obiectelor care urmează să fie desenate. Caracteristicile suplimentare pe care le poate avea un vârf reprezintă, de regulă, culoarea, vectorul perpedicular pe suprafață sau coordonata în cadrul unei texturi.

Un punct în spațiu poate fi definit prin cvatuplu: (x, y, z, w). Dacă w este diferit de 0, atunci (x, y, z, w) corespunde punctului (x/w, y/w, z/w) în coordonate euclidiene. De obicei, w = 1. Pentru mai multe detalii, citiți și [[[1]]].

Vertex processing

În această etapă datele brute sunt regrupate și, posibil, reordonate. Fiecare grup de date formează (descriu) un vârf. Prin intermediul vertex shader-ului se realizează transformări afine asupra vârfurilor.

Primitives (primitive)

Primitivele sunt obiecte geometrice simple, care pot fi desenate de către linia de procesare. Primitivele pot fi:

  • puncte: definite de un singur vârf;
  • linii: definite de două vârfuri;
  • triunghiuri: definite de trei vârfuri.

Primitive processing

În această etapă vârfurile sunt grupate câte 1, 2 sau 3 pentru a forma primitive (puncte, linii sau respectiv triunghiuri). Coordonatele omogene ale vârfurilor sunt transformate în coordonate euclidiene și apoi în coordonate ecran. Primitivele care nu sunt vizibile sunt eliminate complet sau truchiate la marginea ecranului.

Fragments (fragmente)

Fragmentele sunt suprafețe de dimensiunea unui pixel care alcătuiesc o primitivă. Fragmentele au coordonate spațiale și moștenesc toate proprietățile vârfurilor, cu valorile lor calculate, de obicei, prin interpolare liniară.

Rasterization

Rasterizarea este procesul prin care o primitivă este transformată în fragmentele care o alcătuiesc, iar pentru fiecare dintre aceste fragmente sunt calculate proprietățile lor, folosind de obicei interpolarea liniară.

Pixels (pixeli)

Pixelii sunt elementele constitutive ale unei imagini. Un pixel este caracterizat prin poziție (x, y), culoare (R, G, B, A) și adâncime.

Fragment processing

În această etapă fragmentele care nu aparțin porțiunii vizibile a ecranului sunt eliminate (ignorate). Fragment shader-ul poate modifica culoarea fragmentului, în funcție de celelalte proprietăți ale sale (ex.:vectorul perpendicular pe suprafață, coordonata texturii) și alți factori (ex.: poziția unei surse de lumină).

Fragmentele care ar trebui desenate "în spatele" imaginii deja desenate sunt eliminate (ignorate), iar fragmentele neignorate devin pixeli, care vor actualiza imaginea deja desenată.

Imaginea de ieșire

imaginea de ieșire este identificată prin framebuffer-ul activ. Implicit și de cele mai multe ori, acesta este ecranul.

Pixel processing

În această etapă (ultima) pixelii sunt salvați în framebuffer. Dacă pixelul este transparent, culoarea acestuia este amestecată (blended) cu culoarea deja existentă în framebuffer. La această etapă se poate aplica și un efect de dithering. În final, de obicei culoarea, adâncimea și valoarea stencil sunt salvate în framebuffer.