Tendințe - PC Magazine Romania, Decembrie 2003
O nouă revoluție
în interfețele pentru programarea aplicațiilor (API-urile) grafice
Rodica Baciu
În ultimele două decenii interesul pentru grafica cu calculatorul a crescut
progresiv. În mod evident a crescut și dorința dezvoltatorilor de aplicații
grafice de a scrie aplicații capabile să ruleze pe o varietate de platforme
având capacități grafice diferite. Un standard grafic ușurează această sarcină
prin eliminarea necesității de a scrie un driver grafic distinct pentru fiecare
platformă pe care rulează aplicația. În prezent există câteva standarde grafice
pentru aplicațiile grafice interactive 3D, și anume OpenGL, PHIGS, PEX, IrisGL,
Direct3D, RenderMan, etc. Printre aceste standarde OpenGL s-a bucurat în ultimul
deceniu de o largă acceptare în lumea programatorilor.
Interfața grafică OpenGL
Efortul de definire a standardului grafic OpenGL (Open Graphics Library) a
început în anii 1990 și specificarea primei versiuni OpenGL s-a realizat în
1992. O implementare OpenGL poate fi în mod eficient găzduită la aproape orice
nivel al hardware-ului grafic, de la memoria video de bază la cele mai sofisticate
subsisteme grafice.
Specificația OpenGL este realizată de un consorțiu independent, OpenGL Architecture
Review Board (ARB), printre ai cărui membrii se află Silicon Graphics și Microsoft.
Adăugările la specificații (prin extensii) sunt bine controlate de consorțiu
și actualizările propuse sunt anunțate din timp pentru ca dezvoltatorii să adopte
modificările. Este asigurată compatibilitatea cu dezvoltările anterioare ale
bibliotecii. În prezent s-a ajuns la versiunea 1.4.
Figura 1 arată schema fluxului de procesare OpenGL. Comenzile intră spre OpenGL
prin stânga. Comenzile nu sunt altceva decât apeluri de funcții și proceduri
OpenGL. Multe dintre comenzi pot fi acumulate în liste de display pentru o procesare
ulterioară. În cazul în care se lucrează cu procesare imediată comenzile sunt
transmise prin fluxul de procesare OpenGL.
Primul stadiu de procesare asigură o modalitate eficientă pentru aproximarea
curbelor și a suprafețelor curbe prin evaluarea funcțiilor polinomiale ale valorilor
de la intrare și modelarea acestora prin primitive geometrice OpenGL(puncte,
segmente de dreaptă și poligoane). Acest stadiu este parcurs doar de acele comenzi
utilizate pentru reprezentarea curbelor și a suprafețelor parametrice. Următorul
nivel operează asupra primitivelor geometrice descrise prin coordonatele vârfurilor.
În acest stadiu vârfurile sunt transformate, se aplică iluminarea și primitivele
sunt decupate față de volumul de vizualizare pentru a fi pregătite pentru nivelul
următor - rasterizarea. Rasterizarea produce o serie de adrese și de valori
pentru memoria video utilizând descrierea 2D pentru punct, segment de dreaptă,
sau poligon. Fiecare fragment (culoarea, coordonatele de textură și adâncimea
z pentru un pixel) alimentează nivelul următor care asigură operații asupra
fragmentelor individuale înainte ca ele să modifice memoria video. Aceste operații
includ actualizări condiționale în memoria video pe baza noilor valori sau a
valorilor de adâncime memorate anterior, amestecarea culorilor fragmentelor
cu culorile memorate, precum și mascarea și celelalte operații logice asupra
valorilor fragmentelor.
Procesarea pixelilor și a imaginilor trece peste secțiunea de procesare a vârfurilor
din flux pentru a transmite un bloc de fragmente în mod direct spre blocul de
rasterizare și blocul operațiilor asupra fragmentelor individuale, determinând
eventual ca un bloc de pixeli să fie scris direct în memoria video. Valorile
pot fi deasemenea citite din memoria video sau copiate dintr-o porțiune a memoriei
video în alta.
De la momentul apariției primei specificații OpenGL s-au realizat progrese
mari în arhitectura hardware-ului grafic. Acesta se schimbă de la modelul unei
mașini de stare fixe (pentru care lucra la început OpenGL) la cel al unei mașini
de stare programabile.
Dorința de a demasca capacitățile extinse ale hardware-ului a condus la un
vast număr de extensii care s-au scris pentru OpenGL, dar consecința neplăcută
a acestui fapt este reducerea sau chiar eliminarea portabilității aplicațiilor
- unul din factorii cheie motivanți pentru OpenGL.
O cale naturală de a reduce această complexitate și proliferarea extensiilor
este de a permite ca anumite nivele din fluxul de procesare OpenGL să fie înlocuite
de nivele programabile de către utilizator. Aceasta s-a realizat la câteva extensii
recente dar programarea este făcută în limbaj de asamblare, care este expresia
directă a hardware-ului actual fără o privire în perspectivă. Aceasta nu este
însă o soluție viabilă, deoarece în mare parte, programatorii au renunțat la
limbajul de asamblare în favoarea limbajelor de nivel înalt, pentru a câștiga
productivitate, portabilitate și ușurință în utilizare.
Hardware-ul grafic programabil
Până nu de mult sfera hardware-ului grafic programabil a aparținut, în principal,
cercetătorilor și dezvoltatorilor driver-elor grafice. Programabilitatea de
bază a hardware-ului nu a fost demascată, așa că dezvoltatorii de aplicații
au fost forțați în utilizarea unei funcționalități fixe asigurată de API-urile
grafice tradiționale.
Motivele pentru care companiile producătoare de hardware nu au demascat fundamentul
programabil al produselor lor sunt:
- educarea și sprijinirea beneficiarilor pentru a utiliza nivelul de jos
al interfețelor specifice dispozitivului este un proces costisitor,
- aceste interfețe de obicei se modifică radical cu fiecare nouă generație
de hardware grafic,
- dezvoltatorii de aplicații care utilizează o asemenea interfață specifică
dispozitivului, pentru o porțiune a hardware-ului grafic, sunt confruntați
cu problema descurajantă a actualizării software-ului lor pentru fiecare nouă
generație de hardware.
- dificultatea susținerii aplicației pentru hardware-uri de la diverși furnizori.
Toate însă evoluează și în acest moment dezvoltatorii de aplicații sunt cei
care, mai mult ca niciodată, trag cortina, și cer diferite caracteristici noi
în hardware pentru a crea efecte de ecran tot mai spectaculoase. Ca rezultat,
noile proiecte de hardware grafic sunt mai programabile decât au fost vreodată.
În acest moment, pentru dezvoltatorii de hardware a devenit mai ușor să susțină
noile caracteristici cerute de dezvoltatorii de aplicații prin demascarea programabilității
fundamentale a hardware-ului. Programabilitatea hardware-ului grafic aduce multe
facilități în aplicațiile grafice: reprezentarea mai realistă a materialelor,
redarea fenomenelor naturale, îmbunătățește texturarea, antialiasing mai bun,
etc.
OpenGL Shading Language (sau GLslang)
Pentru a ține pasul cu inovările la nivelul hardware-ului, fără însă a forța
programatorii să lucreze în limbaj de asamblare, soluția oferită de firmele
din domeniul grafic este un limbaj de nivel înalt pentru OpenGL, independent
de hardware, ușor de utilizat, suficient de puternic pentru a trece testul timpului
și care va reduce drastic nevoia de extensii.
Așa cum am arătat, tendința recentă în hardware-ul grafic este de a înlocui
funcționalitatea fixă cu programabilitatea în porțiuni ale fluxului de procesare
care au devenit extrem de complexe - procesarea vârfurilor și procesarea fragmentelor.
GLslang a fost proiectat pentru a permite programatorilor de aplicații să exprime
procesarea care apare în aceste puncte programabile ale fluxului OpenGL.
Dar de ce "shading language"?
Unitățile scrise în acest limbaj și care sunt compilabile în mod independent
sunt denumite shader-e. Un program este un set de shader-e care sunt compilate
și linkeditate împreună. Există unele dispute că shading (umbrire) are conotații
de stabilire a nivelului intensității așa că nu se potrivește cu operațiile
pentru vârfuri. RenderMan însă nu face aceste distincții și nici DX8. S-a ales
așadar varianta de a continua cu utilizarea de shader ca termen general pentru
un program care operează asupra unei părți a fluxului grafic.
GLslang este bazat pe ANSI C și are caracteristici similare cu RenderMan. Multe
din caracteristicile C au fost păstrate cu excepția cazurilor în care acestea
intră în conflict cu performanța sau ușurința în implementare a GLslang. C a
fost extins cu tipuri de date matriceale și vectoriale pentru a-l face mai concis
pentru operațiile tipice cerute de grafica 3D. GLslang include suport pentru
bucle, apeluri de subrutine, și expresii condiționale. Au fost deasemenea împrumutate
unele mecanisme din C++, cum ar fi supraîncărcarea funcțiilor, și abilitatea
de a declara variabile acolo unde este nevoie prima dată de ele și nu obligatoriu
la începutul blocului.
Idea acestui limbaj a fost lansată de firma 3Dlabs la conferința SIGGRAPH 2001.
Firma 3Dlabs a realizat specificarea limbajului, compilatorul și articole pe
marginea limbajului. Specificarea limbajului GLslang a fost aprobată în 11 iunie
2003 ca extensie oficială ARB. ARB intenționează să încorporeze GLslang în specificația
de bază cât mai curând posibil - creând versiunea OpenGL 2.0. Firma 3Dlabs susține
acest efort și preconizează chiar ca aceasta să aibă loc până la finele anului
2003.
Continuând tradiția de compatibilitate "backwards", pe care au avut-o
toate cele patru versiuni OpenGL, OpenGL 2.0 va fi un superset al lui OpenGL
1.4, astfel că aplicațiile mai vechi vor rula pe acceleratoarele hardware cu
drivere OpenGL 2.0 fără modificări.
Firma 3Dlabs este prima producătoare de drivere GLslang. Astfel Wildcat VP
OpenGL are driver-e care adaugă suport preliminar pentru GLslang.
În figura 2 este evidențiată relația dintre codul limbajului, compilator, driver
și hardware-ul grafic. Driver-ele OpenGL 2.0 existente pe plăcile grafice vor
conține compilatorul necesar transferării codului din limbaj de nivel înalt
GLslang în limbaj mașină executabil de hardware-ul grafic programabil.
Concluzii
Este de așteptat ca producătorii de hardware să lanseze pe piață hardware grafic
care să suporte OpenGL 2.0, este de așteptat ca ARB să includă cât mai curând
specificațiile noului limbaj în nucleul de bază și este de așteptat ca dezvoltatorii
de aplicații să lanseze primele aplicații grafice care au la bază OpenGL 2.0.
Și nu în ultimul rând este de așteptat ca programatorii din România să țină
pasul cu aceste noi provocări din lumea graficii.
|