Documente Academic
Documente Profesional
Documente Cultură
În lumea reală, atunci când lumina provenită de la diferite surse de lumină cade asupra
obiectelor opace, o parte este absorbită de obiecte, iar o parte este reflectată. Ochiul percepe
lumina reflectată de obiect, pentru a interpreta forma, culoarea si alte detalii ale obiectului.
Pentru calculul iluminării în grafica pe calculator trebuie să fie definite sursele de lumină
si interacţiunea dintre lumină si suprafeţe.
Un model de iluminare defineste natura luminii emise de o sursă de lumină, adică
distribuţia intensităţii luminii. Un model de reflexie descrie interacţiunea dintre lumină si o
suprafaţă, în funcţie de proprietăţile suprafeţei si natura sursei de lumină. Implementarea
unuimodel de reflexie în procesul de calculare a intensităţii culorii fiecărui pixel este cunoscută
sub numele de tehnică de umbrire.
Biblioteca OpenGL implementează modelul de reflexie Phong si modelele de umbrire
poligonală si umbrire Gouraud.
În mod implicit, sistemul de iluminare este inactivat si pentru desenarea primitivelor
geometrice se foloseste culoarea curentă. Pentru validarea iluminării obiectelor, se activează
sistemul de iluminare OpenGL prin apelul funcţiei glEnable(GL_LIGHTING).
Pentru calculul iluminării obiectelor trebuie să fie definite: sursele de lumină,
materialul suprafeţelor, modelul de umbrire a suprafeţelor.
1. Specificarea culorii
OpenGL permite utilizarea a două moduri de reprezentare a culorilor de afisare:
- modul RGBA: pentru fiecare pixel se memorează valorile R (Red), G (Green), B (Blue)
si A (Alpha);
- modul indexat: pentru fiecare pixel se memorează un număr, reprezentând un index
într-o tabelă de culori.
Modul RGBA este cel mai utilizat. În modul RGBA, pentru selectarea culorii curente
se folosesc funcţiile glColor#().
Funcţiile glColor3() specifică un triplet (R, G, B). Funcţiile glColor4() adaugă la tripletul
(R, G, B) o valoare de opacitate, numită valoare alfa (A). Valorile R, G, B si A variază în
domeniul [0,1] . Valoarea implicită a opacităţii este 1.0. Când sunt specificate valori din afara
domeniului [0,1] , acestea se mapează liniar în acest interval.
Argumentul light reprezintă indexul sursei de lumină si poate lua un nume simbolic
de forma GL_LIGHT0, GL_LIGHT1, ..., GL_LIGHTi,unde 0 i GL_MAX_LIGHTS -1.
Numărul maxim de surse de lumină depinde de implementarea bibliotecii.
Argumentul pname specifică un parametru al sursei de lumină. Sunt acceptate mai
multe valori, dinte care unele se referă la intensitatea culorii, iar altele la poziţia sursei (tabelul1).
Tabelul 1.
Valorile GL_AMBIENT, GL_DIFFUSE si GL_SPECULAR ale argumentului pname
permit definirea componentelor intensităţii culorii sursei de lumină. În primele două funcţii
argumentul params reprezintă valoarea care se va atribui parametrului indicat de pname. În
celelalte două funcţii, argumentul params reprezintă un pointer la un vector de patru valori
(de tip întreg sau virgulă flotantă), care specifică intensităţile RGBA ale componentei de
iluminare ambientală, difuză si speculară. Valorile implicite ale intensităţilor sunt (0.0, 0.0,
0.0, 1.0) pentru componenta ambientală si pentru componenta difuză si speculară a oricărei
lumini cu excepţia luminii cu index 0, care are intensitatea difuză si speculară implicită (1.0,
1.0, 1.0, 1.0).
Implicit acesti parametri au valorile kc=1, kl =0 , kq =0 , dar ei pot fi setaţi prin apelul uneia
din funcţiile glLightf() sau glLighti() astfel:
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);
glLightf(GL_LIGHT0, GL_LINEAR_ ATTENUATION, 1.0);
glLightf(GL_LIGHT0, GL_QUADRATIC_ ATTENUATION, 0.5);
Dacă se folosesc mai multe surse de lumină, pentru fiecare din ele se definesc
componentele intensităţii, poziţia si caracteristicile de atenuare.
Din cele prezentate anterior rezultă că pentru calculul intensităţii culorii unei suprafeţe,
trebuie definiţi coeficienţii de reflexie ambientală, difuză si speculară. Aceste proprietăţi sunt
considerate proprietăţi de material ale suprafeţei si se specifică prin apelul uneia sau mai multora
din cele patru variante ale funcţiei glMaterial#():
În aceste funcţii, argumentul face este numele feţei si depinde de orientarea acesteia;
poate lua ca valori constantele simbolice GL_FRONT, GL_BACK, GL_FRONT_AND_BACK.
Argumentul pname specifică proprietatea materialului, care se defineste prin apelul funcţiei
glMaterial#(). Acest argument poate lua una din următoarele valorile date în tabelul 2.
Tabelul 2
5. Aplicaţii
Exemplul 1
Să se afiseze un triunghi folosind modelul de colorare (umbrire) Gouraud. Vârfurile
triunghiului au culorile rosu, verde si, respectiv, albastru (fig. 2).
Fig. 2 Afisarea unui triunghi folosind modelul Gouraud
a) b)
Fig. 3 a) umbrire poligonală; b) umbrire Gouraud
O parte din funcţii sunt date mai jos.
Exemplul 3
Să se afiseze sfera din exemplul 2, folosind modelul Gouraud. La apăsarea unuia din cele
trei butoane ale mouse-ului se vor schimba coeficienţii de difuzie ai materialului: butonul din
stânga schimbă componenta rosie, cel din mijloc componenta verde si cel din dreapta
componenta albastră. Pentru modificare parametrilor de material se poate folosi funcţia:
void glColorMaterial(GLenum face, GLenum mode);
Această funcţie actualizează proprietăţile de material specificate de parametrul mode pentru
feţele specificate de parametrul face. Astfel, o modificare asupra culorii curente, folosind
funcţia glColor#() actualizează imediat proprietăţile de material specificate.
Soluţie. Principalele funcţii din program sunt prezentate mai jos.
Exemplul 4
Să se realizeze o aplicaţie în care o sursă de lumină este rotită în jurul unui tor. Când este
apăsat un buton al mouse-ului, sursa de lumină îsi schimbă poziţia cu 30 grade. Sursa de
lumină se va reprezenta printr-un mic cub wireframe.
Soluţie. Programul care realizează cerinţele problemei este prezentat mai jos.
MISCARE_SURSA.CPP