Curs PG Mark.annotated.copy

download Curs PG Mark.annotated.copy

of 204

description

curs mp

Transcript of Curs PG Mark.annotated.copy

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Sistemul grafic OpenGL ELEMENTE INTRODUCTIVE

    Grafica cu calculatorul (n special grafica 3D i n particular grafica interactiv 3D) a cunoscut o dezvoltare continu, de la programe de grafic simple pentru calculatoare personale pn la software de modelare i vizualizare sofisticat pentru staii grafice i supercalculatoare.

    Deoarece a crescut interesul pentru grafica cu calculatorul, a crescut de asemenea i dorina de a realiza aplicaii care pot rula pe o varietate de platforme i capaciti grafice diferite.

    Un standard grafic uureaz aceast sarcin prin eliminarea nevoii de a scrie un driver grafic distinct pentru fiecare platform pe care ruleaz aplicaia.

    Pentru a fi viabil, un standard grafic propus pentru aplicaii interactive 3D trebuie s satisfac cteva criterii: trebuie s fie implementabil pe platforme cu capaciti grafice

    diferite fr compromiterea performanelor grafice; trebuie s asigure o interfa natural care permite unui

    programator s descrie operaiile de redare ntr-un mod concis.; interfaa trebuie s fie suficient de flexibil pentru a gzdui extensii

    astfel nct dac noi operaii grafice devin semnificative sau disponibile n noile subsisteme grafice, aceste operaii s poat fi asigurate fr fragmentarea interfeei.

    r3za23Highlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Sistemul grafic OpenGL ELEMENTE INTRODUCTIVE

    OpenGL (Open Graphics Library) ndeplinete aceste criterii prin asigurarea unei interfee simple, directe pentru operaiile fundamentale de redare grafic 3D.

    Acest sistem permit: primitive grafice de baz cum ar fi punctele, segmentele de dreapt,

    poligoanele i imaginile; operaii de redare de baz cum ar fi transformrile grafice i

    calculele de iluminare;

    operaii de redare avansat cum ar fi maparea texturilor i redarea cu antialiasing.

    OpenGL este o interfa software pentru plcile grafice. OpenGL se bazeaz pe IrisGL dezvoltat de Silicon Graphics (SGI).

    Scopul iniial al dezvoltrii IrisGL a fost de a dezvolta o interfa programabil pentru staiile grafice SGI.

    Aceast interfa programabil s-a intenionat iniial a fi independent de hardware i a ndeplini cerinele speciale ale programrii grafice 3D. Ulterior IrisGL a devenit interesant i pentru alte staii.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Sistemul grafic OpenGL ELEMENTE INTRODUCTIVE

    n 1992 a luat fiin OpenGL Architecture Review Board (ARB) printre ai crui membrii se afl principalii productori de staii grafice cum ar fi SGI, Sun, Hewlett-Packard, Microsoft, IBM, Intergraph.

    Site-ul ARB OpenGL poate fi gsit la www.opengl.org. OpenGL a devenit un standard industrial, disponibil din anul 1992, pe

    baza specificaiilor realizate de acest consoriu independent. Scopul ARB este de a controla dezvoltarea OpenGL, i de a introduce

    noi funcionaliti n versiunile urmtoare. OpenGL evolueaz n mod continuu permind ca inovaiile la nivelul

    hardware-ului s fie accesibile dezvoltatorilor de aplicaii prin mecanismul de extensii OpenGL.

    Adugrile la specificaii (prin extensii) sunt bine controlate de consoriul ARB i actualizrile propuse sunt anunate din timp pentru a permite dezvoltatorilor s adopte modificrile.

    Atunci cnd extensiile sunt larg acceptate, ele sunt luate n considerare pentru includerea n nucleul de baz OpenGL.

    Este asigurat compatibilitatea cu dezvoltrile anterioare ale bibliotecii astfel c aplicaiile mai vechi vor rula pe acceleratoarele hardware cu drivere OpenGL mai noi.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Sistemul grafic OpenGL ELEMENTE INTRODUCTIVE

    Utilizatorii finali ai OpenGL, furnizorii independeni de software i ali realizatori de aplicaii bazate pe OpenGL pot utiliza biblioteca fr cerine de licen.

    OpenGL este portabil, fiind disponibil pe o varietate de sisteme cum ar fi PC, Macintosh, Silicon Graphics, UNIX, Linux, Irix, Solaris, HP-UX OpenGL ruleaz pe fiecare din principalele sisteme de operare incluznd MacOS, OS/2, UNIX, Windows95, Windows NT, Linux, OPENStep, Python i BeOS.

    Lucreaz de asemenea cu fiecare sistem de ferestre principal, incluznd Presentation Manager, Win32 i X/Window System.

    OpenGL este practic disponibil pe aproape orice calculator care suport un monitor grafic.

    O implementare OpenGL poate fi n mod eficient gzduit la aproape orice nivel al hardware-ului grafic, de la memoria video de baz la cele mai sofisticate subsisteme grafice.

    OpenGL poate fi apelat din limbajele de programare C, C++, Java, FORTRAN i Ada i ofer independen complet fa de topologiile i protocoalele de reea.

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Sistemul grafic OpenGL ELEMENTE INTRODUCTIVE

    OpenGL este de asemenea scalabil deoarece poate rula pe o varietate de calculatoare, de la cele personale pn la staii de lucru i supercalculatoare.

    Aceasta se realizeaz prin mecanismul OpenGL de cerere a capacitilor hardware.

    OpenGL este bine structurat avnd o arhitectur intuitiv i comenzi logice (n numr de cteva sute).

    Utiliznd comenzile OpenGL se pot scrie aplicaii avnd cteva linii de cod spre deosebire de programele realizate utiliznd alte biblioteci.

    Una din caracteristicile forte ale interfeei OpenGL este c interfaa sa este uor de utilizat de ctre nceptori fiind n acelai timp suficient de puternic pentru a satisface cerinele unor aplicaii profesioniste indiferent c acestea sunt simulatoare de zbor, animaii, aplicaii de proiectare asistat sau vizualizri tiinifice.

    Driverele OpenGL ncapsuleaz informaii despre substratul hardware, elibernd dezvoltatorul aplicaiei de necesitatea de a scrie aplicaiile pentru anumite caracteristici hardware.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Sistemul grafic OpenGL ELEMENTE INTRODUCTIVE

    Lista aplicaiilor realizate avnd la baz OpenGL este mare i ea cuprinde aplicaii de modelare i animaie 3D (Maya, truSpace, 3D Studio Max, etc.), aplicaii CAD/CAM (CATIA, 3D Studio Viz, Pro/ENGINEER, I-DEAS, etc), simulri vizuale i realitate virtual (Visualisation Data Explorer, WorldToolKit, Designer, Workbranch, etc.), playere VRML {Cosmo World, RenderSoft VRML Editor, etc.), jocuri (Quake2, X-Plane, Unreal, etc.).

    Pentru a ine pasul cu inovrile la nivelul hardware-ului, fr ns a fora programatorii s lucreze n limbaj de asamblare, soluia oferit de firmele din domeniul grafic este un limbaj de nivel nalt pentru OpenGL - OpenGL Shading Language (sau GLslang), independent de hardware, uor de utilizat, suficient de puternic pentru a trece testul timpului i care va reduce drastic nevoia de extensii.

    Continund tradiia de compatibilitate "backwards", pe care au avut-o toate cele patru versiuni OpenGL, OpenGL 2.0 este un superset al lui OpenGL 1.4, astfel c aplicaiile mai vechi vor rula pe acceleratoarele hardware cu drivere OpenGL 2.0 fr modificri.

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Caracteristici OpenGL

    Dei specificaia OpenGL definete un anumit flux de procesare grafic, furnizorii de platforme au libertatea de a realiza o implementare OpenGL particular pentru a ndeplini obiective unice de performan i de cost al sistemului.

    Apelurile individuale OpenGL pot fie executate de hardware dedicat, pot rula ca rutine software pe sisteme standard CPU, sau pot fi imlementate ca o combinaie de rutine hardware i software.

    OpenGL permite dezvoltatorilor de software accesul la primitive geometrice i imagine, liste de display, transformri de modelare, iluminare i texturare, antialiasing, blending i multe alte faciliti.

    Din punctul de vedere al programatorului, OpenGL reprezint un set de comenzi care permit specificarea obiectelor geometrice n dou sau trei dimensiuni, mpreun cu comenzi care controleaz felul n care aceste obiecte sunt rasterizate n buffer-ul cadru (framebuffer).

    r3za23Highlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Caracteristici OpenGL

    Pentru cele mai multe din aceste comenzi, OpenGL asigur o interfa cu efect imediat, n sensul c specificarea unui obiect determin desenarea sa.

    OpenGL conine o mare cantitate de informaii de stare. Aceast stare controleaz modul n care sunt desenate obiectele n framebuffer.

    OpenGL se afl totdeauna ntr-o stare definit, setat prin variabile de condiie; aceasta nseamn c OpenGL este o maina de stare.

    Un exemplu de variabil de condiie este culoarea curent folosit pentru redarea primitivele individuale.

    Aceasta este setat utiliznd comanda glcolor() i apoi culoarea setat se aplic tuturor obiectelor care se deseneaz, pn cnd este lansat o nou comand de modificare a culorii.

    O parte a informaiilor de stare sunt vizibile, ns, doar prin efectul pe care l au asupra a ceea ce se deseneaz.

    OpenGL permite de asemenea aplicaii de vizualizare cu imagini 2D tratate ca tipuri de primitive care pot fi manipulate la fel ca i obiectele geometrice 3D.

    OpenGL dispune de numai 10 primitive geometrice, iar orice obiect care se deseneaz n OpenGL este compus din aceste primitive.

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Caracteristici OpenGL

    Setul de instruciuni din bibliotec conine cteva sute de comenzi, toate fiind prefixate de gl. OpenGL asigur controlul direct asupra operaiilor fundamentale de grafic 3D i 2D.

    Aceste operaii includ specificarea unor parametrii cum ar fi: matricele transformrilor; coeficienii ecuaiilor de iluminare; operatorii pentru actualizarea pixelilor.

    OpenGL nu asigur o modalitate pentru descrierea sau modelarea obiectelor geometrice complexe (cum ar fi cilindrul, cubul, sfera, etc.) dar asigur mecanismele pentru a descrie cum sunt redate obiectele geometrice complexe.

    Toate corpurile complexe trebuie s fie construite de dezvoltatorul aplicaiei 3D pe baza primitivelor simple - puncte, linii, poligoane. Pentru a simplifica puin lucrurile pentru dezvoltatorii de aplicaii, experii n grafica 3D au dezvoltat cteva biblioteci dintre care cele mai importante sunt:

    GLU (OpenGL Utility Library);

    GLUT (OpenGL Utility Toolkit);

    GLAUX - echivalentul Microsoft a lui GLUT.

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Caracteristici OpenGL

    GLU simplific lucrurile pentru crearea calculelor de proiecie i pentru construirea suprafeelor complexe, reprezentnd printre altele curbe i suprafee NURBS (Non-uniform-rational-B-splines).

    GLUT este un utilitar independent de sistem pentru manevrarea n mod simplu a ferestrelor OpenGL i pentru furnizarea dezvoltatorului de aplicaii de rutine pentru controlarea evenimentelor externe provenite de la utilizator prin mouse sau tastatur.

    Oricine dorete s devin expert n grafica 3D trebuie s cunoasc cteva noiuni fundamentale de algebr i geometrie analitic.

    Altfel utilizarea comenzilor OpenGL se face mecanic fr o profund nelegere a mecanismelor interne.

    Aceste noiuni sunt calculul vectorial (produs scalar, produs vectorial), calcul matricial (nmulirea matricelor, matrice identitate), transformri geometrice.

    Sunt de asemenea necesare cteva cunotine din domeniul opticii. Un program tipic care utilizeaz OpenGL ncepe cu deschiderea unei

    ferestre n frame buffer-ul n care programul va desena. Apoi, se apeleaz funcii pentru alocarea unui context GL i asocierea

    sa cu fereastra. Odat ce contextul OpenGL este alocat, programatorul este liber s dea comenzi OpenGL.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Caracteristici OpenGL Unele comenzi sunt utilizate pentru desenarea obiectelor geometrice

    simple (cum ar fi puncte, segmente de dreapt i poligoane), n timp ce altele au efect asupra redrii acestor primitive inclusiv a felului cum sunt iluminate, colorate i a modului n care spaiul modelului utilizatorului este mapat la ecranul bidimensional.

    Sunt i comenzi care controleaz efectiv framebuffer-ul, cum ar fi citirea i scrierea pixelilor.

    Din punctul de vedere al implementatorului, OpenGL este un set de comenzi care au efect asupra felului n care opereaz hardware-ul grafic.

    Dac hardware-ul const doar dintr-un framebuffer adresabil, atunci comenzile OpenGL trebuie s fie implementate n ntregime software, de CPU-ul calculatorului gazd.

    Tipice pentru acest moment sunt ns plcile grafice care conin acceleratoare grafice variind de la cele cu un subsistem de redare capabil s redea linii i poligoane 2D pn la procesoare n virgul mobil sofisticate capabile de transformri i calcule asupra datelor geometrice.

    Sarcina implementatorului este de a asigura interfaa software CPU astfel nct pentru fiecare comand OpenGL s se divid sarcinile ntre CPU i placa grafic. Pentru a se obine un optim al performanei n executarea comenzilor OpenGL, aceast diviziune trebuie s fie n concordan cu placa grafic disponibil.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Arhitectura OpenGL

    OpenGL deseneaz primitive ntr-o memorie video, n anumite moduri selectate.

    O primitiv poate fi un punct, segment de dreapt, poligon sau bitmap.

    Fiecare mod poate fi modificat independent; setarea unuia nu afecteaz setarea altora (dei pot interaciona n mai multe moduri pentru a determina ceea ce se produce n final n memoria video).

    Prin intermediul comenzilor (apeluri de funcii sau proceduri) se pot realiza:

    setarea modurilor

    specificarea primitivelor

    alte operaii OpenGl.

    r3za23Highlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Arhitectura OpenGL

    Figura 1 Schema fluxului de procesare OpenGL

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Arhitectura OpenGL

    Figura 1 arat schema fluxului de procesare OpenGL. Modelul de interpretare a comenzilor de ctre OpenGL este client-server. Aceasta nseamn c programul (client) d comenzile i aceste comenzi sunt procesate i interpretate de OpenGL (server). Server-ul poate sau nu s opereze pe acelai calculator cu client-ul.

    Multe dintre comenzi pot fi acumulate n liste de display pentru o procesare ulterioar. n cazul n care se lucreaz cu procesare imediat (deci fr liste de display) comenzile sunt transmise prin fluxul de procesare OpenGL. Comenzile nu sunt altceva dect apeluri de funcii i proceduri OpenGL.

    Primul stadiu de procesare asigur o modalitate eficient pentru aproximarea curbelor i a suprafeelor curbe prin evaluarea funciilor polinomiale ale valorilor de la intrare. Acest stadiu este parcurs doar de acele comenzi utilizate pentru reprezentarea curbelor i a suprafeelor Bezier i spline.

    Urmtorul nivel opereaz asupra primitivelor geometrice descrise prin coordonatele vrfurilor: puncte, segmente de dreapt i poligoane. n acest stadiu vrfurile sunt transformate i iluminate, i primitivele sunt decupate fa de volumul de vizualizare pentru a fi pregtite pentru nivelul urmtor -rasterizarea.

    maguroHighlight

    maguroHighlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Arhitectura OpenGL

    Rasterizarea convertete o primitiv proiectat, scalat la viewport ntr-o serie de fragmente. Fiecare fragment comprim pentru o locaie a unui pixel din memoria video urmtoarele caracteristici: culoarea;

    coordonatele de textur; adncimea (z).

    Rasterizarea produce o serie de adrese i de valori pentru memoria video utiliznd descrierea 2D a unui punct, segment de dreapt, sau poligon.

    Cnd este rasterizat un segment de dreapt sau un poligon, aceste date asociate sunt interpolate de-a lungul primitivei pentru a obine o valoare pentru fiecare fragment.

    Rasterizarea fiecrui tip de primitiv este controlat de un grup corespunztor de parametrii (atribute de redare a primitivelor). Un atribut de lime afecteaz rasterizarea punctului i un altul afecteaz rasterizarea segmentelor de dreapt.

    Suplimentar, se poate specifica o secven stipple (stilul liniei -linie punctata, ntrerupt, etc.) pentru segmentele de dreapt, i un model de haur pentru poligoane.

    maguroHighlight

    maguroHighlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Arhitectura OpenGL

    Procesarea pixelilor i a imaginilor trece peste seciunea de procesare a vrfurilor din flux pentru a transmite un bloc de fragmente n mod direct prin blocul de rasterizare spre blocul operaiilor pe fragmente individuale, determinnd eventual ca un bloc de pixeli s fie scris direct n memoria video.

    Valorile pot fi de asemenea citite din memoria video sau copiate dintr-o poriune a memoriei video n alta. Aceste transferuri pot include unele tipuri de decodificri i codificri.

    Se poate constata c exist dou fluxuri de date. Fluxul din partea dreapt a schemei este pentru primitivele bazate

    pe vrfuri. Fluxul din partea stng este pentru primitive bazate pe pixeli -

    primitive imagine. Se poate spune c texturarea combin cele dou tipuri de primitive.

    Aa cum s-a mai artat, la modul general, sunt dou operaii principale care se pot face utiliznd OpenGL: Se deseneaz ceva; Se modific starea (aspectul) a ceea ce se deseneaz.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Arhitectura OpenGL

    n ceea ce privete obiectele pe care le putem desena cu OpenGL, i acestea sunt de dou tipuri: Primitive geometrice;

    Primitive imagine.

    Altfel spus, grafica pe care o putem realiza utiliznd OpenGL este att grafic vectorial ct i grafic punctual.

    Primitivele geometrice pe care le poate reda OpenGL sunt puncte, linii i poligoane.

    Primitivele imagine sunt bitmap-uri i imagini grafice (adic pixeli care se pot extrage dintr-o imagine JPEG dup ce s-a citit aceast imagine n program). Suplimentar, OpenGL prin maparea texturilor unete primitivele geometrice cu cele imagine.

    O alt operaie comun care se face asupra ambelor tipuri de primitive este setarea strii. Setarea strii este procesul de iniializare al datelor interne, utilizate de OpenGL pentru redarea primitivelor.

    Setarea poate fi o operaie simpl cum ar fi stabilirea dimensiunii i culorii unui punct desenat dar i o operaie mai complicat cum ar fi iniializarea nivelelor multiple pentru maparea texturilor.

    maguroHighlight

    maguroHighlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Arhitectura OpenGL

    Trebuie subliniat c dei primitivele geometrice pe care le poate reda OpenGL nu sunt spaiale, n sensul c ele pot fi redate i n plan, totui OpenGL este o bibliotec de grafic 3D.

    Ceea ce este deosebit n felul n care se deseneaz un punct ntr-o bibliotec 2D, i felul n care se deseneaz un punct ntr-o bibliotec 3D sunt coordonatele acestui punct.

    Bibliotecii 2D i se furnizeaz coordonate 2D, pe cnd bibliotecii 3D i se furnizeaz coordonate 3D i prin mecanismele proieciei se face transformarea din sistemul de coordonate 3D n 2D urmnd ca apoi primitivele s fie redate pe dispozitivul de afiare.

    Efectul comenzilor OpenGL asupra memoriei video este controlat de sistemul de ferestre care aloc resurse de memorie video.

    Sistemul de ferestre este cel care determin care poriuni ale memoriei video pot fi accesate de OpenGL la un anumit moment de timp i tot el este cel care i comunic lui OpenGL cum sunt structurate acele poriuni.

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Descriere general OpenGL Utility Library - GLU

    Un principiu de baz n proiectarea interfeei OpenGL a fost de a se asigura portabilitatea unui program fr a se specifica ct de nalt s fie nivelul la care pot fi descrise obiectele grafice.

    Ca rezultat, interfaa de baz OpenGL nu permite redarea unor obiecte geometrice, care sunt asociate n mod tradiional cu standardele grafice.

    Spre exemplu, implementarea OpenGL nu red poligoane concave. Un motiv ar fi c algoritmii pentru redarea (umplerea) poligoanelor concave sunt mai compleci dect cei pentru redarea poligoanelor convexe n particular, dac se red un poligon concav mai mult de o dat este mai eficient s fie mai nti descompus n poligoane convexe (sau triunghiuri) i apoi s se deseneze poligoanele convexe.

    Un algoritm de descompunere a poligoanelor concave este asigurat ca parte a bibliotecii GLU, care este asigurat pentru fiecare implementare OpenGL.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Descriere general OpenGL Utility Library - GLU

    GLU asigur de asemenea o interfa, care se bazeaz pe evaluatorii polinomiali OpenGL, pentru descrierea i afiarea curbelor i a suprafeelor NURBS (cu posibilitatea de segmentare spaial), precum i o modalitate de reprezentare a cvadricelor (sferelor, conurilor, i a cilindrilor).

    GLU este util att pentru redarea unor obiecte geometrice utile ct i pentru exemplificarea modelului de construire a unei biblioteci care se bazeaz pe OpenGL pentru redarea n memoria video.

    Pentru a nu exista o imagine confuz asupra a ceea ce reprezint OpenGL trebuie subliniat c OpenGL nu este un limbaj de programare ci o API (interfa pentru programarea aplicaiilor).

    Atunci cnd ne referim la o aplicaie OpenGL, nelegem c aplicaia respectiv a fost scris ntr-un limbaj de programare (cum ar fi C) i c apeleaz funcii OpenGL.

    Nu este obligatoriu ca o aplicaie s utilizeze doar pachetul de funcii OpenGL pentru desenare. Simultan pot fi utilizate mai multe biblioteci grafice.

    Spre exemplu se pot utiliza funciile OpenGL pentru partea de reprezentare 3D iar pentru partea de grafic ce ine de interfaa aplicaiei s se utilizeze funciile grafice specifice mediului cu care se lucreaz (spre exemplu interfaa GDI a Windows-ului).

    maguroHighlight

    maguroHighlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Descriere general OpenGL Utility Library - GLU Ca orice API, funciile OpenGL pot fi apelate dup conveniile de apel

    din C. Deci apelarea bibliotecii din limbajul C nu constituie o problem.

    Apelarea din C++ a funciilor API, se face n acelai mod ca din limbajul C, cu consideraii minore.

    Funciile OpenGL pot fi de asemenea apelate din limbaje de tipul Visual Basic - care pot apela funcii C.

    Dei OpenGL este o interfa API puternic ce conine peste 300 funcii ea nu are nici mcar o singur funcie pentru managementul ferestrelor i a ecranului.

    De asemenea nu are funcii pentru manevrarea evenimentelor de la mouse i tastatur. Motivul este clar - independena de platform. Crearea i deschiderea unei ferestre se realizeaz n mod diferit n diferitele sisteme de operare.

    Pentru a putea lucra, programele OpenGL necesit ns o interfa grafic bazat pe ferestre.

    Deoarece OpenGL este independent de platform, este nevoie de o modalitate de a integra OpenGL n fiecare sistem grafic bazat pe ferestre.

    Fiecare sistem grafic bazat pe ferestre care suport OpenGL are funcii suplimentare API pentru controlarea ferestrelor OpenGL, manevrarea culorilor i a altor caracteristici. Aceste API-uri suplimentare sunt dependente de platform.

    maguroHighlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Biblioteci disponibile

    Pentru crearea ferestrelor dar i pentru alte operaii necesare n realizarea aplicaiilor grafice OpenGL, s-au creat biblioteci suplimentare cum ar fi GLAUX sau GLUT (OpenGL Utility Toolkit).

    Trebuie spus c funciile puse la dispoziie de aceste dou biblioteci sunt similare i c un utilizator care a nvat utilizarea uneia dintre aceste biblioteci va utiliza cu uurin i cealalt bibliotec.

    Pentru simplitatea programelor care exemplific OpenGL, noi vom utiliza biblioteca GLAUX, care simplific interaciunea cu sistemul de ferestre i cu mouse-ul sau tastatura.

    Unul dintre motivele pentru care am ales aceast bibliotec este faptul c programele sunt implementate n Visual C (versiunea 6.0) i c acest mediu conine biblioteca GLAUX precum i o serie de aplicaii pentru exemplificarea funciilor OpenGL care se bazeaz pe biblioteca GLAUX.

    GLAUX este o bibliotec care face scrierea programelor OpenGL, n partea legat de sistemul de ferestre mult mai uoar.

    OpenGL este independent de sistemul de ferestre i de sistemul de operare. n felul acesta, partea din aplicaia realizat cu OpenGL, care face redarea este de asemenea independent de platform. Oricum pentru ca OpenGL s poat face redarea are nevoie de o fereastr n care s deseneze. n general aceste ferestre sunt controlate de sistemul de operare cu care se lucreaz.

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Biblioteci disponibile

    Pentru a putea integra OpenGL n diferitele sisteme grafice bazate pe ferestre sunt utilizate biblioteci suplimentare pentru modificarea unei ferestre native ntr-una capabil OpenGL.

    Fiecare sistem de gestionare a ferestrelor are propria sa bibliotec, unic i funciile care fac acest lucru. Iat cteva astfel de biblioteci: GLX pentru sistemul X Windows, obinuit pe platformele Unix; AGL pentru Apple Macintosh;

    WGL pentru Miocrosoft Windows.

    Pentru a simplifica programarea i dependena de sistemul de ferestre noi vom utiliza biblioteca GLAUX.

    GLAUX este un toolkit pentru realizarea simpl a aplicaiilor OpenGL. Biblioteca GLAUX simplific procesul crerii ferestrelor, al lucrului cu evenimente n sistemul de ferestre i manevrarea animailor.

    Aplicaiile prototip sau cele care nu necesit toate caracteristicile unei interfee grafice cu utilizatorul complete, pot ns lucra cu GLAUX datorit modelului su de programare simplificat i datorit independenei de sistemul de ferestre.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Descriere GLAUX

    Iniial biblioteca GLAUX a fost creat ca un toolkit pentru a permite nvarea OpenGL fr a intra n detaliile unui anumit sistem de operare sau de interfa cu utilizatorul.

    Pentru aceasta GLAUX conine funcii pentru crearea ferestrelor i pentru citirea intrrilor de la mouse i de la tastatur.

    Intern aceste funcii utilizeaz funciile API ale mediului n care se lucreaz. Modul de apelare al funciilor GLAUX rmne ns acelai pentru toate platformele.

    Dei are doar cteva funcii pentru crearea ferestrelor, biblioteca GLAUX scutete utilizatorul de sarcina de a utiliza funciile Windows API care realizeaz acest lucru.

    Dei nu face parte din specificaia OpenGL, biblioteca GLAUX este implementat pentru fiecare platform pentru care se implementeaz OpenGL. Windows-ul nu face excepie de la acest lucru, i biblioteca GLAUX este inclus free n Win32 SDK de la Microsoft.

    Dac mediul de programare n care se lucreaz nu conine biblioteca GLAUX ea poate fi obinut free de la MicrosoftWin32 SDK.

    r3za23Highlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Descriere GLAUX n afara funciilor pentru ferestre i pentru manevrarea evenimentelor

    de la tastatur biblioteca GLAUX conine o serie de funcii pentru desenarea unor obiecte 3D: sfera, cubul, torul i chiar un ceainic, etc.

    Programele scrise cu GLAUX-ul pot fi mutate, prin recompilare pe diverse medii. Suplimentar acestor funcii principale biblioteca GLAUX implementeaz cteva funcii pentru a permite operaii specifice sistemului cum ar fi inversarea buffer-elor i ncrcarea imaginilor. Utilizarea lor poate face ns programele neportabile.

    Toate exemplele i aplicaiile din aceast carte sunt scrise n C. Pentru C, exist cteva elemente necesare pe care trebuie s le fac o aplicaie: Fiierele header aa cum se tie, conin prototipurile tuturor

    funciilor apelate, parametrii acestora, definirea valorilor constante. Aplicaiile OpenGL trebuie s includ fiierele header OpenGL, GLU i GLAUX (gl.h, glu.h, glaux.h).

    Proiectele aplicaiei trebuie s includ cele trei biblioteci care vor fi legate (la linkeditare) de aplicaie (opengl32.1ib, glu32.1ib i glaux.lib).

    Bibliotecile sunt dependente de implementarea OpenGL pentru sistemul de operare pe care se lucreaz. Fiecare sistem de operare are propriile sale biblioteci. Pentru sistemul Unix, biblioteca OpenGL este de obicei denumit libGL.so i pentru Microsoft Windows este denumit opengl32. lib.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Descriere GLAUX

    Funciile celor trei biblioteci pot fi recunoscute dup prefixele lor: gl pentru OpenGL, glu pentru GLU i aux pentru GLAUX. Tipurile enumerare (enumerated types) sunt definiii OpenGL pentru tipurile de baz (adic float, double, int, etc.) utilizate de program pentru definirea variabilelor. Pentru a se simplifica independena de platform a programelor OpenGL, se definete un set complet de tipuri enumerated types. Este indicat s se utilizeze aceste tipuri pentru a se simplifica transferarea programelor pe alte sisteme de operare.

    n continuare se d structura de baz care va fi utilizat ntr-o aplicaie. Se configureaz i se deschide fereastra Se iniializeaz starea OpenGL Se nregistreaz funciile callback

    Redare

    Redimensionare

    Intrri: tastatur, mouse, etc. Bucla de procesare a evenimentelor de intrare.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Descriere GLAUX

    n general, acetia sunt paii ntr-o aplicaie OpenGL, pai pe care i detaliem n continuare.

    Se alege tipul de fereastr necesar pentru aplicaie i se iniializeaz fereastra.

    Se iniializeaz starea OpenGL care nu este necesar a fi modificat n fiecare poriune din program.

    Asemenea operaii pot fi setarea culorii background-ului, poziia surselor de lumin, setri pentru texturare.

    Se nregistreaz funciile callback utilizate de aplicaii. Funciile callback sunt rutine scrise de programator pe care GLAUX-ul le apeleaz la apariia anumitor evenimente, cum ar fi remprosptarea ferestrei, micarea mouse-ului de ctre utilizator.

    Cea mai important funcie callback este cea de redare a scenei. Se introduce bucla principal de procesare a evenimentelor. Aici

    aplicaia recepioneaz evenimentele, i se programeaz cnd anume sunt apelate funciile callback.

    maguroHighlight

    maguroHighlight

    maguroHighlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Realizarea unei aplicaii n mod consol Modul cum afost realizat aplicaia. Funciile auxlnitDisplayMode(), auxinitPosition() j auxInitWindow() fac

    parte din pasul de configurare a ferestrei.

    Folosind funcia auxinitDisplayMode() se specific diverse informaii privitoare la buffer-ele utilizate de fereastra aplicaiei - dac se folosete modelul de culoare RGBA sau index, dac se folosesc unul sau dou buffer-e de culoare, dac fereastra are sau nu asociate buffer-e de adncime, buffer ablon sau/i buffer de acumulare.

    void auxInitDisplayMode(GLbitfield mask);

    Argumentul mask este un SAU la nivel de bit ntre: AUX_RGBA (modelul de culoare RGBA);

    AUX_INDEX (modelul de culoare index);

    AUX_SINGLE (un buffer de culoare);

    AUX_DOUBLE (dou buffer-e de culoare); AUX_DEPTH (buffer de adncime); AUX_STENCIL (buffer ablon); AUX_ACCUM (buffer de acumulare).

    Valorile implicite sunt pentru modelul de culoare index, cu un singur buffer de culoare.

    r3za23Highlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Realizarea unei aplicaii n mod consol

    n exemplul de mai sus, ferestrei i se va asocia un singur buffer de culoare i modelul de culoare va fi RGB.

    Poziia ferestrei pe ecran: colul stnga-sus al ferestrei va fi poziionat la pixelul (200,200) al ecranului. Dimensiunea ferestrei este de 500 pixeli pe lime i de 500 pixeli pe nlime.

    Prototipul funciei care specific aceti parametrii este; auxInitPosition (GLint x, Glint y, Glsizei width, Glsizei heigth);

    Se remarc faptul c poziia colului stnga-sus este specificat n coordonatele ecranului.

    Sistemul de coordonate al ecranului este figurat de cele dou axe de coordonate.

    Funcia auxInitWindows() creeaz fereastra i specific titlul afiat pe bara de titlu.

    Dac aplicaia s-ar rezuma doar la funcia main() care ar include doar funciile comentate pn n acest moment rezultatul ar fi afiarea pe ecran a unei ferestre de culoare neagr care ar i disprea imediat fr a se mai ntmpla nimic altceva.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    GLAUX-ul utilizeaz mecanismul callback pentru a realiza procesarea evenimentelor.

    Utiliznd acest mecanism se simplific procesarea evenimentelor pentru dezvoltatorul aplicaiei.

    Comparnd cu programarea tradiional de manevrare a evenimentelor, n care autorul trebuia s recepioneze i s proceseze fiecare eveniment, i s apeleze aciunile necesare, mecanismul callback simplific procesul prin definirea aciunilor care sunt suportate, i manevrarea automat a intrrilor dinspre utilizator.

    Tot ce trebuie s fac programatorul este s scrie codul pentru ceea ce se ntmpl cnd are loc evenimentul.

    GLAUX permite mai multe tipuri de funcii callback, incluznd: auxMainLoop() - apelat cnd trebuie s fie remprosptai pixelii din

    fereastr. auxReshapeFunc () - apelat cnd fereastra i modific

    dimensiunea.

    auxKeyFunc () - apelat cnd se apas o tast la tastatur. auxMouseFunc () - apelat cnd utilizatorul apas sau relaxeaz

    butonul mouse-ului

    auxidleFunc() - apelat cnd nu se ntmpl nimic altceva. Funcia este foarte util n animaii.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    Exemplu Program Patrat

    Funcia callback pentru redare n rutina principal a exemplului anterior apare urmtorul apel: auxMainLoop(display);

    Tot ceea ce se deseneaz se scrie n funcia display () (n cazul nostru) se nregistreaz de funcia auxMainLoop().

    Funcia callback display() este una dintre cele mai importante funcii callback.

    Funcia display() este apelat atunci cnd este necesar a se remprospta coninutul ferestrei.

    Acesta este motivul pentru care tot ceea ce se deseneaz trebuie programat aici.

    Pe scurt, funcia display(), din aplicaia noastr, red un ptrat. Deoarece pentru fiecare vrf al ptratului s-a specificat alt culoare i deoarece n mod implicit n OpenGL este setat modelul de umbrire Gouraud, care interpoleaz intensitile vrfurilor, ptratul va fi desenat cu o combinaie a culorilor specificate pentru fiecare vrf Se va studia fiecare funcie OpenGL detaliat, n capitolele urmtoare.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    Funcia glFlush() determin ca orice funcie OpenGL neexecutat pn n acest moment s fie executat n momentul apelului glFlush.

    n aceast situaie se afl, n cazul nostru, toate apelurile din display(). Intern OpenGL utilizeaz un flux de redare care proceseaz comenzile

    n mod secvenial. Deseori comenzile OpenGL sunt reinute pn cnd server-ul OpenGL

    proceseaz mai multe comenzi deodat. Desenarea este accelerat deoarece hardware-ul grafic lent este deseori accesat mai puin pentru un set dat de instruciuni de desenare.

    Se va exemplifica funcia auxKeyFunc() care n funcia principal a programului a fost apelat sub forma:

    auxKeyFunc (AUX_LEFT, MutaStanga);

    Funcia auxKeyFunc() asociaz apsarea tastei - sgeat stnga - cu funcia MutaStanga(). Funcia MutaStanga() din aceast aplicaie este:

    void CALLBACK MutaStanga(void)

    { x=x-10;)

    Rezultatul este c la apsarea tastei

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    Exemplul de mai sus arat o modalitate de tratare a evenimentelor de la utilizator.

    Cele dou proceduri nregistrate n acest caz trateaz intrrile de la tastatur: sgeat stnga , sgeat dreapta . GLAUX permite intrri de la utilizator prin mai multe dispozitive de intrare cum ar fi tastatura, mouse-ul, etc.

    Funcia pentru redimensionarea ferestrei Funcia callback myReshape() este apelat atunci cnd se

    redimensioneaz fereastra. Funcia este nregistrat de funcia: auxReshapeFunc (myReshape);

    Se poate ns constata c poziiile n pixeli ale ptratului nu s-au modificat. Trebuie specificat c n fereastra OpenGL pixelul (0, 0) se afl n colul stnga jos al ferestrei i orientarea axelor este cea din figura urmtoare, n cazul n care nu se definete funcia MyReshape().

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    Rolul funciei myReshape este pentru redimensionarea ferestrei. La aplicarea funciei coninutul ferestrei este redesenat, lund n considerare noile dimensiuni.

    100

    100

    (150,150)

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    Sunt cazuri n care la redimensionarea ferestrei se dorete ca desenul s nu-i modifice dimensiunile ci s fie decupat n cazul micorrii ferestrei i afiat la dimensiunea real n cazul lrgirii acesteia. n alte cazuri, cum este de altfel i cazul aplicaiei noastre ne dorim ca la micorarea ferestrei s fie proporional modificate i dimensiunile desenului.

    Funcia auxIdIeFunc Biblioteca GLAUX asigur o funcie care permite realizarea animailor.

    Aceast funcie, auxidleFunc(ldleFunction) nregistreaz funcia idleFunction() care este apelat n mod continuu n timp ce programul este n ateptare, mai puin n situaiile n care fereastra este mutat sau redimensionat. Iat un exemplu de scriere a funciei idleFunction().

    void CALLBACK IdleFunction (void)

    { t+=dt;

    display(); }

    Funcia actualizeaz o variabil i apoi apeleaz funcia de desenare. Animaia necesit abilitatea de a desena o secven de imagini.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    Funcia auxidleFunc() este mecanismul pentru realizarea animailor.

    Programatorul nregistreaz prin aceast funcie o rutin care actualizeaz variabilele de micare (de obicei variabile globale care controleaz cum se mic obiectele) i apoi cere ca scena s fie actualizat.

    Funcia IdleFunction() cere ca funcia nregistrat prin auxMainLoop()-display(), s fie apelat ct de repede posibil.

    Aceasta este de preferat apelrii n mod direct a rutinei de redare, deoarece este posibil ca utilizatorul aplicaiei s fi interacionat cu aplicaia i s fie necesar ca s fie procesate evenimentele de intrare.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    Exemplul urmtor arat un exemplu de utilizare a funciei auxidleFunc().

    #include "glos.h"

    #include

    #include

    #include

    void myinit(void);

    void CALLBACK display(void);

    void CALLBACK myReshape(GLsizei w, GLsizei h);

    void CALLBACK IdleFunction(void);

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    void myinit (void) {

    glClearColor(1.0, 1.0,1.0, 1.0);

    glColor3f(0.0,0.0,0.0);

    }

    void CALLBACK display (void)

    {

    glClear(GL_COLOR_BUFFER_BIT);

    auxWireCube(100);

    glFlush();

    }

    void CALLBACK IdleFunction(void)

    {

    glRotatef(30,1,1,1);

    display();

    Sleep(300);

    }

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    void CALLBACK myReshape(GLsizei w, GLsizei h)

    {

    if (!h) return;

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    if (w

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funciile callback GLAUX

    int main(int argc, char** argv)

    {

    auxInitDisplayMode (AUX_SINGLE | AUX_RGB);

    auxInitPosition (0, 0, 300, 200);

    auxInitWindow ("Un cub care se roteste");

    myinit ();

    auxReshapeFunc (myReshape);

    auxIdleFunc(IdleFunction);

    auxMainLoop(display);

    return(0);

    }

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    n exemplul anterior s-a constatat c s-a utilizat o funcie GLAUX pentru desenarea unui cub wireframe avnd latura de 100 de uniti - auxWireCube(100). Dimensiunea unei uniti n pixeli fiind cea specificat n funcia myReshape(). Biblioteca GLAUX dispune de funcii pentru desenarea i a altor corpuri 3D. n continuare vom enumera aceste funcii.

    void auxSolidBox(Gldouble width, Gldouble height, Gldouble depth); permite desenarea unui paralelipiped, centrat n origine, pentru care se specific limea, nlimea i adncimea. Paralelipipedul are atribut de umplere.

    void auxWireBox(Gldouble width, Gldouble height, Gldouble depth); similar cu auxSolidBox() dar wireframe (doar cu atribut de contur).

    void auxSolidCube(Gldouble width); permite desenarea unui cub, centrat n origine, pentru care se specific latura. Cubul are atribut de umplere.

    void auxWireCube(Gldouble width); similar cu auxSolidCube() dar wireframe (doar cu atribut de contur).

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D void auxSolidTetrahedron(Gldouble radius); permite desenarea unui

    tetraedru (poliedru cu 4 fee, feele sunt triunghiulare), centrat n origine, pentru care se specific raza. Corpul are atribut de umplere.

    void auxWireTetrahedron(Gldouble radius); similar cu auxSolidTetrahedron() dar wireframe (doar cu atribut de contur).

    void auxSolidOctahedron(Gldouble radius); permite desenarea unui octaedru (poliedru cu 8 fee, feele sunt triunghiulare), centrat n origine, pentru care se specific raza. Corpul are atribut de umplere.

    void auxWireOctahedron (Gldouble radius); similar cu auxSolidOctahedron() dar wireframe (doar cu atribut de contur).

    void auxSolidDodecahedron(Gldouble radius); permite desenarea unui dodecaedru (poliedru cu 12 fee, feele sunt pentagonale), centrat n origine, pentru care se specific raza. Corpul are atribut de umplere.

    void auxWireDodecahedron(Gldouble radius); similar cu auxSolidDodecahedron() dar wireframe (doar cu atribut de contur).

    void auxSolidDodecahedron (Gldouble radius); permite desenarea unui icosaedru (poliedru cu 20 fee, feele sunt triunghiulare), centrat n origine, pentru care se specific raza. Corpul are atribut de umplere.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    void auxWireIcosahedron(Gldouble radius); similar cu auxSolidicosahedron() dar wireframe (doar cu atribut de contur).

    void auxSolidCylinder{Gldoubble radius, Gldouble height); permite desenarea unui cilindru, centrat n origine, pentru care se specific raza bazei i nlimea. Cilindrul are atribut de umplere.

    void auxWireCylinder(Gldouble radius, Gldouble height); similar cu auxSolidCylinder() dar wireframe (doar cu atribut de contur).

    void auxSolidCone(Gldouble radius, Gldouble height); permite desenarea unui con, centrat n origine, pentru care se specific raza bazei i nlimea. Conul are atribut de umplere.

    void auxWireCone(Gldouble radius, Gldouble height); similar cu auxSolidConeOdar wireframe (doar cu atribut de contur).

    void auxSolidSphere(Gldouble radius); permite desenarea unei sfere, centrat n origine, pentru care se specific raza. Corpul are atribut de umplere.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    void auxWireSphere(GldoublG radius); similar cu auxSoildSphere() dar wireframe (doar cu atribut de contur).

    void auxSolidTorus{Gldouble InnerRadius, Gldouble outerRadius); permite desenarea unui tor (forma colacului), centrat n origine. Parametrul innerRadius este raza seciunii prin tor, iar outerRadius este raza gurii din centrul torului. Corpul are atribut de umplere.

    void auxWireTorus(Gldouble innerRadius, Gldouble outerRadius); similar cu auxSolidTorus() dar wireframe (doar cu atribut de contur).

    void auxSolidTeapot(Gldouble size); permite desenarea unui ceainic, centrat n origine, pentru care se specific dimensiunea (aproximativ diametrul). Corpul are atribut de umplere.

    void auxWireTeapot (Gldouble size); similar cu auxSolidTorus() dar wireframe (doar cu atribut de contur).

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    Exemplu

    cub, paralelipiped, tetraedru, octaedru, dodecaedru, icosaedru, tor,

    con, sfer, cilindru, ceainic - reprezentate wireframe :

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    Programul urmtor reprezint wireframe toate primitivele enumerate mai sus. Pentru poziionarea corpurilor n cadrul ferestrei, naintea apelrii fiecrei funcii de desenare s-a apelat o funcie de translatare. Iniial s-a aplicat o rotaie care are efect asupra tuturor corpurilor.

    Codul programului este dat n continuare: /* Programul afieaz primitivele 3D GLAUX */ #include "glos.h"

    #include

    #include

    #include

    void myinit(void);

    void CALLBACK display(void);

    void CALLBACK myReshape(GLsizei w, GLsizei h);

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    void myinit (void) {

    glClearColor(1.0, 1.0,1.0, 1.0);

    glColor3f(0.0,0.0,0.0);

    }

    void CALLBACK display (void)

    {

    glClear(GL_COLOR_BUFFER_BIT);

    glLoadIdentity();

    glRotatef(30,1,1,1);

    glTranslatef(-250,300,0);

    auxWireCube(100);

    glTranslatef(200,-50,0);

    auxWireBox(200, 100, 50);

    glTranslatef(200,-100,0);

    auxWireTetrahedron(100);

    glTranslatef(200,-50,0);

    auxWireOctahedron(100);

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    glTranslatef(-700,0,0);

    auxWireDodecahedron(100);

    glTranslatef(220,-70,0); auxWireIcosahedron(100);

    glTranslatef(230,-80,0);

    auxWireTorus(30, 80);

    glTranslatef(220,-100,0);

    auxWireCone(75, 150);

    glTranslatef(-600,20,0);

    auxWireSphere(80);

    glTranslatef(250,-50,0);

    auxWireCylinder(75, 100);

    glTranslatef(230,-120,0);

    auxWireTeapot(80);

    glFlush();

    }

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    void CALLBACK myReshape(GLsizei w, GLsizei h)

    {

    if (!h) return;

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    if (w

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    int main(int argc, char** argv)

    {

    auxInitDisplayMode (AUX_SINGLE | AUX_RGB);

    auxInitPosition (0, 0, 900, 600);

    auxInitWindow ("Primitive GLAUX");

    myinit ();

    auxReshapeFunc (myReshape);

    auxMainLoop(display);

    return(0);

    }

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcia auxMouseFunc

    Funcia auxMouseFunc() asociaz o funcie callback cu o aciune asupra mouse-ului. Prototipul funciei este:

    void auxMouseFunc (int button, int mode, AUXMOUSEPROC func);

    Funcia func va fi apelat atunci cnd este apsat sau relaxat butonul button al mouse-ului.

    Parametrul button poate avea una din urmtoarele valori: AUX_LEFTBUTTON, AUX_MIDDLEBUTTON sau AUX_RIGHTBUTTON.

    Parametrul mode specific aciunea asociat cu butonul mouse- ului. Aceasta poate fi AUX_MOUSEDOWN sau AUX_MOUSEUP.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcia auxSwapBuffers

    Funcia auxSwapBuffers() comut ntre cele dou buffer-e color n timpul desenrii cu dublu buffer. Prototipul funciei este:

    void auxSwapBuffers(void) :

    Funcia este utilizat n special pentru animaie. Apelul ei va determina afiarea pe ecran a scenei ascunse. Funcia necesit ca la iniializarea ferestrei cu funcia auxInitDisplayMode() s fie utilizat flag-ul AUX_DOUBLE, pentru a specifica folosirea a dou buffere de culoare.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcia auxSetOneColor

    Funcia auxSetOneColor() seteaz o culoare n paleta de culori n cazul modelului index de culoare. Prototipul funciei este:

    void auxSetOneColor(int index, float red, float green, float blue);

    In cazul modelului de culoare index se creeaz o palet de culori.

    O culoare este selectat prin specificarea unui index n paleta de culori.

    Aceast funcie asociaz cu un anumit index o culoare specificat prin componentele RGB ale culorii.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    Exemplu

    cub, paralelipiped, tetraedru, octaedru, dodecaedru, icosaedru, tor,

    con, sfer, cilindru, ceainic - reprezentate wireframe :

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    Programul urmtor reprezint wireframe toate primitivele enumerate mai sus. Pentru poziionarea corpurilor n cadrul ferestrei, naintea apelrii fiecrei funcii de desenare s-a apelat o funcie de translatare. Iniial s-a aplicat o rotaie care are efect asupra tuturor corpurilor.

    Codul programului este dat n continuare: /* Programul afieaz primitivele 3D GLAUX */ #include "glos.h"

    #include

    #include

    #include

    void myinit(void);

    void CALLBACK display(void);

    void CALLBACK myReshape(GLsizei w, GLsizei h);

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    void myinit (void) {

    glClearColor(1.0, 1.0,1.0, 1.0);

    glColor3f(0.0,0.0,0.0);

    }

    void CALLBACK display (void)

    {

    glClear(GL_COLOR_BUFFER_BIT);

    glLoadIdentity();

    glRotatef(30,1,1,1);

    glTranslatef(-250,300,0);

    auxWireCube(100);

    glTranslatef(200,-50,0);

    auxWireBox(200, 100, 50);

    glTranslatef(200,-100,0);

    auxWireTetrahedron(100);

    glTranslatef(200,-50,0);

    auxWireOctahedron(100);

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    glTranslatef(-700,0,0);

    auxWireDodecahedron(100);

    glTranslatef(220,-70,0); auxWireIcosahedron(100);

    glTranslatef(230,-80,0);

    auxWireTorus(30, 80);

    glTranslatef(220,-100,0);

    auxWireCone(75, 150);

    glTranslatef(-600,20,0);

    auxWireSphere(80);

    glTranslatef(250,-50,0);

    auxWireCylinder(75, 100);

    glTranslatef(230,-120,0);

    auxWireTeapot(80);

    glFlush();

    }

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    void CALLBACK myReshape(GLsizei w, GLsizei h)

    {

    if (!h) return;

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);

    glLoadIdentity();

    if (w

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii GLAUX pentru desenarea primitivelor 3D

    int main(int argc, char** argv)

    {

    auxInitDisplayMode (AUX_SINGLE | AUX_RGB);

    auxInitPosition (0, 0, 900, 600);

    auxInitWindow ("Primitive GLAUX");

    myinit ();

    auxReshapeFunc (myReshape);

    auxMainLoop(display);

    return(0);

    }

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    PRIMITIVE GEOMETRICE

    Sistemul de coordonate utilizat de OpenGL este un sistem cartezian.

    Axele x i y formeaz un plan, ceva de genul suprafeei vizibile a monitorului.

    Axa z adaug cea de a treia dimensiune - adncimea spaial (figura urmatoare).

    Astfel pentru a avea o poziie spaial fix n acest sistem de coordonate, un punct este necesar s fie specificat prin trei coordonate (x, y, z).

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    PRIMITIVE GEOMETRICE

    Primitivele geometrice (puncte, segmente de dreapt, i poligoane) sunt definite de un grup de unu sau mai multe vrfuri (vertex-uri).

    Un vrf definete un punct, punctul terminal al unei muchii, sau colul n care se ntlnesc dou muchii ale unui poligon.

    Unui vrf i sunt asociate date (constnd din coordonatele de poziie, culori, normale, i coordonate de textur) i fiecare vrf este procesat n mod independent i n acelai fel.

    Singura excepie de la aceast regul, este n cazul n care un grup de vrfuri trebuie s fie decupate astfel ca primitiva respectiv s fie cuprins n regiunea specificat prin volumul de vizualizare definit de funcia myReshape().

    n acest caz datele despre un vrf pot fi modificate i sunt create noi vrfuri. Tipul decuprii depinde de primitiva care este reprezentat de grupul de vrfuri.

    Toate primitivele geometrice sunt specificate prin vrfuri (coordonatele vrfurilor). Intern OpenGL opereaz cu coordonate omogene. Coordonatele omogene sunt de forma (x, y, z, w).

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    PRIMITIVE GEOMETRICE

    Funciile OpenGL permit specificarea vrfurilor n coordonate 2D, 3D i n coordonate omogene.

    n funcie de parametrul funciei glBegin() (care poate fi unul din cele 10 nume enumerate n figura) i de felul cum sunt organizate vrfurile, OpenGL poate reda oricare din primitivele artate n figura urmatoare.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    PRIMITIVE GEOMETRICE

    Pentru ca cele spuse s fie mai clare se va exemplifica printr-o funcie de redare a unui patrulater.

    void patrulater( GLfloat color[] ) {

    glBegin( GL_QUADS ) ;

    glColor3fv( color );

    glVertex2f( 0.0, 0.0 );

    glVertex2f( 1.0, 0.0 ) ;

    glVertex2f( 1.5, 1.118 );

    glVertex2f( 0.5, 1.118 ) ;

    glEnd(); }

    Funcia patrulater() determin OpenGL s deseneze un patrulater ntr-o singur culoare. Patrulaterul este planar deoarece, coordonat z este setat automat la 0 de funcia glvertex2f().

    Dac s-ar fi dorit ca patrulaterul s nu se afle n planul x0y, ci ntr-un plan oarecare, atunci ar fi fost necesar s fie utilizat o funcie glvertex3#(). n felul acesta s-ar fi furnizat pentru fiecare vrf i cea de a treia coordonat.

    Trebuie remarcat de asemenea c numele primitivei geometrice se d ca parametru al funciei glBegin() i corpul n care sunt furnizate coordonatele primitivei este delimitat de funciile glBegin() i glEnd().

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Formatul comenzilor OpenGL

    Fiecare din comenzile care specific coordonatele vrfului, normalele, culorile sau coordonatele de textur sunt disponibile n cteva formate pentru a se potrivi diferitelor formate de date ale aplicaiilor i numrului de coordonate (figura urmatoare).

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Formatul comenzilor OpenGL Datele pot fi de asemenea transmise acestor comenzi fie ca o list de

    argumente sau ca un pointer la un tablou ce conine date. Variantele se disting prin sufixele mnemonicelor comenzilor.

    Interfaa de programare a aplicaiilor OpenGL (OpenGL API) are astfel proiectate apelurile nct s fie acceptate aproape orice tipuri de date de baz, al cror nume este reflectat n numele funciei.

    Cunoscnd felul n care sunt formate numele apelurilor este uor de determinat care apel va fi utilizat pentru un format particular de date i pentru o anume dimensiune. Spre exemplu, coordonatele vrfurilor pentru aproape toate modelele comerciale sunt reprezentate de un vector cu trei componente n virgul mobil. n felul acesta, cea mai potrivit comand este glvertex3fv(coord). n acest caz coord este un vector cu trei componente de tip float. Dac cele trei componente s-ar furniza ca parametri ai funciei glVertex# atunci forma apelului ar fi givertex3f (x, y, z); unde x, y, z sunt elemente de tip float.

    Fiecare vrf poate fi specificat cu dou, trei sau patru coordonate (patru coordonate indic coordonate omogene 3D). Dup cum s-a artat mai nainte, intern, OpenGL utilizeaz coordonate omogene 3D pentru specificarea vrfurilor. Pentru acele forme de apel glvertex#() care nu specific toate coordonatele (adic glvertex2f()), OpenGL va fixa implicit z=0.0 i w=1.0.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Specificarea primitivelor

    geometrice OpenGL n OpenGL cele mai multe obiecte geometrice sunt desenate prin includerea unei

    mulimi de coordonate care specific vrfurile i opional normalele, coordonatele de textur i culorile ntre perechea de comenzi glBegin()/glEnd():

    glBegin(tipul_primitivei) ;

    //se specific coordonatele vrfurilor, normalele, culorile, coordonatele de texturare

    glEnd();

    unde tipul_primitivei determin felul cum sunt combinate vrfurile din blocul respectiv.

    Spre exemplu, pentru specificarea unui patrulater cu vrfurile avnd coordonatele (0,1,0), (1,3,0), (3,4,0),(0,4,0) se poate scrie:

    glBegin(GL_QUADS)

    glVertex3i(0,1,0) ;

    glVertex3i(1,3,0) ;

    glVertex3i(3,4,0) ;

    glVertex3i(0,4, 0) ;

    glEnd();

    r3za23Highlight

    maguroHighlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Specificarea primitivelor

    geometrice OpenGL

    n acest fel pot fi desenate cele zece primitive prezentate. Acest grup particular de primitive permite ca fiecare obiect s poat fi descris printr-o list de vrfuri, i permite satisfacerea necesitilor fiecrei aplicaii grafice.

    Exemplu:

    Glfloat red, greed, blue;

    Glfloat coords[3];

    glBegin(tipul_primitivei);

    for (i=0; i< nvertex; ++i){

    glColor3f( red, green, blue );

    glVertex3fv( coords);

    }

    glEnd() ;

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Specificarea primitivelor

    geometrice OpenGL

    n acest exemplu, nvertex este numrul vrfurilor care se specific. Acestea sunt grupate dup tipul primitivei, specificat ca parametru al funciei glBegin(). Spre exemplu dac tipul primitivei este GL_QUADS i nvertex este 12 se vor desena 3 patrulatere. Tipurile posibile pentru tipul primitivei sunt:

    GL_POINTS

    GL_LINE_STRIP

    GL_LINES

    GL_LINE_LOOP

    GL_TRIANGLES

    GL_TRIANGLE_STRIP

    GL_TRIANGLE_FAN

    GL_QUADS

    GL_QUAD_STRIP

    GL_POLYGON

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Specificarea primitivelor

    geometrice OpenGL n esen sunt doar 5 tipuri de primitive (punct, linie, triunghi,

    patrulater i poligon) restul de 5 chiar dac nu introduc primitive suplimentare prezint avantajul ca n cazul n care dou vrfuri aparinnd la dou primitive distincte, se suprapun, s fie memorate o singur dat. n felul acesta se ctig att timp de procesare ct i spaiu de memorie.

    Asocierea valorilor

    curente cu vrfurile

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Specificarea primitivelor

    geometrice OpenGL

    Pentru procesarea unui vrf mai pot fi, suplimentar, utilizate normala curent, coordonatele texturii curente i culoarea curent.

    OpenGL utilizeaz normalele pentru calculele de iluminare.

    Normala curent este un vector 3D care se poate seta prin specificarea celor trei coordonate.

    Culoarea poate fi format din valorile pentru rou, verde, albastru i alfa (atunci cnd se utilizeaz modelul de culoare RGBA) sau o singur valoare index (atunci cnd la iniializare se specific modul index).

    Una dou trei sau patru coordonate de textur determin felul cum imaginea unei texturi se mapeaz pe o primitiv.

    Atunci cnd este specificat un vrf, culoarea curent, normala, coordonatele texturii sunt utilizate pentru a obine valori care sunt apoi asociate cu vrful.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Specificarea primitivelor

    geometrice OpenGL

    nsui vrful este transformat de matricea de modelare-vizualizare, care este o matrice de 4x4.

    Aceast transformare are loc intern prin nmulirea matricei de modelare vizualizare cu coordonatele vrfului obinndu-se coordonatele acestuia n sistemul de vizualizare.

    Culoarea asociat vrfului se obine fie pe baza calculelor de iluminare, fie dac iluminarea este dezactivat, pe baza culorii curente.

    Coordonatele de texturare sunt transmise n mod similar unei funcii de generare a coordonatele de texturare (care poate fi identitate).

    Coordonatele de texturare rezultate sunt transformate de matricea

    de texturare (aceast matrice poate fi utilizat pentru scalarea sau rotirea unei texturi ce se aplic unei primitive).

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Reguli pentru construirea

    poligoanelor

    Nu ne referim aici la triunghiuri dei fac i ele parte din categoria poligoanelor. Motivele sunt simple: triunghiurile aparin ntotdeauna unui singur plan, triunghiurile sunt ntotdeauna convexe.

    Regula 1

    Poligoanele trebuie s fie totdeauna planare. Aceasta nseamn c toate vrfurile unui poligon trebuie s aparin aceluiai plan. n figura urmtoare se poate vedea un poligon planar i altul neplanar (rsucit).

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Reguli pentru construirea

    poligoanelor

    Regula 2

    Poligoanele trebuie s fie convexe. Pentru a verifica dac un poligon este convex se face testul urmtor: dac oricare linie care traverseaz poligonul este intersectat n mai mult de dou puncte de laturile poligonului acesta nu este convex (figura urmtoare).

    Regula 3

    Muchiile poligoanelor nu se pot intersecta. Spre exemplu poligonul din

    figura urmtoare nu este un poligon corect n concepia OpenGL.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Orientarea poligoanelor

    n OpenGL ordinea specificrii vrfurilor este cea dat de ordinea apelurilor glvertex# () n blocul glBegin() /glEnd().

    Ordinea stabilit a vrfurilor este implicit n sens invers rotirii acelor de ceasornic. Ordinea vrfurilor se specific n OpenGL prin funcia glFrontFace() care are ca parametrii :

    GL_CCW pentru sensul trigonometric (invers acelor de ceasornic

    "counterclockwise") - care este valoarea implicit

    GL_CW pentru sensul rotirii acelor de ceasornic ("clockwise")

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Orientarea poligoanelor

    O primitiv geometric are orientare directa ("frontface") dac ordinea specificrii vrfurilor coincide cu ordinea stabilit a vrfurilor.

    Dac ordinea specificrii vrfurilor nu coincide cu ordinea stabilit a vrfurilor atunci primitiva are orientare inversa ("backface")

    Ordinea corect pentru specificarea vrfurilor primitivelor OpenGL

    In figura urmtoare este artat ordinea n care trebuie specificate vrfurile primitivelor OpenGL pentru ca orientarea acestora s fie n sens invers rotirii acelor de ceasornic - adic ordinea direct n OpenGL.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Orientarea poligoanelor

    Ordinea corect pentru specificarea vrfurilor primitivelor OpenGL

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Utilitatea orientrii poligoanelor

    La construirea unui corp solid toate poligoanele care-l mrginesc trebuie s aib aceeai orientare.

    Dac spre exemplu toate poligoanele au orientare trigonometric, toate poligoanele vor fi poligoane fa i vor fi vizibile. Se poate stabili ca feele spate s fie eliminate n situaia n care corpul este vizualizat din exterior.

    Dac ns corpul este vizualizat dinspre interior atunci se va stabili s fie vizibile doar feele spate i s fie eliminate feele fa.

    S presupunem acum c un anumit corp solid a fost consistent construit, deci cu toate poligoanele avnd aceeai orientare.

    Orientarea specificat ns nu este aceeai cu cea stabilit pentru feele fa.

    Atunci se poate interveni i se schimb orientarea stabilit pentru feele fa.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire

    Vom prezenta n continuare atributele primitivelor de ieire i anume: dimensiunea punctului, grosimea sau stilul liniei, modelul de

    umplere pentru primitivele cu atribut de umplere, etc.

    Atributul de culoare

    Modelele de culoare OpenGL sunt RGBA sau Color Index. Fiecare

    implementare OpenGL trebuie s permit redarea att n modelul de culoare RGBA (denumit uneori ca modelul TrueColor) ct i n modelul index (sau colormap).

    Pentru redarea cu modelul RGBA, culorile vrfurilor sunt specificate utiliznd apelul glColor#(). Pentru modelul index, indexul culorii fiecrui vrf este specificat cu apelul gllndex# ().

    Sistemul de ferestre cere specificarea modelului de culoare al

    ferestrei. Dac se utilizeaz biblioteca GLAUX, modelul de culoare se specific folosind funcia auxinitDisplayMode() cu flag-urile AUX_RGBA sau AUX_INDEX.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire Setrile de culoare pentru primitive pot fi specificate utiliznd fie

    modelul RGBA fie modelul index.

    Odat specificat o anumit culoare, va afecta toate primitivele care urmeaz pn la o modificare a culorii. Noua culoare va afecta apoi doar primitivele specificate dup modificarea culorii.

    n modelul RGB se vor specifica componentele rou, verde i albastru ale culorii.

    Se poate folosi i varianta RGBA n care se specific i o a patra component - valoarea alfa. Aceast a patra component este utilizat pentru amestecarea culorilor pentru obiectele care se suprapun.

    O aplicaie important a amestecrii culorilor este simularea efectului de transparen. Pentru aceste calcule valoarea alfa corespunde coeficientului de transparen.

    Pentru a folosi modelul RGB (sau RGBA), se seteaz simplu culoarea cu funcia glColor#() dnd celor patru parametrii ai culorii valori cuprinse ntre 0.0 i 1.0.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire Pentru specificarea componentelor culorii pot fi utilizate valori ntregi, n

    virgul mobil sau alte formate numerice. Ca i n cazul funciei giVertex se vor utiliza ca sufix coduri ca 3, 4, d, f i i pentru a indica numrul parametrilor i formatul acestora.

    De pild, funcia urmtoare specific componentele de culoare RGB n virgul mobil i seteaz culoarea curent ca albastru de intensitate maxim:

    glColor3f(0.0, 0.0, 1.0);

    Valoarea implicit a culorii este alb (1, 1, 1) i valoarea implicit pentru alfa este 1.

    n mod opional, se pot seta valorile de culoare utiliznd tablourile. n acest caz se va aduga funciei un al treilea sufix - v - i se va furniza un singur argument - pointer-ul la tabloul ce conine componentele culorii.

    Utiliznd un tablou colorArray care conine spre exemplu valorile anterioare, se va seta culoarea utiliznd apelul:

    glColor3fv(colorArray);

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire

    Cellalt model pentru setarea culorii, disponibil n OpenGL este modelul index care face referine la tabele de culoare.

    Acest model este utilizat n cazul n care spaiul de memorare este limitat. n acest model se seteaz ca i culoare curent o culoare din tabelul de culori utiliznd funcia:

    gllndex#(index);

    unde index specific o poziie n tabloul cu culori. Funcia necesit de asemenea un sufix (d, f, i) care specific tipul datelor. Un tablou de culori poate fi setat cu funcia:

    glIndexPointer(type, offset, ptr);

    unde parametrul type d tipul datei, parametrul offset, d spaierea ntre valori consecutive de culoare i parametrul ptr este un pointer spre primul element al tabloului de culori.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire

    A patra component de culoare

    Componenta alfa pentru o culoare este o msur a opacitii fragmentului.

    Ca i cu celelalte componente de culoare, domeniul valorilor sale este ntre 0.0 (care reprezint complet transparent) i 1.0 (complet opac). Valorile alfa sunt importante pentru realizarea efectelor vizuale cum ar fi ceaa sau transparena.

    Atributele punctului

    Pentru punct pot fi setate dou atribute: culoare i dimensiune. Culoarea este controlat de setarea curent a culorii, iar dimensiunea punctului se seteaz cu funcia:

    void glPointSize(Glfloat size);

    Parametrul size poate fi specificat ca orice valoare pozitiv n virgul mobil. Dac valoarea specificat nu este un ntreg, ea va fi rotunjit la cea mai apropiat valoare ntreag (presupunnd c antialiasing-ul este dezactivat). Valoarea implicit pentru size este 1.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire

    Atributele liniei

    Atributele de baz pentru segmentul de linie dreapt sunt:

    tipul liniei;

    grosimea liniei;

    culoarea liniei.

    Alte efecte posibile, cum ar fi tipul peni sau tipul pensul, pot fi implementate cu adaptri ale funciilor pentru tipul i grosimea liniei.

    Pentru afiarea unui segment de dreapt ntr-o singur culoare este folosit setarea curent a culorii.

    O alt posibilitate ar fi ca linia s fie afiat cu culoarea variind de-a lungul liniei.

    O modalitate de a face acest lucru este de a atribui culori diferite fiecrei extremiti a unei linii, n loc de a se seta o culoare curent pentru ntreaga linie.

    De pild, poriunea de cod urmtoare seteaz o extremitate a liniei verde iar cealalt galben.

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire

    Rezultatul va fi afiarea unei linii continue n culori care interpoleaz culorile extremitilor.

    glShadeModel(GL_SMOOTH);

    glBegin (GL_LINES);

    glColor3f (0.0, 1.0, 0.0);

    glVertex2i (-5,-5);

    glColor3f (1.0, 1.0, 0.0);

    glVertex2i (5,5);

    glEnd ();

    n ceea ce privete cellalt atribut al linie - tipul - n mod implicit acesta este tipul continuu.

    n afara liniilor continue se pot utiliza linii ntrerupte, punctate sau n diverse combinaii linie-punct. Spaiile dintre liniue sau puncte, dimensiunea liniuelor pot fi de asemenea modificate.

    Stilul liniei este definit de programator - nu exist un set de stiluri din care programatorul s-i aleag un anume stil.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire

    ablonul se stabilete ntr-un cuvnt de 16 bii n care fiecare bit are semnificaia de un pixel.

    Modelul astfel stabilit se repet de-a lungul liniei. Dac se dorete ca semnificaia fiecrui bit s fie de 2, 3, ... pixeli se poate realiza o multiplicare cu un factor.

    Pentru a se putea afia linii de diferite stiluri trebuie realizat activarea acestui atribut cu funcia glEnable():

    glEnable(GL_LINE_STIPPLE);

    Altfel toate liniile vor fi afiate ca linii continue. Revenirea la linie continu se face, evident, cu funcia glDisable().

    Un anumit tip de linie este specificat cu funcia:

    void glLineStipple(GLint repeatFactor, GLushort pattern);

    care specific ablonul dup care sunt distribuii pixelii la desenarea liniei.

    Parametrul pattern d un model, n binar, pe 16 bii (1=pixel on, 0=pixel off) i parametrul ntreg repeatFactor specific de cte ori se repet fiecare bit din model.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire Modelul este aplicat pixelilor de-a lungul liniei ncepnd cu biii mai puin

    semnificativi. Spre exemplu, apelul:

    glLineStipple(1, 0x00ff);

    specific o linie ntrerupt n care liniuele ocup 8 pixeli iar spaiul dintre liniue este tot de 8 pixeli.

    Deoarece biii mai puin semnificativi sunt pe on fiecare segment de dreapt care se deseneaz va ncepe cu liniu i modelul se va repeta pn se ajunge la cealalt extremitate a segmentului de dreapt.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atribute ale primitivelor de

    ieire n cazul n care se deseneaz o linie frnt modelul nu va fi restartat dup

    fiecare segment de dreapt, ci va fi aplicat continuu.

    Iat spre exemplu cum se poate specifica o linie ntrerupt cu intervale egale pentru ntrerupere i linie.

    Exemplu:

    GLint factor=l;

    GLushort pattern=0x00ff;

    glEnable(GL_LINE_STIPPLE);

    glLineStipple(factor, pattern);

    glBegin(GL_LINES);

    glVertex2f(20, 30);

    glVertex2f(100, 30);

    glEnd();

    Ultimul atribut al liniei - grosimea - se seteaz cu funcia:

    void glLineWidth(Glfloat width);

    Valoarea implicit a parametrului width este 1.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atributele poligoanelor

    Pentru poligoane, atributul de baz este stilul de umplere. Poligoanele pot fi umplute ntr-o singur culoare, cu un

    anumit model de umplere, sau fr atribut de umplere ("hollow") atunci cnd se reprezint doar conturul.

    Aa cum s-a artat un poligon are dou fee: fa i spate care pot fi diferit reprezentate.

    Aceasta permite reprezentarea seciunilor prin corpuri. Se pot selecta atribute diferite pentru poligoanele "fa" i pentru cele "spate", se poate inversa definirea poligoanelor "fa" sau "spate" i se poate elimina afiarea poligoanelor "fa" sau "spate".

    n mod implicit ambele fee sunt desenate la fel. Pentru a schimba acest lucru se utilizeaz funcia glPolygonMode(),

    r3za23Highlight

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Atributele poligoanelor

    glPolygonMode(GLenum face, GLenum mode)

    care stabilete modul de desenare al poligoanelor (mode: GL_POINT, GL_LINE, GL_FILL) i tipul feelor care sunt

    afectate (face: direct -GL_FRONT, invers - GL_BACK, ambele - GL_FRONT_AND_BACK).

    n mod implicit ambele fee sunt desenate cu atribut de umplere.

    Se poate spre exemplu, stabili ca partea fa s fie desenat plin iar cea spate s fie desenat cu wireframe (fr atribut de umplere).

    glPolygonMode(GL_FRONT, GL_FILL);

    glPolygonMode(GL_BACK, GL_LINE);

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Culoarea primitivelor cu atribut de umplere

    Triunghiurile, patrulaterele i poligoanele sunt primitivele care au atribut de umplere.

    Acestea pot fi colorate cu o anumit culoare sau pot fi umplute cu un anumit model de umplere.

    n ceea ce privete culoarea, aceasta se poate stabili pentru fiecare vrf n parte sau se utilizeaz culoarea curent de desenare. Funcia utilizat este glColor3f().

    n funcie de modelul de umbrire, poligoanele sunt umplute cu o culoare compact sau cu o interpolare a culorii vrfurilor. Modelul de umbrire se stabilete cu funcia glShadeModel().

    void glShadeModel (Glenum mode);

    Dac se stabilete o umbrire poligonal constant (parametrul GL_FLAT) atunci culoarea de umplere a poligoanelor va fi culoarea curent sau culoarea stabilit pentru ultimul vrf al poligonului.

    Dac se stabilete modelul de umbrire Gouroud (GL_SMOOTH) atunci se vor interpola culorile vrfurilor (ca la ptratul reprezentat pentru exemplificare funciilor glaux).

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Utilizarea abloanelor de umplere

    Aa cum liniile pot fi desenate avnd anumite stiluri i poligoanele pot fi umplute cu anumite modele de umplere.

    Pentru aceasta programatorul stabilete ablonul, care se va repeta apoi pe suprafaa ntregului poligon.

    Pentru activarea umplerii cu ablon se folosete funcia glEnable().

    glEnable(GL_POLYGON_STIPPLE);

    Modelul de umplere se specific folosind funcia glPolygonStipple avnd ca parametru un pointer spre un tablou care conine ablonul.

    glPolygonStipple(fillPattern);

    Parametrul fillPattern este un pointer la o masc de 32X32 bii. Tabloul fillPattern conine elemente de tip GLubyte.

    O valoare 1 n masc arat c pixelul corespunztor va fi pe on, i 0 indic un pixel pe of f. Intensitatea pixelilor este setat n funcie de setarea culorii curente. Spre exemplu

    GLubyte fillPattern[]={Oxff, 0x00, Oxff, 0x00, ...};

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Utilizarea abloanelor de umplere

    Biii trebuie s fie specificai ncepnd cu rndul de jos al modelului, i continund pn la rndul cel mai de sus (al-32-lea).

    Modelul este apoi aplicat de-a lungul ferestrei curente, umplnd poligonul specificat acolo unde modelul se suprapune cu interiorul poligonului.

    Odat specificat modelul i activat umplerea cu ablon se poate trece la desenarea poligonului.

    O alt modalitate de umplere a poligoanelor este utiliznd texturile. De asemenea, poligoanele pot fi umplute cu culoarea curent

    setat. Ca i n cazul liniilor se pot specifica culori diferite pentru fiecare

    vrf al unui poligon i n acest caz culoare interiorului poligonului va fi interpolarea culorilor vrfurilor poligonului.

    Aa cum s-a mai artat poligoanele pot fi desenate n modul wireframe sau doar marcnd vrfurile poligonului, depinde de ce parametrii sunt folosii pentru funcia glPolygonMode():

    GL_FILL - cu atribut de umplere

    GL_LINE - fr atribut de umplere(wireframe) GL_POINTS - marcate vrfurile

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Utilizarea abloanelor de umplere

    n OpenGL, funciile de redare a poligoanelor pot fi aplicate doar poligoanelor convexe.

    Pentru un poligon concav, trebuie mai nti desprit ntr-o mulime de poligoane convexe, de obicei triunghiuri.

    Pentru a afia apoi doar poligoanele originale trebuie s putem specifica care linii fac parte din poligoanele originale.

    Pentru aceasta se folosete funcia glEdgeFlag, care arat dac un vrf este sau nu primul punct al unei laturi din poligonul original.

    Funcia glEdgeFlag() este utilizat n interiorul perechii glBegin/glEnd.

    glEdgeFlag(GL_FALSE);

    Aceast comand arat c vrful care urmeaz nu precede o latur a unui poligon original.

    De asemenea, comanda se aplic tuturor vrfurilor care urmeaz pn la un nou apel al funciei glEdgeFlag. Argumentul GL_TRUE arat c vrful urmtor iniiaz o latur a poligonului original.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Antialiasing

    Pentru activarea procedurilor pentru antialiasing se folosete apelul:

    glEnable();

    avnd ca parametru una din valorile GL_POINT_SMOOTH, GL_LINESMOOTH sau GL_POLYGON_SMOOTH.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Funcii de interogare

    Se pot obine valorile pentru setrile curente ale atributelor i pentru diveri ali parametrii utiliznd funciile corespunztoare "Get" cum ar fi glGetlntegerv(), glGetFloatv(), glGetPolygonStipple().

    Spre exemplu, se poate afla setarea curent a culorii cu glGetFloatv(GL_CURRENT_COLOR, colorArray);

    Tabloul colorArray va fi setat n urma acestui apel cu culoarea curent.

    Similar se poate afla dimensiunea curent a punctului (GL_POINT_SIZE) sau a liniei (GL_LINE_WIDTH_RANGE).

    De asemenea se poate afla dac anumite proceduri, cum ar fi antialiasing-ul, sunt activate sau dezactivate.

    Exemple

    n continuare vor fi date cteva exemple ilustrative pentru utilizarea primitivelor geometrice i a atributelor acestora.

  • PR

    E

    L

    U

    C

    R

    A

    R

    E

    _

    G

    R

    A

    F

    I

    C

    Exemple

    Exemplul 1

    /*Un cerc din puncte de dimensiune un pixel */

    #include "glos.h"

    #include

    #include

    #include

    #include

    void myinit(void);

    void CALLBACK myReshape(GLsizei w,