Modele de iluminare şi reflexie în OpenGL

Σχετικά έγγραφα
Modele de iluminare şi reflexie în OpenGL

MARCAREA REZISTOARELOR

Luminarea obiectelor. {glenable gldisable} (GL_LIGHTING)

Curs 10 Funcţii reale de mai multe variabile reale. Limite şi continuitate.

DISTANŢA DINTRE DOUĂ DREPTE NECOPLANARE

FUNCŢII OPENGL PENTRU REDARE ANTI-ALIASING

Planul determinat de normală şi un punct Ecuaţia generală Plane paralele Unghi diedru Planul determinat de 3 puncte necoliniare

Metode iterative pentru probleme neliniare - contractii

5. FUNCŢII IMPLICITE. EXTREME CONDIŢIONATE.

5.5. REZOLVAREA CIRCUITELOR CU TRANZISTOARE BIPOLARE

Sisteme diferenţiale liniare de ordinul 1

Curs 14 Funcţii implicite. Facultatea de Hidrotehnică Universitatea Tehnică "Gh. Asachi"

Aplicaţii ale principiului I al termodinamicii la gazul ideal

Metode de interpolare bazate pe diferenţe divizate

Esalonul Redus pe Linii (ERL). Subspatii.

Analiza în curent continuu a schemelor electronice Eugenie Posdărăscu - DCE SEM 1 electronica.geniu.ro

(a) se numeşte derivata parţială a funcţiei f în raport cu variabila x i în punctul a.

Curs 4 Serii de numere reale

Curs 1 Şiruri de numere reale

a n (ζ z 0 ) n. n=1 se numeste partea principala iar seria a n (z z 0 ) n se numeste partea

Asupra unei inegalităţi date la barajul OBMJ 2006


riptografie şi Securitate

Subiecte Clasa a VII-a

Integrala nedefinită (primitive)

Laborator 11. Mulţimi Julia. Temă

Problema a II - a (10 puncte) Diferite circuite electrice

Subiecte Clasa a VIII-a

V.7. Condiţii necesare de optimalitate cazul funcţiilor diferenţiabile

Sistemul de vizualizare OpenGL. 1. Definirea proiecńiei perspectivă şi a volumului de vizualizare

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor X) functia f 1

a. 11 % b. 12 % c. 13 % d. 14 %

Definiţia generală Cazul 1. Elipsa şi hiperbola Cercul Cazul 2. Parabola Reprezentari parametrice ale conicelor Tangente la conice

R R, f ( x) = x 7x+ 6. Determinați distanța dintre punctele de. B=, unde x și y sunt numere reale.

Seminar 5 Analiza stabilității sistemelor liniare

Criptosisteme cu cheie publică III

Functii definitie, proprietati, grafic, functii elementare A. Definitii, proprietatile functiilor

Geometrie computationala 2. Preliminarii geometrice

Seminariile Capitolul X. Integrale Curbilinii: Serii Laurent şi Teorema Reziduurilor

prin egalizarea histogramei

III. Serii absolut convergente. Serii semiconvergente. ii) semiconvergentă dacă este convergentă iar seria modulelor divergentă.

SEMINAR 14. Funcţii de mai multe variabile (continuare) ( = 1 z(x,y) x = 0. x = f. x + f. y = f. = x. = 1 y. y = x ( y = = 0

1.7. AMPLIFICATOARE DE PUTERE ÎN CLASA A ŞI AB

2. Sisteme de forţe concurente...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...3

RĂSPUNS Modulul de rezistenţă este o caracteristică geometrică a secţiunii transversale, scrisă faţă de una dintre axele de inerţie principale:,

3. REPREZENTAREA PLANULUI

Exemple de probleme rezolvate pentru cursurile DEEA Tranzistoare bipolare cu joncţiuni

2.1 Sfera. (EGS) ecuaţie care poartă denumirea de ecuaţia generală asferei. (EGS) reprezintă osferă cu centrul în punctul. 2 + p 2

Conice. Lect. dr. Constantin-Cosmin Todea. U.T. Cluj-Napoca

Κεφάλαιο 6 ο Φωτορεαλισµός

REPREZENTĂRI GRAFICE ÎN SPAłIUL TRIDIMENSIONAL (3D)


Profesor Blaga Mirela-Gabriela DREAPTA

SERII NUMERICE. Definiţia 3.1. Fie (a n ) n n0 (n 0 IN) un şir de numere reale şi (s n ) n n0

3. Momentul forţei în raport cu un punct...1 Cuprins...1 Introducere Aspecte teoretice Aplicaţii rezolvate...4

Ecuaţia generală Probleme de tangenţă Sfera prin 4 puncte necoplanare. Elipsoidul Hiperboloizi Paraboloizi Conul Cilindrul. 1 Sfera.

Componente şi Circuite Electronice Pasive. Laborator 3. Divizorul de tensiune. Divizorul de curent

Curs 2 DIODE. CIRCUITE DR

5.4. MULTIPLEXOARE A 0 A 1 A 2

COLEGIUL NATIONAL CONSTANTIN CARABELLA TARGOVISTE. CONCURSUL JUDETEAN DE MATEMATICA CEZAR IVANESCU Editia a VI-a 26 februarie 2005.

Laborator 1: INTRODUCERE ÎN ALGORITMI. Întocmit de: Claudia Pârloagă. Îndrumător: Asist. Drd. Gabriel Danciu

2 Transformări liniare între spaţii finit dimensionale

BARAJ DE JUNIORI,,Euclid Cipru, 28 mai 2012 (barajul 3)

LUCRAREA NR. 1 STUDIUL SURSELOR DE CURENT

Zgomotul se poate suprapune informaţiei utile în două moduri: g(x, y) = f(x, y) n(x, y) (6.2)

Cum folosim cazuri particulare în rezolvarea unor probleme

Ecuatii trigonometrice

Examen AG. Student:... Grupa: ianuarie 2016

Toate subiectele sunt obligatorii. Timpul de lucru efectiv este de 3 ore. Se acordă din oficiu 10 puncte. SUBIECTUL I.

III. Reprezentarea informaţiei în sistemele de calcul

Fig Impedanţa condensatoarelor electrolitice SMD cu Al cu electrolit semiuscat în funcţie de frecvenţă [36].

z a + c 0 + c 1 (z a)

y y x x 1 y1 Elemente de geometrie analiticã 1. Segmente 1. DistanŃa dintre douã puncte A(x 1,y 1 ), B(x 2,y 2 ): AB = 2. Panta dreptei AB: m AB =

Capitolul 4. Integrale improprii Integrale cu limite de integrare infinite

Algoritmica grafurilor XI. Cuplaje in grafuri. Masuri de calitate. Numere Ramsey

TEMA 9: FUNCȚII DE MAI MULTE VARIABILE. Obiective:

Grafică pe calculator. Mihai-Sorin Stupariu

Capitolul 4 PROPRIETĂŢI TOPOLOGICE ŞI DE NUMĂRARE ALE LUI R. 4.1 Proprietăţi topologice ale lui R Puncte de acumulare

SEMINARUL 3. Cap. II Serii de numere reale. asociat seriei. (3n 5)(3n 2) + 1. (3n 2)(3n+1) (3n 2) (3n + 1) = a

7. Fie ABCD un patrulater inscriptibil. Un cerc care trece prin A şi B intersectează

Desen tehnic si Infografică (2); Note de curs - Curs 7 -

CUPRINS 5. Reducerea sistemelor de forţe (continuare)... 1 Cuprins..1

FLUXURI MAXIME ÎN REŢELE DE TRANSPORT. x 4

Conice - Câteva proprietǎţi elementare

Lab06: Extragerea trăsăturilor şi selecţia trăsăturilor. Aplicaţie pentru recunoaşterea obiectelor bazată pe formă.

SEXTANTUL CUM FUNCŢIONEAZĂ UN SEXTANT?

VII.2. PROBLEME REZOLVATE

Curs 2 Şiruri de numere reale

IV. CUADRIPOLI SI FILTRE ELECTRICE CAP. 13. CUADRIPOLI ELECTRICI

Sisteme liniare - metode directe

Colegiul Tehnic Dimitrie Leonida Prof. Jiduc Gabriel. AutoCAD: Comenzi de desenare

EDITURA PARALELA 45 MATEMATICĂ DE EXCELENŢĂ. Clasa a X-a Ediţia a II-a, revizuită. pentru concursuri, olimpiade şi centre de excelenţă

prin operaţii punctuale

1.3 Baza a unui spaţiu vectorial. Dimensiune

2. Circuite logice 2.4. Decodoare. Multiplexoare. Copyright Paul GASNER

Progresii aritmetice si geometrice. Progresia aritmetica.

Să se arate că n este număr par. Dan Nedeianu

4. Măsurarea tensiunilor şi a curenţilor electrici. Voltmetre electronice analogice

Universitatea din Bucureşti Facultatea de Matematică şi Informatică. Algebră (1)

Reflexia şi refracţia luminii.

Transcript:

EGC -Lucrarea 9 Modele de iluminare şi reflexie în OpenGL 4. Modele de umbrire a suprafeńelor 4.1 Tipuri de modele de umbrire utilizate în OpenGL Prin model de umbrire (shading) înńelegem un model prin care de determină culoarea de afişare a unui obiect. Modele de umbrire mai sunt numite şi modele de colorare. În OpenGL sunt implementate două modele de umbrire (de colorare): umbrire constantă sau poligonală; umbrire Gouraud. Modelul de umbrire se defineşte prin apelul funcńiei: glshademodel(glenum mode); unde argumentul mode poate lua una din valorile GL_FLAT, pentru modelul de umbrire poligonală, sau GL_SMOOTH, pentru modelul de umbrire Gouraud. Valoarea implicită este GL_SMOOTH. În cazul în care nu este validat sistemul de iluminare (prin apelul funcńiei glenable(gl_lighting)) culoarea care se atribuie vârfurilor primitivelor geometrice este culoarea curentă, setată prin apelul unei funcńii glcolor#(). Dacă se defineşte modelul de umbrire poligonală (GL_FLAT), primitivele geometrice se generează de culoare constantă (culoarea curentă întâlnită la primul vârf introdus prin funcńia glvertex#()). În cazul modelul de umbrire Gouraud (GL_SMOOTH) culorile definite în vârfuri se folosesc pentru calculul intensităńii culorilor pixelilor primitivei geometrice prin interpolare liniară. Culoarea fiecărui vârf este tratată individual. Pentru un segment de dreaptă, culoarea se obńine prin interpolarea culorilor vârfului. Pentru un poligon, culorile punctelor interioare se obńin prin interpolare pe baza culorilor vârfurilor (fig.2). y s 1 2 P M Q y = 4 y s O 3 Fig. 2 Interpolarea liniară a intensităńilor vârfurilor în modelul Gouraud x s 1

SPG -Lucrarea 9 De exemplu, intensitatea punctelor de pe linia I P I Q I M y = ys se calculează astfel: I1 I2 I1 ( y y), y1 y2 I1 I4 I1 ( y y), (6) y1 y4 I P IQ = I P ( xp xm x x ). = 1 = 1 P Q Modelul Gouraud prezintă avantajul că se poate integra uşor în algoritmii de generare a scenelor 3D, de exemplu în algoritmul z-buffer sau scan-line. ObservaŃie. În modelul Gouraud nu se poate obńine o pată de lumină (datorată reflexiei speculare) în interiorul unui poligon dacă o parte din vârfurile poligonului nu sunt în această pată. Exemplele 1 şi 2 pun în evidenńă utilizarea modelelor de umbrire constantă şi umbrire Gouraud şi deosebirile dintre acestea. 4.2 Definirea normalelor în vârfurile primitivelor geometrice Pentru calculul reflexiei difuze şi speculare (termenul al doilea şi al treilea din formula 5) este necesar să fie definite normalele în vârfurile primitivelor geometrice. Normala care se foloseşte pentru calculul reflexiei într-un vârf este normala curentă, care se setează prin apelul unei variante a funcńiei glnormal#() şi se memorează într-o variabilă de stare a bibliotecii, identificată prin constanta simbolică GL_CURENT_NORMAL. O parte din prototipurile funcńiilor glnormal#() sunt: void glnormal3d(gldouble nx, GLdouble ny, GLdouble nz); void glnormal3f(glfloat nx, GLfloat ny, GLfLoat nz); void glnormal3i(glint nx, GLint ny, GLint nz); void glnormal3dv(const GLdouble *v); void glnormal3fv(const GLfloat *v); Normala se poate specifica prin componentele nx, ny, nz, sau printr-un pointer la un vector care conńine cele trei componente, de tipul cerut prin numele funcńiei glnormal#(). Normalele se pot defini în orice loc din program, în exteriorul sau în interiorul unui bloc glbegin()-glend(). Dacă normala se defineşte o singură dată printr-o primitivă geometrică, această valoare este folosită pentru calculul intensităńilor tuturor vârfurilor geometrice. În mod normal însă, pentru calculul corect al intensităńilor culorii în vârfuri, este necesar ca normala să fie definită pentru fiecare vârf al primitivei geometrice, deci funcńiile glnormal#() se apelează alternant cu funcńiile glvertex#() în interiorul blocului glbegin()-glend(). Dacă se desenează o sferă folosind funcńia glutsolidsphere() nu este necesar să se definească normalele, deoarece funcńia glutsolidsphere() le defineşte în mod automat, dar, pentru calculul iluminării unui obiect definit printr-o mulńime de primitive date prin vârfurile lor, este necesar să fie definite toate normalele în vârfuri. 2

EGC -Lucrarea 9 Normalele se specifică în acelaşi sistem de referinńă ca şi vârfurile primitivelor geometrice, deci în sistemul de referinńă de modelare. Acest mod de calcul permite ca normalele în vârfuri să fie calculate o singură dată, la modelare, şi memorate ca parte a modelului obiectului în baza de date grafice. Asupra lor se aplică în mod automat transformarea de modelare-vizualizare folosind valoarea matricei din vârful stivei de modelare-vizualizare, existentă în momentul apelului funcńiei glnormal#(). În felul acesta, normalele sunt transformate în sistemul de referinńă de observare, unde se calculează intensităńile componentelor de reflexie în vârfurile primitivelor geometrice. Exemplul 5 evidenńiază necesitatea definirii normalelor pentru calculul iluminării. 5. Controlul pozińiei şi al direcńiei surselor de lumină OpenGL tratează pozińia şi direcńia surselor de lumină la fel cum este tratată pozińia primitivelor geometrice. Prin urmare, sursele de lumină sunt transformate cu aceeaşi matrice de transformare ca şi primitivele geometrice. Atunci când este apelată funcńia gllight#(gl_lighti, GL_POSITION vect) pentru specificarea pozińiei sau direcńiei unei surse de lumină, pozińia sau direcńia este transformată de matricea de modelare-vizualizare curentă şi este memorată în coordonatele sistemului de referinńă de observare. Acest lucru înseamnă că se poate modifica pozińia sau direcńia unei surse de lumină prin modificarea corespunzătoare a matricei de modelare-vizualizare. Matricea de proiecńie nu modifică pozińia surselor de lumină. Sursele de lumină pot fi tratate în trei moduri: - surse cu pozińie fixă; - surse care se deplasează odată cu punctul de observare; - surse care se deplasează în scenă. Surse de lumină cu pozińie fixă. FuncŃia gllight#() cu parametrul GL_POSITION defineşte coordonatele omogene ale pozińiei sursei. Dacă această funcńie este apelată în momentul în care matricea curentă din stiva de modelare-vizualizare conńine matricea de observare, atunci pozińia sursei este transformată în coordonate de observare. PoziŃia în spańiu a sursei rămâne fixă, iar pozińia calculată şi utilizată în calcule este pozińia în coordonate de observare. În exemplele 2, 3, 5 sursele de lumină sunt fixe, deoarece pozińia lor este setată după stabilirea matricei de modelare vizualizare. Surse de lumină care se deplasează odată cu punctul de observare. Pentru a crea surse de lumină care se mişcă odată cu punctul de observare, trebuie ca pozińia sursei să fie setată înainte de transformarea de observare. PoziŃia sau direcńia sursei date prin funcńia gllight#() cu parametrul GL_POSITION este transformată cu matricea curentă din stiva de modelare-vizualizare, care conńine matricea identitate, deci localizarea sursei rămâne constantă fańă de punctul de observare. Acest mod de control al sursei este folosit în simulatoare de antrenament, pentru a simula lumina farurilor vehiculului. Dacă pozińia sursei este (0, 0, 0, 1), atunci sursa este plasată chiar în punctul de observare. În exemplul 6 este tratat cazul unei surse care se deplasează o dată cu observatorul. Surse de lumină care se deplasează în scenă. Se pot defini surse de lumină care se mişcă independent de scena virtuală, prin aplicarea unei transformări de instanńiere (care localizează sursa de lumină în sistemul de referinńă universal), înainte de transformarea de observare (reamintim că în OpenGL transformările acńionează asupra vectorilor coloană şi în program instrucńiunile respective sunt scrise în ordine inversă). La fel ca şi în cazul instanńierii 3

SPG -Lucrarea 9 obiectelor în scenă, se foloseşte matricea curentă din stiva de modelare-vizualizare. Exemplul 7 tratează mişcarea unei surse de lumină în jurul unui obiect din scenă (un tor). 6. Combinarea culorilor. TransparenŃă. CeaŃă 6. 1 Combinarea culorilor Mai multe efecte în redarea obiectelor (transparenńă, ceańă, anti-aliasing) se obńin prin combinarea culorilor la nivel de pixel. Pentru validarea operańiei de combinare a culorilor la nivel de pixel (blending) se apelează funcńia glenable(gl_blend), iar pentru invalidare funcńia gldisable(gl_blend). În cursul combinării, culoarea unui nou fragment (sursă) este combinată cu culoarea memorată într-o locańie corespunzătoare din buffer-ul de culoare, care este şi destinańia pentru înscrierea rezultatului combinării. Pentru combinarea culorilor se calculează factorii de combinare ai sursei şi ai destinańiei. Aceşti factori sunt cvadrupleńi RGBA, care se multiplică cu componentele corespunzătoare R, G, B şi A ale sursei, respectiv ale destinańiei. Pentru o descriere matematică notăm cu ( Sr,Sg,Sb,Sa ) factorii de combinare ai sursei, ( Dr,Dg,Db,Da ) factorii de combinare ai destinańiei, ( Rs,Gs,Bs,As) componentele culorii sursei şi ( R d,gd,bd,ad ) componentele culorii destinańiei. Culoarea rezultată prin combinare are componentele : ( R S R D, G S + G D, B S + B D, A S + A D ) s r +. (7) d r s g d Este posibil ca fiecare componentă a culorii rezultate să fie limitată la intervalul [,1] g 0. Factorii de combinare se pot selecta din mai multe valori posibile prin argumentele transmise funcńiei: void glblendfunc(glenum sfactor, GLenum dfactor); unde parametrii sfactor respectiv dfactor reprezintă factorul de combinare al sursei respectiv al destinańiei. Valorile posibile ale acestor argumente sunt date în tabelul 3. Constanta Sursă-destinaŃie Factorul de combinare GL_ZERO sursă sau destinańie (0, 0, 0, 0) GL_ONE sursă sau destinańie (1, 1, 1, 1) GL_DST_COLOR sursă (Rd, Gd, Bd, Ad) GL_SRC_COLOR destinańie (Rs, Gs, Bs, As) GL_ONE_MINUS_DST_COLOR sursă (1, 1, 1, 1) - (Rd, Gd, Bd, Ad) GL_ONE_MINUS_SRC_COLOR destinańie (1, 1, 1, 1) - (Rs, Gs, Bs, As) GL_SRC_ALPHA sursă sau destinańie (As, As, As, As) GL_ONE_MINUS_SRC_ALPHA sursă sau destinańie (1, 1, 1, 1) - (As, As, As, As) GL_DST_ALPHA sursă sau destinańie (Ad, Ad, Ad, Ad) GL_ONE_MINUS_DST_ALPHA sursă sau destinańie (1, 1, 1, 1) - (Ad, Ad, Ad, Ad) GL_SRC_ALPHA_SATURATE sursă (f, f, f, 1); f = min(as, 1-Ad) s Tabelul 3. factorii de combinare ai sursei şi destinańiei b d b s a d a 4

EGC -Lucrarea 9 6. 2 TransparenŃa Atunci când suprafańa vizibilă într-un pixel este transparentă, culoarea în care va fi afişat pixelul se poate obńine combinând culoarea suprafeńei vizibile I λ1 cu aceea a suprafeńei aflate imediat în spatele său I λ2, folosind următoarea formulă de interpolare: I λ ( 1 kt 1 ) Iλ1+ kt1iλ 2 = (8) unde coeficientul de transmisie k t1 măsoară transparenńa suprafeńei vizibile în pixel, 0 k t1 1. Atunci când k t1 este egal cu 0, suprafańa vizibilă este opacă şi deci pixelul va fi afişat în culoarea sa, I λ1 ; când k t1 este egal cu 1, suprafańa vizibilă este perfect transparentă şi nu contribuie la culoarea pixelului. Când şi suprafańa din spatele celei vizibile este la rândul său transparentă, metoda de calcul se aplică recursiv, până când se întâlneşte o suprafańă opacă sau fondul. Rezultă că transparenńa suprafeńelor se implementează folosind combinarea cu factorii de combinare GL_SRC_ALPHA, pentru sursă şi GL_ONE_MINUS_SRC_ALPHA pentru destinańie (vezi exemplul 8). 6. 3 Simularea ceńii CeaŃa se simulează prin combinarea culorii ceńii cu culoarea fragmentelor suprafeńelor, folosind un factor de combinare f care depinde de distanńa acestora fańă de pozińia de observare. Pentru factorul f există mai multe formule de calcul: dens z s f = e, ( dens z f = e ) 2 s, (9) end z f = s. end start C r a culorii unui fragment (C poate fi R, G, B, A) se calculează prin Fiecare componentă combinarea culorii C a fragmentului cu culoarea s C f a ceńii, prin ecuańia: C r s ( 1 f) C f = f C +. (10) Calculul ceńii se validează prin apelul funcńiei glenable(gl_fog). FuncŃiile prin care se pot defini parametrii de calcul ai ceńii sunt: void glfogf(glenum pname, GLfloat param); void glfogi(glenum pname, GLint param); void glfogfv(glenum pname, const GLfloat *param); void glfogiv(glenum pname, const GLint *param); 5

SPG -Lucrarea 9 Parametrul pname poate lua una din valorile GL_FOG_MODE, GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END pentru definirea modului de calcul, a densităńii, a distanńei de început şi a distanńei de sfârşit a ceńii. Dacă se defineşte modul de calcul, atunci parametrul param poate lua una din constantele simbolice GL_LINEAR, GL_EXP, GL_EXP2. Dacă se defineşte densitatea, atunci param va avea o valoare pozitivă care este folosită în calculele exponenńiale. DistanŃa de început sau de sfârşit a ceńii, folosită în funcńia liniară de calcul, se transmite prin argumentul param corespunzător parametrului GL_FOG_START, respectiv GL_FOG_END. Pentru a defini culoarea ceńii se apelează una din funcńiile glfogiv() sau glfogfv() în care argumentul pname are valoarea GL_FOG_COLOR, iar argumentul params este un pointer la un vector de patru valori întregi sau numere în virgulă flotantă, care conńin componentele R, G, B, A de culoare a ceńii. În exemplul 9 se arată cum se poate realiza simularea ceńii. 5. AplicaŃii Exemplul 5 În acest exemplu, se evidenńiază necesitatea definirii normalelor pentru calculul iluminării. Se vizualizează o scenă în care sunt modelate trei cuburi (fig. 5). În program este validat sistemul de iluminare şi este definită o sursă de lumină direcńională şi materialul, cu componente de reflectanńă difuză şi ambientală. Cubul de deasupra din figura 5 a fost generat în absenńa normalelor în vârfuri şi se observă absenńa umbririi obiectului. Cubul din stânga-jos a fost generat cu definirea normalelor în fiecare vârf al fiecărei suprafeńe, iar cel din partea dreaptă a fost generat folosind funcńia glutsolidcube() şi se observă că fiecare fańă are aceeaşi culoare. Fig. 5 Necesitatea folosirii normalele în vârfuri pentru calculul iluminării 6

EGC -Lucrarea 9 Programul care realizează imaginea din figura 5 (si care trebuie completat) este : void init() GLfloat light_ambient[] = 1, 1, 1, 1; GLfloat light_diffuse[] = 1, 1, 1, 1; GLfloat light_specular[] = 1, 1, 1, 1; GLfloat mat_ambient[] = 0.2, 0.2, 0.2, 1; GLfloat mat_diffuse[] = 0.9, 0.9, 0.0, 1; GLfloat mat_specular[] = 1, 1, 1, 1; GLfloat mat_shininess = 50; gllightfv(gl_light0, GL_AMBIENT, light_ambient); gllightfv(gl_light0, GL_DIFFUSE, light_diffuse); gllightfv(gl_light0, GL_SPECULAR, light_specular); glmaterialfv(gl_front, GL_AMBIENT, mat_ambient); glmaterialfv(gl_front, GL_DIFFUSE, mat_diffuse); glmaterialfv(gl_front, GL_SPECULAR, mat_specular); glmaterialf(gl_front, GL_SHININESS, mat_shininess); glclearcolor(...); glshademodel(...); glenable(gl_lighting); glenable(gl_light0); glenable(gl_depth_test); void cub_cu_normale() glenable(gl_normalize); glbegin(gl_polygon); glnormal3d(-1, -1, 1); glvertex3d(-1, -1, 1); glnormal3d(-1, 1, 1); glvertex3d(-1, 1, 1); glnormal3d(1, 1, 1); glvertex3d(1, 1, 1); glnormal3d(1, -1, 1); glvertex3d(1, -1, 1); glend(); //fata //spate //dreapta //stanga //sus //jos... 7

SPG -Lucrarea 9 void cub() //spate //dreapta //stanga //sus //jos //cub fara normale... void display() GLfloat light_position[] = 1, 1, 1, 0; glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); gllightfv(gl_light0, GL_POSITION, light_position);... gltranslated(...); //transf. de modelare cub_cu_normale();... gltranslated(...); //transf. de modelare cub();... gltranslated(...); //transf. de modelare glutsolidcube(2);... void reshape (int w, int h) h=(h==0)? 1:h; glviewport(0, 0, (GLsizei)w, (GLsizei)h); glmatrixmode(gl_projection); glloadidentity(); gluperspective(60, (GLfloat)w/(GLfloat)h, 1, 40); glmatrixmode(gl_modelview); glloadidentity(); gltranslated(...); FuncŃia glenable(gl_normalize) are ca efect scalarea la valoarea unitate a vectorilor normalelor introduse prin funcńiile glnormal#(). Exemplul 6 Se realizează o scenă virtuală în care o sursă de lumină se deplasează împreună cu observatorul. Sursa iluminează un tor. La apăsarea butonului stâng al mouse-ului observatorul 8

EGC -Lucrarea 9 se deplasează pe un cerc în planul y = 0 cu un unghi specificat. În figura 6 sunt prezentate câteva imagini de iluminare a torului. PoziŃia observatorului este citită de la tastatură. Fig. 6 Imagini diferite pentru o sursă de lumină care se deplasează cu observatorul Programul respectiv, care trebuie completat, este următorul: #include <gl/glut.h> #include <math.h> GLfloat r=8;//raza cecului pe care se roteste observatorul in planul y=0 GLint spin=0; GLfloat light_position[]=0.0,0.0,0.0,1.0; //ex, ey, ez - pozitia observatorului GLfloat ex,ey=0,ez, upx=0,upy=1, upz=0; void init(void) glclearcolor (...); glshademodel (...); glenable(gl_lighting); glenable(gl_light0); glenable(gl_depth_test); void display(void) glclear (GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT); glpushmatrix (); ex=r*sin(spin); ez=r*cos(spin); glulookat(...); glutsolidtorus (0.275, 0.85, 8, 15); glpopmatrix (); glflush (); void reshape (int w, int h) glviewport (0, 0, (GLsizei) w, (GLsizei) h); glmatrixmode (GL_PROJECTION); glloadidentity(); 9

SPG -Lucrarea 9 gluperspective(40.0, (GLfloat) w/(glfloat) h, 1.0, 20.0); glmatrixmode(gl_modelview); glloadidentity(); gllightfv (GL_LIGHT0, GL_POSITION, light_position); void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) spin = (spin +15)%360; glutpostredisplay(); break; default: break; Exemplul 7 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ă îşi schimbă pozińia cu 30 grade. Sursa de lumină se va reprezenta printr-un mic cub wireframe (fig.7). SoluŃie. Programul care realizează cerinńele problemei, şi care trebuie completat, este prezentat mai jos. Fig. 7 Imagini diferite pentru o sursă de lumină care se deplasează în scenă #include <gl/glut.h> MISCARE_SURSA.CPP static int spin = 0; 10

EGC -Lucrarea 9 void init(void) glclearcolor (...); glshademodel (...); glenable(gl_lighting); glenable(gl_light0); glenable(gl_depth_test); /* - dupa efectuarea transformarii de modelare (glrotated) trebuie resetata pozitia sursei, deoarce este plasata într-o noua pozitie in sistemul universal. - cubul reprezinta pozitia sursei de lumina */ void display(void) GLfloat position[] = 0.0, 0.0, 1.5, 1.0 ; glclear (GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT); glpushmatrix (); gltranslatef (0.0, 0.0, -5.0); glpushmatrix (); glrotated (...); //transf. //transformare de observare //instantiere sursa gllightfv (GL_LIGHT0, GL_POSITION, position); gltranslated (0.0, 0.0, 1.5); gldisable (GL_LIGHTING); glcolor3f (0.0, 1.0, 1.0); glutwirecube (0.1); glenable (GL_LIGHTING); glpopmatrix (); glutsolidtorus (0.275, 0.85, 8, 15); glpopmatrix (); glutswapbuffers(); glflush (); void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) spin = (spin + 30) % 360; glutpostredisplay(); break; default: break; Exemplul 8 11

SPG -Lucrarea 9 Să se suprapună parńial patru suprafeńe triunghiulare de culoare gri deschis ( 0.8, 0.8, 0.8) peste un dreptunghi de culoare gri închis ( 0.2, 0.2, 0.8) (vezi fig. 8). Opacitatea celor patru suprafeńe are valorile: 0.25, 0.5, 0.75, 1.0. (primul obiect are coeficientul de transmisie 0.75, al doilea 0.5, al treilea 0.25 şi al patrulea 0.0). SoluŃie. Programul, care trebuie completat, realizează imaginea din figura 8 este următorul: Fig. 8 Combinarea culorilor în calculul transparenńei #include <gl/glut.h> TRANSPARENTA.CPP void init() glclearcolor(1.0, 1.0, 1.0, 1.0); //selecteaza culoarea de fond glblendfunc(...); void Triangle() glbegin(gl_polygon); glvertex3d(-2, -2, 0); glvertex3d(2, -2, 0); glvertex3d(0, 2, 0); glend(); void display() glclear(gl_color_buffer_bit); glpushmatrix(); gldisable(gl_blend); glcolor3d(0.2, 0.2, 0.2); glbegin(gl_polygon); glvertex3d(-8, 0, 0); //desenare dreptunghi 12

EGC -Lucrarea 9 glvertex3d(8, 0, 0); glvertex3d(8, 4, 0); glvertex3d(-8, 4, 0); glend(); glenable(gl_blend); glpushmatrix(); gltranslated(-6, 4, 0); glcolor4d(0.8, 0.8, 0.8, 0.25); Triangle(); glpopmatrix();... //primul triunghi glpopmatrix(); glutswapbuffers(); glflush(); void reshape (int w, int h) h=(h==0)? 1:h; glviewport(0, 0, (GLsizei)w, (GLsizei)h); glmatrixmode(gl_projection); glloadidentity(); gluperspective(60, (GLfloat)w/(GLfloat)h, 1, 40); glmatrixmode(gl_modelview); glloadidentity(); gltranslated(0, 0, -20); //transf. de obs ObservaŃii: În acest program nu este validat buffer-ul de adâncime. Când se lucrează cu obiecte tridimensionale trebuie validat acest buffer. În cazul obiectelor tridimensionale se desenează mai întâi obiectele opace şi se lucrează cu buffer-ul de adâncime în mod obişnuit. Pentru desenarea obiectelor transparente, se setează condińia de acces numai pentru citire a z- buffer-ului prin apelul funcńiei gldepthmask(gl_false). Când se desenează un obiect transparent, adâncimea lui se compară cu adâncimea din z-buffer, stabilită de obiectele opace din spatele lui, şi culoare pixelului se obńine prin combinarea culorilor fără a modifica valorea din buffer-ul de adâncime. Exemplul 9 Să se realizeze un program în care se foloseşte simularea ceńii. AplicaŃia va desena cinci ceşti roşii, fiecare aflându-se la o altă distanńă de punctul de vizualizare. Pentru desenarea unei ceşti se va folosi funcńia glutsolidteapot(size). În scopul evitării calculelor la desenare, se va utiliza o listă de display pentru crearea celor cinci ceşti. Apoi se va construi o funcńie care, la apăsarea tastei f sau F, să schimbe factorul de combinare f, factor care va fi afişat. Se va folosi proiecńia perspectivă. Scena va conńine o sursă de lumină plasată la infinit pe direcńia axei z (pozińia implicită a sursei GL_LIGHT0). SoluŃie. Programul următor realizează cerinńele problemei. În fig. 9 este dată imaginea obńinută în cazul unui factor de combinare exponenńial. 13

SPG -Lucrarea 9 Fig. 9 Simularea ceńii #include <GL/glut.h> #include <stdio.h> CEATA.CPP static GLuint listname; static GLint fogmode; void Teapot(GLfloat x, GLfloat y, GLfloat z) glpushmatrix(); gltranslatef(x,y,z); glutsolidteapot(1.5); glpopmatrix(); void init(void) float mat_ambient[] = 0.2, 0, 0, 1.0; float mat_diffuse[] = 0.6, 0, 0, 1.0; float mat_shininess[] = 90.0; float mat_specular[] = 1, 1, 1, 1; glmaterialfv (GL_FRONT, GL_SHININESS, mat_shininess); glmaterialfv (GL_FRONT, GL_SPECULAR, mat_specular); glmaterialfv (GL_FRONT, GL_DIFFUSE, mat_diffuse); glmaterialfv (GL_FRONT, GL_AMBIENT, mat_ambient); glenable(gl_fog); float fogdensity = 0.04; float fog_color[] = 0.5, 0.5, 0.5, 1.0; fogmode = GL_EXP; glfogi (GL_FOG_MODE, fogmode); glfogf (GL_FOG_DENSITY, fogdensity); glfogfv (GL_FOG_COLOR, fog_color); glhint (GL_FOG_HINT, GL_DONT_CARE); glfogf (GL_FOG_START, 1.0); glfogf (GL_FOG_END, 100.0); glclearcolor(0.5, 0.5, 0.5, 1.0); /* culoarea cetii */ 14

EGC -Lucrarea 9 glenable(gl_depth_test); glenable(gl_lighting); glenable(gl_light0); listname = glgenlists(1); glnewlist(listname, GL_COMPILE); Teapot(-3, -0.5, -10); Teapot(-2, -0.5, -20); Teapot(0, -0.5, -30); Teapot(2.5, -0.5, -40); Teapot(5, -0.5, -50); glendlist(); void display(void) glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glpushmatrix(); glcalllist(listname); glpopmatrix(); glutswapbuffers(); glflush(); void reshape(int w, int h) glviewport(0, 0, (GLsizei) w, (GLsizei) h); glmatrixmode(gl_projection); glloadidentity(); gluperspective(60, (GLfloat)w/(GLfloat)h, 0.1, 100); glmatrixmode(gl_modelview); glloadidentity (); void keyboard(unsigned char key, int x, int y) switch (key) case 'f': case 'F': if (fogmode == GL_EXP) fogmode = GL_EXP2; printf ("Fog mode is GL_EXP2\n"); else if... glutpostredisplay(); break; case 27: exit(0); break; default: break; 15

SPG -Lucrarea 9 16