Acest material este destinat studentilor anului II, invatamant la distant, specializarea Informatic.
2
Modul de prezentare are n vedere particularitile nvmntului la distan, n care studiul individual este determinant. n timp ce profesorul sprijin studentul prin coordonarea nvtrii si prin feedback periodic asupra acumulrii cunostintelor si a deprinderilor, studentul alege locul, momentul si ritmul pentru studiu, dispune de capacitatea de a studia independent si totodat si asum responsabilitatea pentru initierea si continuarea procesului educational.
Disciplina Grafica pe calculator utilizeaz noiunile predate la disciplinele Bazele informaticii, Geometrie computaional, discipline studiate n anul I si anul II sem I.
O nentelegere a notiunilor fundamentale prezentate n acest curs poate genera dificultti n asimilarea conceptelor complexe introduse n alte cursuri de specialitate.
3 Competene specifice disciplinei
1. Competene profesionale Cunoasterea si utilizarea conceptelor si tehnicilor pentru proiectarea, elaborarea si utilizarea programelor specifice pentru grafica pe calculator; Intelegerea si asimilarea principalelor cunostinte privind modelarea, reprezentarea si prelucrarea obiectelor 2D sau 3D in domeniul aplicatiilor software; Programare de grafica C++, OpenGL, Java 3D, SVG (Scalable Vector Graphics)
2. Explicare i interpretare Explicarea rolului i importantei mediului grafic nelegerea functionarii functiilor si metodelor
3. Instrumental - aplicative Corelarea cunotinelor teoretice cu abilitatea de a le aplica n practic Posibilitatea de exemplificare a tehnologiilor utilizate in grafica pe calculator
4 Continutul disciplinei
Lucrul cu obiecte imagine de tip Bitmap(conversia obiectelor vectoriale in obiecte bitmap, rezolutie, culoare, transparenta/opacitate fundal; importul imaginilor, tipuri de fisiere ce contin imagini bitmap; filtre aplicate imaginilor pentru a crea efecte speciale). Introducere n VRML; Crearea si vizualizarea fisierele VRML Filmul cu desene animate. Elaborarea de aplicatii grafice in OpenGL Desenare vectoriala (desenarea conturului unei forme.desenarea unei forme scalabile; transformarea unei forme vectoriale in selectie); Modele, spatii si moduri de culoare (intelegerea culorilor si moduri de culoare uzuale; conversia unei imagini dintr-un mod de culoare in altul; utilizarea tonurilor de gri; utilizarea si gestionarea culorilor cu paletele Color si Swatches, folosirea pipetei pentru culegerea culorii dintr-o imagine). Manipularea obiectelor (selectarea si deselectarea obiectelor, copierea, duplicarea, clonarea si stergerea obiectelor; culoarea de umplere si de contur si preluarea acestora de la un alt obiect; pozitionarea obiectelor in pagina direct sau prin aliniere si distribuire; dimensionarea, scalarea, rotirea si inclinarea obiectelor) Efecte speciale aplicate obiectelor (perspectiva, contur, infasuratoare (envelope), extruziune; tranzitii graduale intre 2 sau mai multe obiecte (blend); umbra, transparenta, efect de lentila, efectul PowerClip; distorsionarea obiectelor; copierea unui efect de la un obiect la altul).
Bibliografia 1. G. Albeanu, Grafic pe calculator. Algoritmi fundamentali, Editura Univ. Bucureti,2001. 2. Baciu, R., Programarea aplicaiilor grafice 3D cu OpenGL, Editura Albastr, Cluj-Napoca, 2005. 3. Moldoveanu, F., Racovi, Z.,Hera, G., Petrescu, ., Zaharia, M., Grafica pe calculator, Editura Teora, Bucureti, 1996. 4. Ionescu, F., Grafica n realitatea virtual, Editura Tehnic, Bucureti 2000. 5. Hearn, Donald, Backer,M. Pauline, Computer Graphics, Prentice-Hall, Inc, Englewood Cliffs, New Jersy, 1986 6. Foley,J., A.vanDame, Feiner, S.K., Hughes, J.F., Computer Graphics: principles and practice, Addison Wesley Publishing Company, second edition, 1993. 7. Neider, J., Davis, T., Woo, M., OpenGL Programming Guide, Addison- Wesley, Menlo Park, 1993. 8. www.wikipedia.org
5 Nota final acordata fiecrui student, va conine urmtoarele componente n procentele menionate:
- proba scrisa 60% - realizare referat 40%
Conditia de participare la proba de verificare este ca fiecare student sa prezinte un referat de maxim 15 pagini, despre unul sau mai multe subiecte tratate in suportul de curs, sa testeze si sa comenteze functiile utilizate in exemplele rezolvate la paginile 44-69, pentru cel putin 15 probleme. Referatul si fisierele C vor fi transmise cel mai tarziu cu 2 zile inainte de proba de verificare, pe adresa de email a tutorelui, care este de forma: prenume.nume@prof.utm.ro. Vor fi considerate decat temele trimise de pe adresa de email a studentului, care este de forma prenume.nume@s.utm.ro.
6 Grafica pe calculator reprezinta acele metode si tehnici de conversie a datelor catre si de la un dispozitiv grafic prin intermediul calculatorului.
Aplicarea graficii pe calculator este format din urmtoarele domenii principale: Vizualizarea informaiei Proiectare Modelare (simulare) Interfa grafic pentru utilizatori GUI n prezent cunoaterea elementelor de baz ale graficii pe calculator este necesar inginerului, omului de tiin, artitilor plastici, designerilor, fotografilor, pictorilor de animaie etc.
Datorit calculatorului putem avea la dispoziie n cteva fraciuni de secund variaii multiple de culoare, forme, compoziii etc. n baza tenologiilor graficii computerizate s-au dezvoltat: Interfaa de utilizator - GUI Proiectarea digital n arhitectur i grafica industrial Efecte vizuale specializate, cinematografia digital Grafica pe computer pentru filme, animaie, televiziune Reeaua Internet Conferinele video Televiziunea digital Proiecte multimedia, proiecte interactive Fotografia digital i posibilitile avansate de prelucrare a fotografiei Grafica i pictura digital (cu 2 laturi eseniale imitarea materialelor tradiionale i noile instrumente de lucru digitale) Vizualizarea datelor tiinifice i de afaceri Jocuri la calculator, sisteme de realitate virtual (de ex. simulatoare pentru aviaie) Sisteme de proiectare automatizat Tomografie computerizat Poligrafia Grafica laser
7 Grafica pe calculator este de asemenea i un domeniu de activitate tiinific Grafica digital OBSERVATIE: Grafica rastru i vector stau la baza graficii digitale.
Grafica digital este un domeniu al informaticii care acoper toate aspectele legate de formarea imaginilor utiliznd un computer. Termenul englez corespunztor este computer graphics.
Grafica digital mai este numit uneori grafic de computer, grafic de calculator, grafic pe calculator, grafic computerizat.
Grafica digital este o activitate n care computerul este utilizat pentru sintetizarea i elaborarea imaginilor, dar i pentru prelucrarea informaiei vizuale obinute din realitatea ce ne nconjoar.
Grafica digital se divizeaz n mai multe categorii: Grafica bidimensional (se constituie din grafic raster i grafic vector) Grafica Fractal Grafica tridimensional (este des utilizat n animaie, spoturi publicitare, jocuri la computer etc.) CGI grafica (CGI n englez imagini, personaje generate de computer) Grafica animat Grafica video Grafica web Grafica Multimedia Fractal Explorer este un generator de fractali care poate produce imagini frumoase, misterioase matematic generate. Fractal Explorer poate face seturi de fractali clasici, polinomial, (cum ar fi Mandelbrot, Julia, Newton i variante ale lor). - Fractali compleci 4D (numii quaternions), atractori stranii 3D i IFS. De asemenea, FE are multe posibiliti pentru crearea de efecte speciale i de mbuntire a imaginilor.
Termenul fractal provine din latinescul fractus, care nseamn "spart, "fracturat". Acest termen a fost introdus de Benot Mandelbrot, n 1975. Un fractal este un obiect matematic care are o structur detaliat la orice scar. n structura unui fractal, fiecare parte este asemntoare cu fractalul ntreg (este autosimilar).
8
Fractalii, aceste deosebite obiecte matematice, de o mare complexitate, sunt generai printr-un procedeu matematic relativ simplu (metoda iteraiei). Dimensiunea geometric a unui fractal se bazeaz pe dimensiunea Hausdorff, care este o extensie a dimensiunii euclidiene. Dac n geometria euclidiana un obiect nu are dect o dimensiune ntreag, n geometria fractal dimensiunile sunt, n general, numere reale nentregi pozitive
n grafica digital se opereaz cu diverse elemente grafice, pentru elaborarea i controlul imaginilor ca de exemplu: pixel, punct, linie, curb, poligon etc. La baza graficii digitale (i n special grafica bidimensionala) stau doua tipuri de calculaii, Raster (sau rastru) i Vector (vectorial). Grafica rastru i vector stau la baza graficii digitale, ele sunt utilizate de programele 3 dimensionale, programe pentru montare video, animaie, etc. Prezentarea la calculator a imaginii de tip Raster se face n baza segmentrii unei suprafee cu ajutorul unor ptrele mici care se numesc pixeli. O imagine rastru este un tablou format din mai multi pixeli. Cu ct mai muli pixeli avem n imagine cu att calitatea detaliilor e mai nalt. Acest tip de grafic permite s cream i s reproducem oricare imagine cu multitudinea de efecte i subtiliti,
9 indiferent de complexitate. Imaginile procesate cu ajutorul scanerului sau aparatelor foto snt formulate ca raster. Neajunsurile e complicata redimensionarea graficii rastru, deoarece la interpolare (adugare de pixeli n raport de cei existeni n imagine) computerul inventeaz calculnd pixelii nu ntotdeauna satisfctor, cu toate c sunt diverse metode de interpolare. Grafica vectorial este un procedeu prin care imaginile sunt construite cu ajutorul descrierilor matematice prin care se determin poziia, lungimea i direcia liniilor folosite n desen. Grafica vectoriala e bazat ca principiu pe desen cu ajutorul liniilor calculate pe o suprafaa. Liniile pot fi drepte sau curbe. n cazul imaginilor vectoriale fiierul stocheaz liniile, formele i culorile care alctuiesc imaginea, ca formule matematice. Imaginile Vector pot fi mrite i micorate fr a pierde calitatea. O imagine poate fi modificat prin manipularea obiectelor din care este alctuit, acestea fiind salvate apoi ca variaii ale formulelor matematice specifice. Este des utilizata n imagini cu funcii decorative, caractere-text, logotipuri, infograme, decor, cat i n proiecte sofisticate 3D, montare video, animaie, etc. Exist sisteme sofisticate de control cromatic al imaginilor. Adaptarea valorilor cromatice se aplic n funcie de necesitai i scopuri. Astfel, pentru controlul de culoare la computere, exist mai multe modele cromatice (sau modele de culoare), care pot fi folosite pentru definirea cromatic a imaginii, pentru selectarea culorilor n procesul desenrii i crerii imaginii, pentru arhivare, etc. n general exist dou tipuri majore de modele cromatice: amestecul aditiv RGB (din englez de la Red-Green-Blue, rou-verde- albastru) amestec de culori lumin se utilizeaz pentru ecran, monitor, televiziune, scanare, aparate foto, design web, animaie i altele. amestec substractiv CMYK (de la Cyan-Magenta-Yellow-blacK) amestec de culori pigment se utilizeaz pentru proiecte poligrafice destinate tiparului color. Unele modele de culoare admit variaii ale diapazonului cromatic, din acest motiv sunt mprite n diverse profiluri de culoare destinate diferitelor necesiti. De exemplu, pentru modelul RGB exist mai multe profiluri. sRGB IEC61966-2.1 diapazon mediu utilizat mai des pentru pagini web, sau Adobe RGB (1998) diapazon mai mare utilizat pentru prelucrarea imaginilor destinate produselor pentru tipar.
10 Pe lng modelele cromatice RGB i CMYK mai exist i altele precum: Lab, HSB / HSL / HSI, Culori Indexate, Culori Pantone/PMS (Pantone Matching System), Culori Spot.
Desktop publishing, abreviat DTP, este o expresie englez din domeniul tipografiei i care s-ar putea traduce prin "publicare cu ajutorul calculatorului de tip desktop". Este procesul de creare i editare (modificare) a unui document cu ajutorul unui computer avnd ca obiectiv final tiprirea lui. n acest domeniu exist programe de calculator specializate ce pot fi mprite n mai multe categorii: programe de creaie i prelucrare foto (Adobe Photoshop, Corel Photopaint); programe de creaie i prelucrare de grafic vectorial (Adobe Illustrator, Corel Draw); programe de paginare (Adobe InDesign, QuarkXPress, Adobe Pagemaker, Corel Ventura); programe utilitare (Adobe Acrobat Professional, Adobe Acrobat Distiller etc);
Cel mai utilizat program pentru realizarea documentelor ce urmeaz a fi tiprite este Corel Draw. Are setri speciale pentru separaii, overprint Monitoarele sunt aparatele ce decodific semnalul electric i genereaz culorile RGB (Red, Green, Blue rou, verde, albastru) prin suprapunere de lumin. Cnd nu exist nici un fel de lumin este generat culoarea neagr, cnd intensitatea prin cele trei canale este maxim, se obine culoarea alb. Teoretic s-ar putea tipri i folosind direct spaiul de culori RGB, ns datorit imperfeciunii hrtiei, cernelii i a mainilor de tipar, se folosete spaiul CMYK (Cyan, Magenta, Yellow, blacK), urmnd ca negrul, care se tiprete la sfrit de procedur, s acopere aceste imperfeciuni. La o lucrare pretenioas este indicat ca imaginile, textele i obiectele colorate s fie combinate atent, mai ales cnd se lucreaz cu culori Pantone, pentru ca la sfrit s nu rezulte amestecaturi nedorite de culoare. Funcia de overprint este suprapunerea la tipar a dou culori diferite, culoarea de deasupra (ultim) acoperind total culoarea de dedesubt (anterioar). Dac activm opiunea Overprint la culoarea neagr, atunci cercul va putea rmne ntreg i nu va mai fi nevoie s fie mai nainte decupat n locurile unde urmeaz a fi tiprit textul negru.
11
Afiarea i crearea imaginilor vectoriale Display-urile computerelor sunt alctuite din puncte minuscule numite pixeli. Imaginile bitmap sunt de asemenea construite folosind aceste puncte. Cu ct sunt mai mici i mai apropiate, cu att calitatea imaginii este mai ridicat, dar i mrimea fiierului necesar pentru stocarea ei. Dac imaginea este afiat la o mrime mai mare dect cea la care a fost creat iniial, devine granulat i neclar, deoarece pixelii din alctuirea imaginii nu mai corespund cu pixelii de pe ecran. Pentru a crea i modifica imagini vectoriale sunt folosite programe software de desen vectorial. O imagine poate fi modificat prin manipularea obiectelor din care este alctuit, acestea fiind salvate apoi ca variaii ale formulelor matematice specifice. Operatori matematici din software pot fi folosii pentru a ntinde, rsuci, colora diferitele obiecte dintr-o imagine. n sistemele moderne, aceti operatori sunt prezentai n mod intuitiv folosind interfaa grafic a calculatorului. Conversia din i n format raster Vectorizarea imaginilor este util pentru eliminarea detaliilor nefolositoare dintr-o fotografie. Conversia din format vectorial se face practic de fiecare dat cnd este afiat imaginea, astfel nct procesul de l salva ca bitmap ntr-un fiier este destul de simplu. Mult mai dificil este procesul invers, care implic aproximarea formelor i culorilor din imaginea bitmap i crearea obiectelor cu proprietile corespunztoare. Numrul obiectelor generate este direct proporional cu complexitatea imaginii. Cu toate acestea, mrimea fiierului cu imaginea n format vectorial nu va depi de obicei pe cea a sursei bitmap.
12 Aplicaiile grafice avansate pot combina imagini din surse vectoriale i raster i pun la dispoziie unelte pentru amndou, n cazurile n care unele pri ale proiectului pot fi obinute de la o camer, iar altele desenate prin grafic vectorial. Vectorizarea Aceasta se refer la programe i tehnologii/servicii folosite pentru a converti imagini de tip bitmap n imagini de tip vectorial. Exemple de utilizare: n Proiectarea asistata pe calculator (CAD) schiele sunt scanate, vectorizate i transformate n fiiere CAD printr-un process denumit sugestiv hrtie-CAD. n GIS imaginile provenite de la satelii sunt vectorizate cu scopul de a obine hri. n arta digitala i fotografie, imaginile sunt de obicei vectorizate folosind plugin-uri pentru programe ca Adobe Photoshop sau Adobe Illustrator, dar vectorizarea se poate face i manual. Imaginile pot fi vectorizate pentru o mai bun utilizare i redimensionare, de obicei far diferene mari fa de original. Vectorizarea unei fotografii i va schimba aspectul din fotografic n pictat sau desenat; fotografiile pot fi transformate i n siluete. Un avantaj al vectorizrii este c rezultatul poate fi integrat cu succes intr-un design precum un logo. Dezavantaje i limitri Principalul dezavantaj al imaginilor vectoriale este c, fiind alctuite din obiecte descrise cu formule matemetice, att numrul acestor obiecte ct i complexitatea lor sunt limitate, depinznd de biblioteca de formule matematice folosit de programul de desenare. De exemplu, dispozitivele digitale, cum ar fi camerele foto sau scannerele, produc fiiere raster care nu pot fi reprezentate fidel folosind imagini vectoriale. Chiar i n cazul n care se reuete vectorizarea unei astfel de imagini, editarea acesteia la complexitatea original este dificil.Un alt dezavantaj este c formatele n care sunt stocate imaginile vectoriale sunt foarte complexe. Implementarea acestor formate pe dispozitive diferite este problematic din aceast cauz. Conversia dintr-un format n altul este de asemenea dificil. Aplicaii Datorit flexibilitii n ceea ce privete rezoluia imaginilor vectoriale, acestea sunt folosite intensiv pentru crearea materialelor ce trebuie imprimate la mrimi foarte diverse: acelai fiier poate fi folosit pentru un card de vizit ct i pentru un panou publicitar, n ambele cazuri.rezultatele fiind foarte clare i precise.
13 O alt aplicaie semnificativ a graficii vectoriale este n modelarea suprafeelor 3D, unde se dorete o calitate ridicat a obiectelor. GIS este acronimul provenit de la Geographic Information System (Sistem Informatic Geografic - uneori tradus n forma SIG n limba romn). Acest sistem e utilizat pentru a crea, stoca, a analiza i prelucra informaii distribuite spaial printr-un proces computerizat. Tehnologia GIS poate fi utilizat n diverse domenii tiinifice cum ar fi: managementul resurselor, studii de impact asupra mediului, cartografie, planificarea rutelor. Specific unui GIS este modul de organizare a informaiei gestionate. Exist dou tipuri de informaie: una grafic care indic repartiia spaial a elementelor studiate i alta sub form de baz de date pentru a stoca atributele asociate acestor elemente (de ex. pentru o osea lungimea ei, limea, numrul benzilor, materialul de construcie etc.). Informaia grafic poate fi de dou feluri: raster sau vectorial. Grafica raster este o modalitate de reprezentare a imaginilor n aplicaii software sub forma de matrice de pixeli n timp ce grafica vectorial este o metoda de reprezentare a imaginilor cu ajutorul unor primitive geometrice (puncte, segmente, poligoane), caracterizate de ecuatii matematice. Specific sistemelor GIS este asocierea unui sistem de coordonate geografic matricii de pixeli (la imaginile raster) sau vectorilor - procedeul poarta numele de Georeferentiere. Astfel unui obiect (reprezentat fie printr-o imagine, fie printr-un vector) i este asociat o poziie unic n Sistemul Informatic corespunztoare poziiei geografice din lumea real.
Informaie tip raster - imagine satelitar - dintr-un sistem GIS Datorit informaiilor asociate graficii, Sistemele Informatice Geografice beneficiaz de toate oportunitile de interogare pe care le ofera sistemele moderne de baze de date i n plus pot oferi uor analize orientate pe anumite zone geografice - aa numitele hri tematice. Un exemplu comun de Sistem Informatic Geografic l reprezent Sistemele de Navigaie. Harta rutier n form vectorial este georefereniat astfel nct
14 Sistemul de Poziionare Global (Global Positioning System - GPS) s poat indica poziia exact a autovehiculului. Planificarea rutei este n fapt o hart tematic obinut n urma unei interogri spaiale (cutarea distanei celei mai scurte ntre dou puncte) combinat cu o interogare a bazei de date asociate drumurilor din hart astfel nct s fie respectate o serie de condiii (limitri de vitez, gabarit, sensuri de circulaie, interdicii, etc.). Datorit impactului pozitiv, sistemele software GIS s-au dezvoltat foarte mult. Exist pe pia un numr foarte mare de produse, att ale dezvoltatorilor consacrai (ESRI, Intergraph, Autodesk, MapInfo, etc.) dar i de tip Open source (Grass GIS, Quantum GIS, GVSIG, OpenJump, etc.). Adobe Photoshop este un software folosit pentru editarea imaginilor digitale pe calculator, program produs i distribuit de compania american Adobe Systems i care se se adreseaz n special profesionitilor domeniului. Adobe Photoshop, aa cum este cunoscut astzi, este vrful de lance al gamei de produse software pentru editare de imagini digitale, fotografii, grafic pentru tipar, video i Web de pe pia. Photoshop este un program cu o interfa intuitiv i care permite o multitudine extraordinar de modificri necesare n mod curent profesionitilor i nu numai: editri de luminozitate i contrast, culoare, focalizare, aplicare de efecte pe imagine sau pe zone (selecii), retuare de imagini degradate, numr arbitrar de canale de culoare, suport de canale de culoare pe 8, 16 sau 32 bii, efecte third-party etc. Exist situaii specifice pentru un profesionist n domeniu cnd alte pachete duc la rezultate mai rapide, ns pentru prelucrri generale de imagine, ntruct furnizeaz instrumente solide, la standard industrial, Photoshop este efectiv indispensabil. Alturi de aplicaia Photoshop (ajuns la versiunea CS5), este inclus i aplicaia ImageReady, cu un impresionant set de instrumente Web pentru optimizarea i previzualizarea imaginilor (dinamice sau statice), prelucrarea pachetelor de imagini cu ajutorul sistemului droplets-uri (mini-programe de tip drag and drop) i realizarea imaginilor rollover (imagini ce i schimb aspectul la trecerea cu mouse-ul peste), precum i pentru realizarea de GIF-uri animate. Avantaje Principalele elemente prin care Photshop se difereniaz de aplicaiile concurente i prin care stabilete noi standarde n industria prelucrrii de imagini digitale sunt: Seleciile Straturile (Layers) Mtile (Masks) Canalele (Channels) Retuarea
15 Optimizarea imaginilor pentru Web Formate fiiere Photoshop poate citi majoritatea fiierelor raster i vector. De asemenea, are o serie de formate proprii: PSD (abreviere pentru Photoshop Document). Acest format conine o imagine ca un set de straturi (Layers), incluznd text, mti (mask), informaii despre opacitate, moduri de combinare (blend mode), canale de culoare, canale alfa (alpha), ci de tiere (clipping path), setri duotone precum i alte elemente specifice Photoshop. Acesta este un format popular i des rspndit n rndul profesionitilor, astfel c este compatibil i cu unele aplicaii concurente Photoshop. PSB (denumit Large Document Format) este o versiune mai nou a formatului PSD, conceput special pentru fiiere mai mari (2GB) sau cu o informaie prezent pe o suprafa definit de laturi mai mari de 30.000 de pixeli (suport pn la 300.000x300.000 pixeli). PDD este un format mai puin ntlnit, fiind asociat iniial aplicaiei Adobe PhotoDeluxe, astzi (dup 2002) compatibil doar cu aplicaiile Adobe Photoshop sau Adobe Photoshop Elements. Ultimele instrumente Camera RAW: Instrumentul ofer acces rapid i facil la imaginile tip RAW produse de majoritatea camerelor foto digitale profesionale i de mijloc. Camera RAW se folosete de toate detaliile acestor fiiere pentru a obine un control total asupra aspectului imaginii, fr a modifica fiierul n sine. Adobe Bridge: Un browser complex, de ultim generaie, ce simplific gestionarea fiierelor, poate procesa mai multe fiiere de tip RAW n acelai timp i pune la dispoziia utilizatorului informaia metadata de tip EXIF etc. Multitasking: Adobe introduce posibilitatea de a folosi toate aplicaiile sale din suita "Creative suite 2" n sistem multitasking. Suport High Dynamic Range (HDR) pe 32 bii: Creeaz i editeaz imagini pe 32 bii, sau combin cadre fotografice de expuneri diferite ntr- una ce include valorile ideale de la cele mai intense umbre pn la cele mai puternice zone de lumin. Shadow/Highlight: mbuntete contrastul fotografiilor subexpuse sau supraexpuse, inclusiv imagini CMYK, pstrnd n continuare echilibrul vizual al imaginii. Vanishing Point: Ofer posibilitatea de a clona, picta sau lipi elemente ce automat se transpun n perspectiva obiectelor din imagine.
16 Image Warp: Capacitatea de a deforma imaginile plane dup o matrice uor editabil, folosind mouse-ul. Corectarea deformrilor cauzate de lentile: Lens Distort corecteaz cu uurin efectele obinuite date de lentilele aparatelor foto precum cele cilindrice, sferice, tip plnie, "efectul de vignet" (funcie de poziionarea fa de lumin, colurile fotografiilor sunt fie ntunecate, fie luminate n contrast cu restul fotografiei) sau aberaiile cromatice. Personalizarea aplicaiei:Posibilitatea de a personaliza orice scurttur sau chiar funciile din meniul aplicaiei i posibilitatea de a salva modificrile pentru fiecare mod de lucru n parte. Control mbuntit al straturilor (layers): capacitatea de a selecta mai multe straturi n acelai timp. Smart objects: abilitatea de a deforma, redeforma i a reveni la starea iniial a obiectelor fr a pierde din calitate. Aplicaiile grafice se realizeaz prin utilizarea urmtoarelor clase de produse software: editoare grafice, biblioteci grafice, programe grafice specializate, desktop publishing, worksheet graphics (birotic). Editoarele grafice sunt destinate prelucrrii grafice in domeniul proiectrii asistate de calculator dintre produsele care nglobeaz editoare grafice amintim: Auto Cad, Freelanec 2 Plus, Windows Paint, Corel Draw. Bibliotecile grafice sunt destinate prelucrrilor prin intermediul limbajelor de programare de nivel nalt (C, Visual C, Visual Basic, Delphi, Open GL etc...). Acestea conin biblioteci cu rutine (primitive) grafice care realizeaz funcii grafice necesare aplicaii grafice. Programe grafice specializate sunt destinate rezolvrii problemelor din anumite domenii, oferind utilizatorului s enune probleme ct mai simplu i n concordan cu limbajul utilizat n domeniul su. De exemplu: Matlab, Mathematica, Mathcad.
Desktop publishing sunt produse software destinate realizrii de publicatii (ziare, reviste, reclame, etc.) la birou, parcurgnd toate etapele dintr-o tipografie clasic. De exemplu: Xerox Ventura Publisher care este compatibil cu mai multe procesoare de text si cu unele editoare grafice, Pagemaker, Xpress, Super Paint, Publish IT, etc.
O interfata API este un cod sursa oferit de catre sistemul de operare sau o librarie pentru a permite apeluri la serviciile care pot fi generate din API- uri respective de catre un program. Termenul API este folosit in 2 sensuri: - O interfata coerenta care consta din clase sau seturi de functii sau proceduri interconectate. - Un singur punct de intrare, cum ar fi o metoda, o functie sau o procedura.
17 Doua Interfete API foarte cunoscute sunt Single UNIX Specification si Microsoft Windows API. Interfete API sunt deseori incorporate in Software Development Kit (SDK)
Modelul de design a Interfetelor API
Exista o multime de modele de design a Interfetelor API. Cele prevazute pentru executie rapida deseori consta din functii, proceduri, variabile si structuri de date. Exista si alte modele cum ar fi interpretatori (emulatori) care evalueaza expresii in ECMAScript (cunoscut sub nume JavaScript) sau alt layer abstract, oferind programatorului posibilitatea de a evita implicarea in relatiile functiilor cu nivelul inferior al abstractiei. Unele Interfete API, cum sunt cele standard pentru un sistem de operare, sunt implementate ca librarii de cod separate care sunt distribuite impreuna cu sistemul de operare. Altele au integrata functionalitatea interfetei API direct in aplicatie. Microsoft Windows API este distribuita cu sistemul de operare. Interfetele API pentru sisteme embedded, cum sunt console de jocuri video, in general intra in categoria API-urilor integrate direct in aplicatie. O interfata API care nu necesita drepturi mari de acces sunt numite "open" (OpenGL ar fi un exemplu). Cateva exemple de Interfete API: - Single UNIX Specification (SUS) - Microsoft Win32 API - Java Platform, Enterprise Edition API's - OpenGL cross-platform API - DirectX for Microsoft Windows - Google Maps API - Wikipedia API - Simple DirectMedia Layer (SDL) - svgalib pentru Linux si FreeBSD - Carbon si Cocoa pentru Macintosh OS
Microsoft Windows API's
Windows API, neoficial WinAPI, este numele dat de catre Microsoft pentru un set de Interfete API disponibile in sisteme de operare Microsoft Windows. Aceste interfete au fost construite pentru a fi folosite de catre programatori C/C++ si sunt cel mai direct mod de a interactiona cu sistemul Windows pentru aplicatii software. Accesul la nivel inferior la sistemul Windows, in general necesar pentru drivere, este oferit de catre Windows Driver Foundation in versiunea curenta a Windows-ului. In sisteme de operare Windows este disponibil un Software Development Kit (SDK), care ofera documentatia si unelte pentru a permite
18 dezvoltatorilor crearea aplicatiilor folosind Interfete API si tehnologii Windows asociate.
Compilatoare suportate
Pentru a dezvolta software care foloseste Interfetele API Windows, este nevoie de compilator care poate importa si manipula fisierele DLL si obiectele COM caracteristice Microsoft-ului. Compilatorul trebuie sa accepte dialectul limbajelor C sau C++ si sa manipuleze IDL (interface definition language) fisiere si fisiere header care expun denumirile functiilor interioare ale Interfetelor API. Aceste compilatoare, unelte, librarii si fisiere header sunt impreunate in Microsoft Platform SDK (Software Development Kit). Pentru mult timp familia de compilatoare si unelte Microsoft Visual Studio si compilatoare Borland, au fost singurele care puteau la cerintele sus mentionate. Acuma exista MinGW si Cygwin care ofera interfete bazate pe GNU Compiler Collection. LCC-Win32 este disponibil pentru utilizare non-comerciala, continand compilator C si intretinut de catre Jacob Navia. Pelles C este compilator C gratuit oferit de catre Pelle Orinius. Microsoft DirectX Microsoft DirectX este o colectie de Interfete API folosita pentru manipularea taskurilor legate de multimedia, in special programarea jocurilor si video, pe platforme Microsoft. DirectX este de asemenea folosit si de alti producatori software, in mare parte in sectorul de inginerie, din cauza abilitatii de redare rapida a obiectelor 3D de inalta calitate. Atat DirectX runtime cat si software development kit (kitul de dezvoltare soft) sunt disponibilie gratuit, dar sunt proprietate Microsoft si sunt closed- source (fara posibilitate de schimbare, rescriere, suprascriere). DirectX a fost initial redistribuit de catre dezvoltatori de jocuri impreuna cu kiturile de instalare, dar in ultim timp DirectX a fost inclus in kit de instalare a sistemului de operare (sau in Service Packs). Unii dezvoltatori de jocuri inca mai includ DirectX in kitul de instalare si ofera posibilitate de a-l instala (sau de a face update) dupa instalarea jocului. Cel mai recente versiuni ale DirectX-ului sunt DirectX 10 si DirectX 9.0L, disponibile exclusiv pentru Windows Vista (motivul fiind, dupa cum sustine Microsoft, faptul ca exista schimbari in arhitectura grafica a Windowsului si din cauza introducerii Windows Display Driver Model). Interfetele API din DirectX
19 Majoritatea Interfetelor API din DirectX sunt in forma de obiecte COM. Componentele care le contine DirectX sunt: DirectX Graphics, alcatuit din doua Interfete API (DirectX 8.0 sau mai mult): 1. DirectDraw: pentru generarea de obiecte grafice 2D (acum dezaprobat, desi este inca folosit de multi programatori) 2. Direct3D (D3D): pentru generarea obiectelor grafice in 3D DirectInput pentru tastaura, mouse, joustick sau alte controlere pentru jocuri (nu mai este folosit decat pentru Xinput, in controlere la Xbox 360) DirectPlay pentru comunicare jocurilor in retea (Impreuna cu DirectInput a fost folosit ultima data in DirectX 8. Acuma este dezaprobat) DirectSound pentru redarea sunetului si inregistrarea sunetului in forma wave DirectMusic pentru redarea sunetelor autorizate de catre DirectMusic Producer DirectX Media contine DirectAnimation pentru animatii web 2D, DirectShow pentru redare multimedia, DirectX Transform pentru interactionare web si Direct3D Retained Mode pentru obiecte grafice 3D de nivel inalt. DirectShow mai contine DirectX Plugins pentru procesarea semnalului audio si DirectX Video Acceseration pentru a accelera redarea video. DirectX Media Objects suport pentru pentru obiecte cu streamuri cum sunt encodere, decodere si efecte. DirectSetup pentru instalarea componentelor DirectX (care de fapt nu prea este API) Inainte de existenta DirectX-ului, Microsoft avea deja inclus setul de API- uri OpenGL pe platformele Windows NT. In acel timp OpenGL necesita hardware de inalta performanta si era limitat pe inginerie si utilizatori CAD. Direct3D (introdus de persoane care au dezvoltat DirectX ca o alternativa pentru OpenGL) urma sa fie o concurenta pentru (atunci) mai costisitor (din punct de vedere hardware) OpenGL pentru dezvoltarea jocurilor. Cu timpul, dupa ce puterea placilor video au crescut, OpenGL a devenit standard si conducatorul pietei. In acel punct a inceput "batalia"
20 intre adepti ai cross-platform OpenGL si Windows-only Direct3D, care dupa cum multi sustineau era inca un exemplu de adoptare, extindere si eliminare (embrace, extend and extinguish) de la Microsoft. Alte Interfete API din DirectX sunt deseori combinate cu OpenGL in crearea jocurilor video datorita faptului ca OpenGL nu include toate functionalitatile care le are DirectX (cum ar fi suport pentru sunet sau joystick). Totusi, combinatia intre OpenGL si OpenAL (Open Audio Library) pentru acest scop a devenit populara. DirectX este folosit ca si baza pentru Interfetele API de la console Xbox si Xbox 360, oferite de catre Microsoft. Interfetele API au fost dezvoltate de catre Microsoft si NVIDIA (care a dezvoltat hardware folosit de consola). Intefetele API din Xbox sunt similare cu cele din DirectX 8.1, dar fara posibilitate de update. Xbox a fost numit DirectXbox, dar numele a fost prescurtat pentru motive comerciale. Compatibilitate Producatori hardware sunt nevoiti sa scrie drivere si sa testeze fiecare bucata aparte, pentru a le face compatibile cu DirectX. Unele dispozitive hardware au doar drivere compatibile cu DirectX (ceea ce inseamna ca utilizatorul trebuie sa instaleze DirectX pentru a folosi acele dispozitive). Versiunile mai vechi de DirectX includeau si o librarie care continea toate driverele cunoscute si disponibile la momentul lansarii versiunii respective. La aceasta practica s-a renuntat in favoarea sistemului de reactualizare, bazat pe web, Windows Update care permite utilizatorilor sa descarce doar drivere relevante pentru dispozitivul lor. Inainte de DirectX 10, DirectX era considerat ca fiind compatibil cu versiuni precedente (versiunile noi erau compatibile cu cele vechi). Asta este consecinta pozitiva a modelului COM folosit pentru API-ul DirectX. Cu Windows Vista si Direct3D 10 cu schimbari radicale, compatibilitate nu mai este posibila. Din acest motiv DirectX 10 ofera Interfata API Direct3D 9, astfel incat sa fie posibila rularea jocurilor si aplicatiilor mai vechi. DirectX 10 si 9.0L Windows Vista este lansata cu DirectX 10 (si 9.0L pentru compatibilitate cu versiuni mai vechi) si este singurul sistem de operare din familia Windows care il contine. Schimbari radicale au fost facute: DirectInput este defavorizat si inlocuit cu Xinput, din Xbox. De asemenea, DirectSound este defavorizat si inlocuit cu XACT. DirectX 10 a renuntat la suport pentru accelerarea dispozitivelor audio, iar sunetul este redat in softearul pe CPU. DirectPlay este defavorizat si inlocuit cu Games for Windows - LIVE, in timp ce DirectShow este defavorizat si inlocuit cu Media Foundation, un set
21 diferit de Interfete API lansate impreuna cu Windows Vista, pentru manipularea de secvente audio si video. DirectMusic va fi probabil singurul ramas intact. Direct3D O proprietate noua majora in DirectX 10 este Direct3D (initial numit Windows Graphics Foundation). Folosind noul Windows Display Driver Model, Shader Model 4.0 si noile, mai stricte, cerinte pentru producatori de GPU (Graphical Processing Unit) care trebuie satisfacute pentru a sustine compatibilitate cu Direct3D, versiunea 10 de Direct3D reprezinta indepartarea de la practicile versiunilor mai vechi. Pentru a oferi compatibilitate cu versiunile precedente de Direct3D, DirectX 10 contine de fapt trei versiuni de Direct3D: - Direct3D 9: aceasta Interfata API emuleaza comportamentele ale Direct3D 9 pe Windows XP pentru a oferi compatibilitate cu aplicatii mai vechi. Toate detaliile si avantajele ale Windows Display Driver Model (WDDM) din Vista, sunt ascunse de aplicatie (in caz ca WDDM drivere sunt instalate). Aceasta este singura Interfata API disponibila in caz ca exista doar drivere grafice XP. - Direct3D 9Ex (initial numit 9.0L): permite acces total la noile capabilitati ale WDDM, in timp ce pastreaza compatibilitate pentru aplicatii Direct3D existente folosind o interfata API separata. Efectul de transparenta ("glass effect") din Windows Aero se bazeaza pe codul din Direct3D 0Ex. Cand 9Ex era inca sub numele de cod 9.0L, existau zvonuri ca acesta va fi Direct3D 10 pentru Windows XP. Pana la urma s-a demonstrat ca nu este asa, in mare parte din cauza incompatibilitati al WDDM pe Windows XP. - Direct3D 10: Temporar, singurul GPU compatibil cu Direct3D este NVIDIA GeForce 8 Series, care de fapt profita foarte putin de capabilitatile ale Direct3D 10. Alternative Exista alternative pentru aceasta arhitectura, unele mai complete decat altele. Nu exista o solutie unica care sa ofere toate functionalitatile care le ofera DirectX, dar prin combinare de librarii - OpenGL, OpenAL, SDL, OpenML, FMOD, etc - utilizatorul pote sa implementeze o solutie comparabila cu DirectX si in aceasi timp gratuita si cross-platform (poate fi folosite pe diferite platforme).
22 OpenGl
Dintre bibliotecile grafice existente, biblioteca OpenGL, scris n limbajul C, este una dintre cele mai utilizate, datorit faptului c implementeaz un numr mare de funcii grafice de baz pentru crearea apliciilor grafice interactive, asigurnd o interfa independent de platforma hardware.
Desi introdus n anul 1992, biblioteca OpenGL a devenit n momentul de fa cea mai intens folosit interfa grafic pentru o mare varietate de platforme hardware i pentru o mare varietate de aplicaii grafice 2D i 3D, de la proiectare asistat de calculator (CAD), la animaie, imagistic medical i realitate virtual.
Datorit suportului oferit prin specificaiile unui consoriu specializat (OpenGL Architecture Review Board) i a numrului mare de implementri existente, n momentul de fa OpenGL este n mod real singurul standard grafic multiplatform. www.opengl.org.
Aplicaiile OpenGL pot rula pe platforme foarte variate, ncepnd cu PC, staii de lucru i pn la supecalculatoare, sub cele mai cunoscute sisteme de operare: Linux, Unix, Windows NT, Windows 95, Mac OS. Funiile OpenGL sunt apelabile din limbajele Ada, C, C++ i Java. Din consoriul de arhitectur OpenGL fac parte reprezentani de la firmele Compaq, Evens-Sutherland, Hewlett-Packard, IBM, Intel, Intergraph, Microsoft i Silcon Graphics. Pentru scrierea aplicaiilor folosind interfaa OpenGL de ctre utilizatori finali nu este necesar obinerea unei licene.
Folosind biblioteca OpenGL, un programator n domeniul graficii se poate concentra asupra aplicaiei dorite i nu mai trebuie s fie preocupat de detaliile de implementare a diferitelor funcii standard. Programatorul nu este obligat s scrie algoritmul de generare a liniilor sau a suprafeelor, nu trebuie s calculeze decuparea obiectelor la volumul de vizualizare, etc, toate acestea fiind deja implementate n funciile bibliotecii i, cel mai probabil, mult mai eficient i adaptat platformei hardware dect le-ar putea realiza el nsui.
n redarea obiectelor tridimensionale, biblioteca OpenGL folosete un numr redus de primitive geometrice (puncte, linii, poligoane), iar modele complexe ale obiectelor i scenelor tridimensionale se pot dezvolta particularizat pentru fiecare aplicaie, pe baza acestor primitive. Dat fiind c OpenGL prevede un set puternic, dar de nivel sczut, de comenzi de redare a obiectelor, mai sunt folosite i alte biblioteci de nivel mai nalt care utilizeaz aceste comenzi i preiau o parte din sarcinile de programare grafic.
23 Astfel de biblioteci sunt:
Biblioteca de funcii utilitare GLU (OpenGL Utility Library) permite definirea sistemelor de vizualizare, redarea suprafeelor curbe i alte funcii grafice. Pentru fiecare sistem Windows exist o extensie a bibliotecii OpenGL care asigur interfaa cu sistemul respectiv: pentru Microsoft Windows, extensia WGL, pentru sisteme care folosesc sistemul X Window, extensia GLX, pentru sisteme IMB OS/2, extensia PGL. Biblioteca de dezvoltare GLUT (OpenGL Utility Toolkit) este un sistem de dezvoltare independent de sistemul Windows, care ascunde dificultile interfeelor de aplicaii Windows, punnd la dispoziie funcii pentru crearea i iniializarea ferestrelor, funcii pentru prelucrarea evenimentelor de intrare i pentru execuia programelor grafice bazate pe biblioteca OpenGL. daca se utilizeaza Visual C++ atunci: ghut.h se copiaza in C:\Program Files\Microsoft Visual Studio\VC98\Include\GL glut32.lib se copiaza in C:\Program Files\Microsoft Visual Studio\VC98\Lib
glut32.dll se copiaza in C:\WINDOWS\system32
n orice aplicaie OpenGL trebuie s fie incluse fiierele header gl.h i glu.h sau glut.h (dac este utilizat biblioteca GLUT). Toate funciile bibliotecii OpenGL ncep cu prefixul gl, funciile GLU ncep cu prefixul glu, iar funciile GLUT ncep cu prefixul glut.
Dezvoltarea programelor grafice folosind utilitarul GLUT
Biblioteca grafic OpenGL conine funcii de redare a primitivelor geometrice independente de sistemul de operare, de orice sistem Windows sau de platforma hardware. Ea nu conine nici o funcie pentru a crea sau administra ferestre de afiare pe display (windows) i nici funcii de citire a evenimentelor de intrare (mouse sau tastatur). Pentru crearea i administarea ferestrelor de afiare i a evenimentelor de intrare se pot aborda mai multe soluii: utilizarea direct a interfeei Windows (Win32 API), folosirea compilatoarelor sub Windows, care conin funcii de acces la ferestre i evenimente sau folosirea altor instrumente (utilitare) care nglobeaz interfaa OpenGL n sistemul de operare respectiv. Un astfel de utilitar este GLUT, care se compileaz i instaleaz pentru
24 fiecare tip de sistem Windows. Header-ul glut.h trebuie s fie inclus n fiierele aplicaiei, iar biblioteca glut.lib trebuie legat (linkat) cu programul de aplicaie. Sub GLUT, orice aplicaie se structureaz folosind mai multe funcii callback. O funcie callback este o funcie care aparine programului aplicaiei i este apelat de un alt program, n acest caz sistemul de operare, la apariia anumitor evenimente. n GLUT sunt predefinite cteva tipuri de funcii callback; acestea sunt scrise n aplicaie i pointerii lor sunt transmii la nregistrare sistemului Windows, care le apeleaz (prin pointerul primit) n momentele necesare ale execuiei.
Funcii de control ale ferestrei de afiare
void glutInit(int* argc, char** argv); Aceast funcie iniializeaz GLUT folosind argumentele din linia de comand; ea trebuie s fie apelat naintea oricror alte funcii GLUT sau OpenGL.
void glutInitDisplayMode(unsigned int mode); Specific caracteristicile de afiare a culorilor i a bufferului de adncime i numrul de buffere de imagine. Parametrul mode se obine prin SAU logic ntre valorile fiecrei opiuni.
Exemplu glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH) iniializeaz afiarea culorilor n modul RGB, cu dou buffere de imagine i buffer de adncime. Alte valori ale parametrului mode sunt: GLUT_SINGLE (un singur buffer de imagine), GLUT_RGBA (modelul RGBA al culorii), GLUT_STENCIL (validare buffer ablon) GLUT_ACCUM (validare buffer de acumulare). void glutInitWindowPosition(int x, int y); Specific locaia iniial pe ecran a colului stnga sus al ferestrei de afiare. void glutInitWindowSize(int width, int heigth); Definete dimensiunea iniial a ferestrei de afiare n numr de pixeli pe lime (width) i nlime (heigth) . int glutCreateWindow(char* string); Creeaz fereastra n care se afieaz contextul de redare OpenGL i returneaz identificatorul ferestrei. Aceast fereastr este afiat numai dup apelul funciei glutMainLoop().
25 Funcii callback.
Funciile callback se definesc n program i se nregistreaz n sistem prin intermediul unor funcii GLUT. Ele sunt apelate de sistemul de operare atunci cnd este necesar, n funcie de evenimentele aprute. a. glutDisplayFunc(void(*Display)(void)); Aceast funcie nregistreaz funcia callback Display n care se calculeaz i se afieaz imaginea. Argumentul funciei este un pointer la o funcie fr argumente care nu returneaz nici o valoare.
Atentie:
Funcia Display (a aplicaiei) este apelat oridecte ori este necesar desenarea ferestrei: la iniializare, la modificarea dimensiunilor ferestrei.
glutReshapeFunc(void(*Reshape)(int w, int h)); nregistreaz funcia callback Reshape care este apelat ori de cte ori se modific dimensiunea ferestrei de afiare. Argumentul este un pointer la funcia cu numele Reshape cu dou argumente de tip ntreg i care nu returneaz nici o valoare. n aceast funcie, programul de aplicaie trebuie s refac transformarea fereastr-poart, dat fiind c fereastra de afiare i-a modificat dimensiunile. glutKeyboardFunc(void(*Keyboard)(unsigned int key, int x, int y); nregistreaz funcia callback Keyboard care este apelat atunci cnd se acioneaz o tast. Parametrul key este codul tastei, iar x i y sunt coordonatele (relativ la fereastra de afiare) a mouse-ului n momentul acionrii tastei. glutMouseFunc(void(*MouseFunc)(unsigned int button, int state, int x, int y); nregistreaz funcia callback MouseFunc care este apelat atunci cnd este apsat sau eliberat un buton al mouse-ului. Parametrul button este codul butonului si poate avea una din constantele GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON sau GLUT_RIGHT_BUTTON) . Parametrul state indic apsarea (GLUT_DOWN) sau eliberarea (GLUT_UP) al unui buton al mouse-ului. Parametrii x i y sunt coordonatele relativ la fereastra de afiare a mouse-ului n momentul evenimentului. Exemplu: void mouse(int buton, int stare, int x, int y) { switch(buton) {
26 case GLUT_LEFT_BUTTON: if(stare == GLUT_DOWN) glutIdleFunc(animatieDisplay); break; case GLUT_RIGHT_BUTTON: if(stare== GLUT_DOWN) glutIdleFunc(NULL); break; } }
Funcii de execuie GLUT
Execuia unui program folosind toolkit-ul GLUT se lanseaz prin apelul funciei glutMainLoop(), dup ce au fost efectuate toate iniializrile i nregistrrile funciilor callback. Aceast bucl de execuie poate fi oprit prin nchiderea ferestrei aplicaiei. n cursul execuiei sunt apelate funciile callback n momentele apariiei diferitelor evenimente. Generarea obiectelor tridimensionale
Multe programe folosesc modele simple de obiecte tridimensionale pentru a ilustra diferite aspecte ale prelucrrilor grafice. GLUT conine cteva funcii care permit redarea unor astfel de obiecte tridimensionale n modul wireframe sau cu suprafee pline (filled). Fiecare obiect este reprezentat ntr-un sistem de referin local, iar dimensiunea lui poate fi transmis ca argument al funciei respective. Poziionarea i orientarea obiectelor n scen se face n programul de aplicaie. Exemple de astfel de funcii sunt: void glutWireCube(GLdouble size); void glutSolidCube(GLdouble size); void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
Programele GLUT au un mod specific de organizare, care provine din felul n care sunt definite i apelate funciile callback.
27 Poarta de afiare OpenGL
Poarta de afiare mai este numit context de redare (rendering context), i este asociat unei ferestre din sistemul Windws. Dac se programeaz folosind biblioteca GLUT, corelarea dintre fereastra Windows i portul OpenGL este asigurat de funcii ale acestei biblioteci. Dac nu se folosete GLUT, atunci funciile bibliotecilor de extensie XGL, WGL sau PGL permit atribuirea unui context de afiare Windows pentru contextul de redare OpenGL i accesul la contextul de afiare Windows (device context). Funcia OpenGL care definete transformarea fereastr-poart este: void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); unde x i y specific poziia colului stnga-jos al dreptunghiului porii n fereastra de afiare (window) i au valorile implicite 0, 0. Parametrii width i heigth specific limea, respectiv nlimea, porii de afiare, dat ca numr de pixeli. Exemplu: glViewport (0, 0, (GLsizei) w, (GLsizei) h); ATENTIE: transformarea ferestr-poart este component a transformrii din sistemul de referin normalizat n sistemul de referin ecran 3D Un pixel este reprezentat n OpenGL printr-un descriptor care definete mai muli parametri: numrul de bii/pixel pentru memorarea culorii numrul de bii/pixel pentru memorarea adncimii numrul de buffere de imagine
Bufferul de imagine (color buffer) n OpenGL poate conine una sau mai multe seciuni, n fiecare fiind memorat culoarea pixelilor din poarta de afiare. Redarea imaginilor folosind un singur buffer de imagine este folosit pentru imagini statice, cel mai frecvent n proiectarea grafic (CAD). n generarea interactiv a imaginilor dinamice, un singur buffer de imagine produce efecte nedorite, care diminueaz mult calitatea imagii generate. Atentie: Orice cadru de imagine ncepe cu tergerea (de fapt, umplerea cu o culoare de fond) a bufferului de imagine. Dup aceasta sunt generai pe rnd pixelii care aparin tuturor elementelor imaginii (linii, puncte, suprafee) i intensitile de culoare ale acestora sunt nscrise n bufferul de imagine. Atentie: Pentru trecerea la cadrul urmtor, trebuie din nou ters bufferul de imagine i reluat generarea elementelor componente, pentru noua imagine. Chiar dac ar fi posibil generarea i nscrierea n buffer a elementelor imaginii cu o vitez foarte mare (ceea ce este greu de realizat), tot ar exista un interval de timp n care bufferul este ters i acest lucru este perceput ca o plpire a imaginii. n grafica interactiv timpul necesar pentru nscrierea datelor n buffer este (n cazul cel mai fericit) foarte apropiat de intervalul de schimbare a unui cadru a imaginii
28 (update rate) i, dac acest proces are loc simultan cu extragerea datelor din buffer i afiarea lor pe display, atunci ecranul va prezenta un timp foarte scurt imaginea complet a fiecrui cadru, iar cea mai mare parte din timp ecranul va fi ters sau va conine imagini pariale ale cadrului. Tehnica universal folosit pentru redarea imaginilor dinamice (care se schimb de la un cadru la altul) este tehnica dublului buffer de imagine. n aceast tehnic exist dou buffere de imagine: bufferul din fa (front), din care este afiat imaginea pe ecran i bufferul din spate (back), n care se nscriu elementele de imagine generate. Cnd imaginea unui cadru a fost complet generat, ea poate fi afiat pe ecran printr-o simpl operaie de comutare ntre buffere: bufferul spate devine buffer fa, i din el urmeaz s fie afiat imagine cadrului curent, iar bufferul fa devine buffer spate i n el urmeaz s fie generat imaginea noului cadru. Comutarea ntre bufferele de imagine se poate sincroniza cu cursa de revenire pe vertical a monitorului i atunci imaginile sunt prezentate continuu, fr s se observe imagini fragmentate sau plpiri. n OpenGL comutarea bufferelor este efectuat de funcia SwapBuffers(). Aceast funcie trebuie s fie apelat la terminarea generrii imaginii tuturor obiectelor vizibile n fiecare cadru. Modul n care se execut comutarea bufferelor depinde de platforma hardware.
Operaiile de baz OpenGL
OpenGL deseneaz primitive geometrice (puncte, linii i poligoane) n diferite moduri selectabile. Primitivele sunt definite printr-un grup de unul sau mai multe vrfuri (vertices). Un vrf definete un punct, captul unei linii sau vrful unui poligon. Fiecare vrf are asociat un set de date: coordonate, culoare, normal, coordonate de textur.
Aceste date sunt prelucrate independent, n ordine i n acelai mod pentru toate primitivele geometrice. Singura deosebire care apare este aceea c, dac o linie sau o suprafa este decupat, atunci grupul de vrfuri care descriau iniial primitiva respectiv este nlocuit cu un alt grup, n care pot apare vrfuri noi rezultate din intersecia laturilor cu planele volumului de decupare (volumul canonic) sau unele vrfuri din cele iniiale pot s dispar. Comenzile sunt prelucrate n ordinea n care au fost primite n OpenGL, adic orice comand este complet executat nainte ca s fie executat o nou comand. Biblioteca OpenGL primete o succesiune de primitive geometrice pe care le deseneaz, adic le convertete n mulimea de pixeli corespunztoare, nscriind valorile culorilor acestora ntr-un buffer de imagine. n continuare sunt
29 detaliate fiecare dintre operaiile grafice prezentate n figur.
Modul n care este executat secvena de operaii pentru redarea primitivelor grafice depinde de starea bibliotecii OpenGL, stare care este definit prin mai multe variabile de stare ale acesteia (parametri). Numrul de variabile de stare ale bibliotecii - OpenGL Reference Manual La iniializare, fiecare variabil de stare este setat la o valoare implicit. O stare o dat setat i menine valoarea neschimbat pn la o nou setare a acesteia. Variabilele de stare au denumiri sub form de constante simbolice care pot fi folosite pentru aflarea valorilor acestora. De exemplu variabile de stare, culoarea curent i normala curent, care denumirile definite n gl.h: #define GL_CURRENT_COLOR 0x0B00 #define GL_CURRENT_NORMAL 0x0B02 Variabilele de stare OpenGL sunt de dou categorii: variabile de tip binar i variabile definite prin diferite structuri de date. Variabile de tip binar pot avea una din dou stri: starea activ (enabled) sau starea inactiv (disabled). Setarea la starea activ se realizeaz prin apelul funciei: void glEnable(GLenum param); unde param este numele simbolic al parametrului (variabilei de stare). Setarea la starea inactiv se realizeaz prin apelul funciei: void glDisable(GLenum param); n orice loc ntr-un program OpenGL, se poate afla valoarea unui parametru binar prin apelul funciei: GLboolean glIsEnabled(GLenum param); care returneaz GL_TRUE dac parametrul param este n starea activ, i GL_FALSE, dac parametrul param este n starea inactiv.
Valoarea unei variabile de stare care nu este de tip binar se seteaz prin apelul unei funcii specifice variabilei respective, care are ca argumente valorile necesare pentru actualizare. De exemplu, variabila de stare culoare curent, denumit GL_CURRENT_COLOR, se seteaz prin funcia: void glColor3f(GLfloat red, GLfloat green, GLfloat blue); la o valoare dat prin trei componente: rou (red), verde (green), albastru (blue).
se obin cele patru componente ale culorii curente (red, green, blue, alpha) n vectorul color. GLfloat color[4]; glGetFloatv(GL_CURRENT_COLOR, color);
30
Primitive geometrice
OpenGL execut secvena de operaii grafice asupra fiecrei primitive geometrice, definit printr-o mulime de vrfuri i tipul acesteia. Coordonatele unui vrf sunt transmise ctre OpenGL prin apelul unei funcii glVertex#(). Aceasta are mai multe variante, dup numrul i tipul argumentelor. Iat, de exemplu, numai cteva din prototipurile funciilor glVertex#():
void glVertex2d(GLdouble x, GLdouble y); void glVertex3d(GLdouble x, GLdouble y, GLdouble z); void glVertex3f(GLfloat x, GLfloat y, GLfloat z);
Vrfurile pot fi specificate n plan, n spaiu ( sau n coordonate omogene), folosind apelul funciei corespunztoare. O primitiv geometric se definete printr-o mulime de vrfuri (care dau descrierea geometric a primitivei) i printr-unul din tipurile prestabilite, care indic topologia, adic modul n care sunt conectate vrfurile ntre ele. Mulimea de vrfuri este delimitat ntre funciile glBegin() i glEnd(). Aceeai mulime de vrfuri (v 0 , v 1 , v 2 ,.v n1 ) poate fi tratat ca puncte izolate, linii, poligon, etc, n funcie de tipul primitivei, care este transmis ca argument al funciei glBegin(): void glBegin(GLenum mode); Exista mai multe tipuri de primitive pe care le putem desena folosind OpenGL.
Tipurile de primitive geometrice
Argument Primitiv geometric GL_POINTS Deseneaz n puncte GL_LINES Deseneaz segmentele de dreapt izolate (v 0 ,v 1 ), (v 2 ,v 3 ), .a.m.d. Dac n este impar ultimul vrf este ignorat GL_LINE_STRIP Deseneaz linia poligonal format din segmentele (v 0 ,v 1 ), (v 1 ,v 2 ), .. . (v n2 , v n 1 ) GL_LINE_LOOP La fel ca primitiva GL_LINE_STRIP, dar se mai desenez segmentul (v n , v 0 ) care nchide o bucl. GL_TRIANGLES Deseneaz o serie de triunghiuri folosind vrfurile (v 0 ,v 1 ,v 2 ), (v 3 ,v 4 ,v 5 ), .a.m.d. Dac n nu este multiplu de 3, atunci ultimele 1
31 sau 2 vrfuri sunt ignorate. GL_TRIANGLE_STRIP Deseneaz o serie de triunghiuri folosind vrfurile (v 0 ,v 1 ,v 2 ), (v 2 ,v 1 ,v 3 ),...a.m.d. Ordinea este aleas astfel ca triunghiurile s aib aceeai orientare, deci s poat forma o suprafa nchis. GL_TRIANGLE_FAN Deseneaz triunghiurile (v 0 ,v 1 ,v 2 ), (v 0 ,v 2 ,v 3 ), .a.m.d. GL_QUADS Deseneaz o serie de patrulatere (v 0 ,v 1 ,v 2 ,v 3 ), (v 4 ,v 5 ,v 6, v 7 ), .a.m.d. Dac n nu este multiplu de 4, ultimele 1, 2 sau 3 vrfuri sunt ignorate. GL_QUADS_STRIP Deseneaz o serie de patrulatere (v 0 ,v 1 ,v 3 ,v 2 ), (v 3 ,v 2 ,v 5, v 4 ), .a.m.d Dac n < 4, nu se desenaz nimic. Dac n este impar, ultimul vrf este ignorat. GL_POLYGON Deseneaz un poligon cu n vrfuri, (v 0 ,v 1 ,v n1 ). Dac poligonul nu este convex, rezultatul este impredictibil.
Primitivele de tip suprafa (triunghiuri, patrulatere, poligoane) pot fi desenate n modul cadru de srm (wireframe), sau n modul plin (fill), prin setarea variabilei de stare GL_POLYGON_MODE folosind funcia: void glPolygonMode(GLenum face, GLenum mode); unde argumentul mode poate lua una din valorile: GL_POINT : se deseneaz numai vrfurile primitivei, ca puncte n spaiu, indiferent de tipul acesteia. GL_LINE: muchiile poligoanelor se deseneaz ca segmente de dreapt. GL_FILL: se deseneaz poligonul plin. Argumentul face se refer la tipul primitivei geometrice (din punct de vedere al orientrii) creia i se aplic modul de redare mode. Din punct de vedere al orientrii, OpenGL admite primitive orientate direct (frontface) i primitive orientate invers (backface). Argumentul face poate lua una din valorile: GL_FRONT, GL_BACK sau GL_FRONT_AND_BACK, pentru a se specifica primitive orientate direct, primitive orientate invers i, respectiv ambele tipuri de primitive. n mod implicit, sunt considerate orientate direct suprafeele ale cror vrfuri sunt parcurse n ordinea invers acelor de ceas. Acest setare se poate modifica prin funcia glFrontFace(GLenum mode), unde mode poate lua valoarea GL_CCW, pentru orientare n sens invers acelor de ceas (counterclockwise) sau GL_CW, pentru orientare n sensul acelor de ceasornic (clockwise).
32 Reprezentarea culorilor n OpenGL
n biblioteca OpenGL sunt definite dou modele de culori: modelul de culori RGBA i modelul de culori indexate. n modelul RGBA sunt memorate componentele de culoare R, G, B i transparena A pentru fiecare primitiv geometric sau pixel al imaginii. n modelul de culori indexate, culoarea primitivelor geometrice sau a pixelilor este reprezentat printr-un index ntr-o tabel de culori (color map), care are memorate pentru fiecare intrare (index) componentele corespunztoare R,G,B,A ale culorii. n modul de culori indexate numrul de culori afiabile simultan este limitat de dimensiunea tabelei culorilor i, n plus, nu se pot efectua unele dintre prelucrrile grafice importante (cum sunt umbrirea, antialiasing, ceaa). De aceea, modelul de culori indexate este folosit n principal n aplicaii de proiectare grafic (CAD) n care este necesar un numr mic de culori i nu se folosesc umbrirea, ceaa, etc. n aplicaiile de realitate virtual nu se poate folosi modelul de culori indexate, de aceea n continuare nu vor mai fi prezentate comenzile sau opiunile care se refer la acest model i toate descrierile consider numai modelul RGBA.
Culoarea care se atribuie unui pixel dintr-o primitiv geometric depinde de mai multe condiii, putnd fi o culoare constant a primitivei, o culoare calculat prin interpolare ntre culorile vrfurilor primitivei, sau o culoare calculat n funcie de iluminare, anti-aliasing i texturare. Presupunnd pentru moment culoarea constant a unei primitive, aceasta se obine prin setarea unei variabile de stare a bibliotecii, variabila de culoare curent (GL_CURRENT_COLOR). Culoarea curent se seteaz folosind una din funciile glColor#(), care are mai multe variante, n funcie de tipul i numrul argumentelor. De exemplu, cteva din prototipurile acestei funcii definite n gl.h sunt:
void glColor3f(GLfloat red, GLfloat green, GLfloat blue); void glColor3ub(GLubyte red,GLubyte green, GLubyte blue); void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); Culoarea se poate specifica prin trei sau patru valori, care corespund componentelor rou (red), verde (green), albastru (blue), respectiv transparen (alpha) ca a patra component pentru funciile cu 4 argumente. Fiecare component a culorii curente este memorat ca un numr n virgul flotant cuprins n intervalul [0,1]. Valorile argumentelor de tip ntreg fr semn (unsigned int, unsigned char, etc.) sunt convertite liniar n numere n virgul flotant, astfel nct valoarea 0 este transformat n 0.0, iar valoarea maxim reprezentabil este transformat n 1.0 (intensitate maxim). Valorile argumentelor de tip ntreg cu semn sunt convertite liniar n numere n virgul
33 flotant, astfel nct valoarea negativ maxim este transformat n 1.0, iar valoarea pozitiv maxim este transformat n 1.0 (intensitate maxim). Valoarea final a culorii unui pixel, rezultat din toate calculele de umbrire, anti- aliasing, texturare, etc, este memorat n bufferul de imagine, o component fiind reprezentat printr-un numr n de bii (nu neaprat acelai numr de bii pentru fiecare component). Deci componentele culorilor pixelilor memorate n bufferul de imagine sunt numere ntreg n intervalul (0 , 2 n 1), care se obin prin conversia numerelor n virgul mobil prin care sunt reprezentate i prelucrate culorile primitivelor geometrice, ale materialelor, etc.
Sistemul de vizualizare OpenGL definete sistemele de referin, transformrile geometrice i relaiile (matriceale) de transformare pentru redarea primitivelor geometrice. Sistemul de vizualizare OpenGL este o particularizare a sistemului PHIGS, n care centrul sistemului de referin de observare (VRP) coincide cu centrul de proiecie (PRP).
Transformri geometrice
Aa dup cum s-a mai artat, nu este eficient s se calculeze produsul dintre matricea de reprezentare a fiecrui punct i matricele de transformri succesive, ci se calculeaz o matrice de transformare compus, care se poate aplica unuia sau mai multor obiecte. Pentru calculul matricelor de transformare compuse (prin produs de matrice) se folosete o matrice de transformare curent i operaii de acumulare n matricea curent prin postmultiplicare (nmulire la dreapta): se nmulete matricea curent cu noua matrice (n aceast ordine) i rezultatul nlocuiete coninutul matricei curente. Pentru nceput, se consider o matrice curent oarecare C stabilit n OpenGL. Matricea curent se poate iniializa cu matricea identitate prin funcia glLoadIdentity(), sau cu o matrice oarecare, dat prin pointer la un vector de 16 valori consecutive, prin funcia glLoadMatrix#():
Valorile din vectorul GLdouble* m (respectiv GLfloat* m) sunt atribuite n ordinea coloan major matricei curente. Coninutul matricei curente poate fi modificat prin multiplicare (la dreapta) cu o alt matrice, dat printr-un vector de 16 valori de tip double sau float utiliznd funcia glMultMatrix#():
Transformarea de translaie cu valorile x, y, z se implementeaz prin apelul uneia din funciile glTranslated() sau glTranslatef(), dup tipul argumentelor de apel:
glTranslated(GLdouble x, GLdouble y, GLdouble z); glTranslatef(GLfloat x, GLfloat y, GLfloat z);
Funcia glTranslate#() creeaz o matrice de translaie T(x,y,z), dat de relaia 3.2, nmulete la dreapta matricea curent C, iar rezultatul nlocuiete coninutul matricei curente C, deci: C = C T(x,y,z).
Transformarea de scalare este efectuat de una din funciile glScaled() sau glScalef():
glScaled(GLdouble x, GLdouble y, GLdouble z); glScalef(GLfloat x, GLfloat y, GLfloat z);
Funcia glScale#() creaz o matrice de scalare S(x,y,z), i o nmulete cu matricea curent, rezultatul fiind depus n matricea curent.
Transformarea de rotaie se definete printr-o direcie de rotaie dat prin vectorul de poziie x,y,z i un unghi angle (specificat n grade). Prototipurile funciilor de rotaie sunt:
glRotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z); glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
Rotaiile n raport cu axele de coordonate sunt cazuri particulare ale funciilor glRotate#(). De exemplu, rotaia cu unghiul angle n raport cu axa x se obine la apelul funciei glRotated(angle,1,0,0) sau glRotatef(angle,1,0,0).
35
Transformrile compuse se efectueaz prin acumularea produsului matricelor componente n matricea curent. De exemplu, transformrile de modelare din Exemplul 3.3 au fost implementate n OpenGL dup cum urmeaz.
Transformarea M 2 = T(0,8,0) S(2,2,2): glTranslated(0,-8,0); glScaled(2,2,2);
Transformarea M 3 = T(8,0,0)R Z (/4)S(2,1,2): glTranslated(8,0,0); glRotated(45,0,0,1); glScaled(2,1,2);
Transformarea M 4 = T(8,0,0)R Z (/4)S(2,1,2): glTranslated(-8,0,0); glRotated(-45,0,0,1); glScaled(2,1,2);
Setarea unei stive curente se face prin apelul funciei void glMatrixMode(GLenum mode); unde argumentul mode poate lua una din constantele simbolice: GL_MODELVIEW, pentru setarea stivei de modelare-vizualizare ca stiv curent GL_PROJECTION, pentru setarea stivei de proiecie ca stiv curent GL_TEXTURE, pentru setarea stivei de texturare ca stiv curent Matricea din vrful stivei curente este matricea curent C, cu care se efectueaz toate operaiile cu matrice(glLoadIdentity(), glLoadMatrix#(), glMultMatrix#(), glTranslate#(), etc). Funcia: void glPushMatrix(); adaug o nou matrice n stiva curent, egal cu matricea din vrful acesteia, care devine noul vrf al stivei (Fig. 6.4). ncrcarea unei noi valori n noua matrice curent se face prin operaii ulterioare de ncrcare sau acumulare prin postmultiplicare. De fapt, aceasta este caracteristica cea mai important a stivelor matricelor de transformri, c operaia push se execut prin dou sau mai multe funcii: glPushMatrix() creaz o nou poziie n capul stivei, identic cu valoarea precedent, i n aceast poziie se continu operaiile de compunere a matricelor prin postmultiplicare.
Funcia: void glPopMatrix(); elimin matricea din vrful stivei curente, iar matricea precedent acesteia devine noua matrice curent. Aceast funcie nu salveaz matricea eliminat (deci ea nu este extras, ca n operaiile pop obinuite), iar dac aceast
36 matrice ar mai fi necesar, ea trebuie s fie copiat n alt zon de memorie, nainte de apelul funciei glPopMatrix(). Matricea de normalizare i proiecie se calculeaz o singur dat i se introduce n vrful stivei matricelor de proiecie. Pentru aceasta, se seteaz ca stiv curent stiva matricelor de proiecie i se iniializeaz matricea din vrful acestei stive cu matricea identitate: glMatrixMode(GL_PROJECTION); glLoadIdentity(); Valoarea matricei de normalizare se seteaz folosind funcia glFrustum(), descris mai sus. Funcia glFrustum() creeaz matricea de normalizare corespunztoare argumentelor de apel, o nmulete cu matricea curent (care are valoarea de matrice identitate), i depune rezultatul n matricea curent, care este matricea din vrful stivel matricelor de proiecie. n acest exemplu se apeleaz: glFrustum(1, 1,1, 1, 1, 40);
Matricele de transformare de modelare i observare se compun n stiva matricelor de modelare-vizualizare. Sistemul de referin de observare are centrul n punctul (xv,zv,yv) i este rotit cu un unghi gama n raport cu axa z. Paii de calcul a matricelor sunt urmtorii: Mai nti se seteaz ca stiv curent stiva de modelare-vizualizare i se iniilalizeaz matricea din vrful acesteia cu matricea identitate: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Se creez n stiva curent matricea de transformare de observare M V = R Z (gama)T(xv, yv, zv): glRotated(-gama, 0,0,1); glTranslated(-xv,-zv,-zv); Primul obiect are matricea de instaniere M I1 = I, deci matricea curent (care conine matricea de vizualizare) se aplic coordonatelor vrfurilor cubului din sistemul de referin de modelare. Funcia Cube() transmite aceste vrfuri ctre OpenGL: Cube(); Dac s-ar construi n acest moment matricea de transformare pentru obiectul al doilea, prin multiplicarea matricei curente cu matricele componente de instaniere din M 2 = T(0,8,0) S(2,2,2), atunci matricea de observare, s-ar pierde i pentru urmtorul obiect ar trebui calculat din nou. Definirea texturilor
n OpenGL se pot defini mai multe texturi (n general, la iniializarea programului) i fiecare suprafa se textureaz folosind una dintre acestea. Fiecare textur (obiect textur - texture object) are un nume unic n program i este definit printr-un set de date care permit aplicarea acesteia suprafeelor: adresa imaginii texturii, funcia texturii (modulare, nlocuire, combinare), i proprietile texturii (filtrri, mod de repetare, etc).
37 Posibilitatea de a manevra mai multe texturi n timpul execuiei, fr s fie necesar ncrcarea sau generarea imaginii texturii de fiecare dat, mbuntete performanele de texturare. Deoarece OpenGL este o interfa de programare scris n limbajul C, obiectele textur sunt definite prin date i funcii separate, care trebuie s fie specificate ntr-o anumit ordine: (a) Generarea numelor texturilor. (b) Crearea obiectelor textur i conectarea lor (bind) la numele texturilor. (c) Activarea unei texturi, pentru aplicarea acesteia primitivelor geometrice care urmeaz.
Numele texturii. Numele texturilor sunt numere ntregi fr semn (de tipul GLuint) care sunt memorate ntr-un vector transmis ca argument funciei: void glGenTextures(GLsizei n, GLuint *textureNames); Aceast funcie creeaz un vector de n nume de texturi, unice n program, pe care le memoreaz n vectorul textureNames. Numele create nu sunt neaprat numere succesive. Funcia glGenTextures() creeaz numai numele texturilor i le marcheaz ca utilizate, dar obiectele textur se creeaz numai la conectarea (bind) acestora.
Crearea texturilor. Funcia glBindTexture() se folosete att pentru crearea ct i pentru utilizarea unei texturi. Prototipul ei este: void glBindTexture(GLenum target, GLuint texName); Parametrul target poate avea ca valoare una din constantele simbolice GL_TEXTURE_1D sau GL_TEXTURE_2D, pentru texturi unidimensionale, respectiv bidimensionale. Argumentul texName este numele unei texturi, generat de funcia glGenTextures() i memorat n vectorul de nume ale texturilor. Atunci cnd este apelat prima oar pentru un nume de textur, funcia glBindTexture() creeaz un nou obiect textur, cu toate datele referitoare la imaginea i proprietile texturii implicite. Dup apelul funciei glBindTexture(), textura cu numele dat ca argument devine textur curent i toate operaiile ulterioare, att pentru definirea unor proprieti ale texturii, ct i pentru aplicaia texturii, folosesc textura curent. Textura curent se schimb prin apelul unei noi funcii glBindTexture().
Crearea imaginii de textur. Imaginea texturii este un tablou unidimensional sau bidimensional de texeli, fiecare texel avnd una, dou, trei sau patru componente. Semnificaia componentelor texelilor se stabilete la crearea imaginii texturii prin definirea formatului intern al imaginii printr-un argument al uneia din funciile glTexImage1D(), glTexImage2D(). Texturile unidimensionale au o utilizare restrns. Ele sunt folosite pentru texturarea n benzi, pentru care variaia culorii are o singur direcie. n continuare se vor prezenta texturile bidimensionale, care sunt cel mai frecvent
38 folosite. Funcia glTexImage2D() are urmtorul prototip:
Parametrul target specific crearea unei imagini de textur bidimensional (prin constanta simbolic GL_TEXTURE_2D) sau o interogare a capacitii de memorare a unei imagini de textur (prin constanta simbolic GL_PROXY_TEXTURE_2D). Parametrul level indic nivelul imaginii ntr-o succesiune de imagini prefiltrate de tipul mip-map. Nivelul 0 reprezint imaginea original, cu rezoluia maxim. Celelate nivele se pot crea automat din imaginea original (prin funcia gluBuild2DMipmaps()) sau pot fi create din tablouri de texeli, cu acelai format ca imaginea de nivel 0 a texturii. Parametrul internalFormat indic tipul componentelor texelilor texturii, ca intensitate, luminan sau R, G, B, A. Valoarea argumentului internalFormat poate fi un ntreg ntre 1 i 4 sau una dintre treizeci i dou de constante simbolice, dintre care cele mai frecvent folosite sunt: GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA. Aceste constante corespund valorilor 1, 2, 3, 4 ale argumentului. Aceste componente ale texelilor sunt combinate cu componentele culorii proprii (nainte de texturare) a pixelului pentru a crea culoarea final a pixelului. Modul de combinare depinde de funcia de texturare, descris imediat mai jos. Parametrii width i height dau dimensiunea imaginii texturii, n numr de texeli, pe orizontal i pe vertical. Parametrul border reprezint limea borderului imaginii de textur. Aceast caracteristic permite alipirea mai multor poriuni de imagini ntr-o singur imagine de textur, iar borderul este folosit n operaiile de filtrare, n care sunt necesari texeli vecini texelului curent, pentru medierea culorilor acestora. Devizarea unei imagini de textur n mai multe pri este impus n anumite implementri ale bibliotecii OpenGL, atunci cnd texturarea este implementat hardware i imaginea de textur se ncarc ntr-o memorie rapid din acceleratorul grafic. Dac imaginea texturii este prea mare pentru a fi stocat n ntregime n memoria de textur, atunci se poate mpri n mai multe pri, care sunt ncrcate i folosite succesiv. n aceast situaie borderul permite filtrarea corect la graniele prilor componente ale imaginii. Parametrii format i type se refer la formatul i tipul datelor imaginii de textur. Parametrul format poate fi una din constantele simbolice GL_COLOR_INDEX, GL_RGB, GL_RGBA, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA. Parametrul type poate fi GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT sau GL_BITMAP.
39 Ultimul parametru, pixels, conine datele imaginii de texturii. La apelul funciei glTexImage2D(), se creeaz imaginea texturii curente (cea conectat prin funcia glBindTexture()) , n formatul specificat.
Funcii de texturare. Modul n care se calculeaz culoarea unui pixel (sau fragment de pixel) se stabilete prin apelul uneia din funciile glTexEnv#():
unde argumentele au urmtoarea semnificaie: target specific mediul (environment) de aplicare a texturii; trebuie s fie constanta simbolic GL_TEXTURE_ENV. pname este numele simbolic al unui paramentru de mediu de texturare; trebuie s aib valoarea GL_TEXTURE_ENV_MODE. param specific funcia de texturare printr-o constant simbolic care poate lua una din valorile GL_MODULATE, GL_DECAL, or GL_BLEND.
Funciile de texturare stabilesc modul de calcul al culorii rezultate a pixelilor pe baza culorii texelilor din imaginea de textur i a culorii pixelilor primitivei geometrice (care se obin din culoarea curect sau din calcule de umbrire). n general, n modul GL_DECAL, culoarea final atribuit unui pixel este culoarea texturii; n modul GL_MODULATE, se folosete culoarea texturii pentru modularea culorii fragmentului (pixelului); n modul GL_BLEND se combin culoarea texturii cu culoarea fragmentului. Aceast modalitate general de atribuire a culorii depinde i de formatul intern al texturii, care se stabilete la crearea imaginii de textur.
Atribuirea coordonatelor de texturare. Coordonatele vrfurilor primitivelor geometrice n planul texturii (coordonatele de texturare) se transmit prin funciile glTexCoord#(), care pot primi 1, 2, 3 sau 4 argumente de diferite tipuri, rezultnd un numr mare de posibiliti de apel. O parte dintre acestea sunt:
40 void glTexCoord3f(GLdouble s,GLdouble t,GLdouble r); void glTexCoord4f(GLdouble s,GLdouble t,GLdouble r, GLdouble q); Coordonatele de texturare pot avea 1, 2 sau 3 pentru texturi unidimensionale, bidimensionale sau tridimensionale. n spaiul texturii coordonatele sunt notate s, t, r, corspunztor coordonatelor x, y, z n spaiul obiect. Cea de-a patra component, q, este componenta de scal n reprezentarea texturii ntr-un sistem de coordonate omogen, asemntor sistemului de coordonate omogen folosit pentru reprezentarea punctelor n spaiu. Aceast coordonat este folosit dac sunt necesare transformri ale texturi n coordonate omogene. n versiunea folosit n momentul de fa a bibliotecii OpenGL (Versiunea 1.1), nu este nc implementat texturarea spaial i coordonata r nu este folosit, fiind prevzut ca rezerv pentru utilizare ulterioar. Dac valorile coordonatelor de texturare n vrfurile primitivelor grafice sunt cuprinse n intervalul [0,1], atunci textura este aplicat o singur dat pe suprafaa respectiv. Dac aceste valori depesc intervalul [0,1], atunci textura poate fi repetat pe suprafa sau limitat la intervalul [0,1]. Proprietatea unei texturi de a fi repetat sau limitat se stabilete prin apelul uneia din funciile: void glTexParameterf(GLenum target,GLenum pname, GLfloat param); void glTexParameteri(GLenum target,GLenum pname, GLint param);
n aceste funcii, parametrul target reprezint tipul texturii i poate lua una din constantele simbolice GL_TEXTURE_1D sau GL_TEXTURE_2D. Parametrul pname specific numele simbolic al unei proprieti a texturii. i poate lua una din constantele: GL_TEXTURE_MIN_FILTER, GL_TEXTURE_MAX_FILTER, GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T. Primele dou valori se refer la opiunile de filtrare ale texturii i vor fi prezentate n paragraful urmtor. Urmtoarele valori, seteaz proprietatea de repetare a texturii pentru coordonata s, respectiv t. n acest caz, parametrul param poate fi GL_REPEAT, pentru repetarea texturii, sau GL_CLAMP, pentru limitarea texturii la intervalul [0,1]. Mai multe aspecte privind definirea i folosirea texturilor n OpenGL vor fi detaliate n exemplele care urmeaz.
Drawing Circles with OpenGL voi d dr awCi r cl e( f l oat Radi us, i nt numPoi nt s ) { gl Begi n( GL_LI NE_STRI P ) ; f or ( i nt i =0; i <numPoi nt s; i ++ ) { f l oat Angl e = i * ( 2. 0*PI / numPoi nt s) ; / / use 360 i nst ead of 2. 0*PI i f f l oat X = cos( Angl e ) *Radi us; / / you use d_cos and d_si n f l oat Y = si n( Angl e ) *Radi us; gl Ver t ex2f ( X, Y ) ; } gl End( ) ; }
67 glEnd();//sfisit desenare glFlush ();//executare functie glColor3f (0.0, 1.0, 1.0);//culoarea de desenare glBegin(GL_POLYGON);//initializare desen poligon glVertex2f(400.0,400.0); //stabilire coordonate triunghi glVertex2f(600.0,400.0);//stabilire coordonate triunghi glVertex2f(600.0,600.0);//stabilire coordonate triunghi glEnd();//sfisit desenare glFlush ();//executare functie glColor3f (3.0, 0.0, 0.0);//culoarea de desenare glBegin(GL_POLYGON);//initializare desen poligon glVertex2f(400.0,600.0); //stabilire coordonate triunghi glVertex2f(400.0,400.0);//stabilire coordonate triunghi glVertex2f(600.0,600.0);//stabilire coordonate triunghi glEnd();//sfisit desenare glFlush ();//executare functie } void reshape (int w, int h)//functia redesenare { glViewport (0, 0, (GLsizei) w, (GLsizei) h);//stabilirea viewportului la dimensiunea ferestrei glMatrixMode (GL_PROJECTION);//specificare matrice modificabila la valoare argumentului de modificare glLoadIdentity ();//initializarea sistemului de coordonate gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);//stabileste volumul de vedere folosind o proiectie ortografica } int main(int argc, char** argv) //creare fereastra { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);//se specifica modelul de culoare al ferestrei: un singur buffer si culoare RGB glutInitWindowSize (600, 600);//initiaza dimensiunea ferestrei principale 600x600 pixeli glutInitWindowPosition (200,10);//initiaza in fereastra principala fereastra de afisare glutCreateWindow ("TRIUNGHIURI"); init (); glutDisplayFunc(display);//se reimprospateza continutul ferestrei glutReshapeFunc(reshape);//functia redesenare glutMainLoop();//bucla de procesare a evenimentelor return 0; } exemplu 38 #include <GL/glut.h> #include <stdlib.h> #include <math.h> void init() { // Stabileste culoarea cu care se va curata interiorul ferestrei, prin parametrii dati stabilindu-se // componenetele culorii ce au valori reale de la 0.0 la 1.0 (cu pasi aproximativi de 0.00006). glClearColor (0.0, 0.0, 0.0, 0.0); // select flat or smooth shading. glShadeModel (GL_FLAT); } void display() { // Sterge eventualele desene din fereastra curenta glClear (GL_COLOR_BUFFER_BIT); // stabileste culoarea (RGB)
68 glColor3f (1.0, 0.0, 0.0); // Specifies the primitive or primitives that will be created from vertices presented between // glBegin and the subsequent glEnd. Ten symbolic constants are accepted: GL_POINTS, GL_LINES, // GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, // GL_QUAD_STRIP, and GL_POLYGON. glBegin(GL_POLYGON); // specify a vertex (x, y coord) glVertex2f(200.0,200.0); glVertex2f(400.0,200.0); glVertex2f(400.0, 400.0); // glBegin and glEnd delimit the vertices that define a primitive or a group of like primitives. // glBegin accepts a single argument that specifies in which of ten ways the vertices are interpreted. glEnd(); // force execution of GL commands in finite time glFlush(); // dreptunghi jos glColor3f (0.0, 1.0, 0.0); glBegin(GL_POLYGON); glVertex2f(0.0,0.0); glVertex2f(50.0,0.0); glVertex2f(50.0, 60.0); glVertex2f(0.0, 60.0); glEnd(); glFlush(); // patrat sus glColor3f (0.0, 0.0, 1.0); glBegin(GL_POLYGON); glVertex2f(0.0,500.0); glVertex2f(100.0,500.0); glVertex2f(100.0, 600.0); glVertex2f(0.0, 600.0); glEnd(); glFlush(); // cerc in jurul triunghiului glColor3f (1, 1, 0); glPointSize(10.0); glBegin(GL_POINTS); glVertex2f(300, 300); // un punct in centru for (int i=0; i<360; ++i) { // 141 = raza cercului + 1 pixel glVertex2f(300 + sin(i) * 141, 300 + cos(i) * 141); } glEnd(); glFlush(); } void reshape (int w, int h) { // Stabilirea viewportului la dimensiunea ferestrei glViewport (0, 0, (GLsizei) w, (GLsizei) h);
69 // specify which matrix is the current matrix glMatrixMode (GL_PROJECTION); // replace the current matrix with the identity matrix glLoadIdentity (); gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // seteaza dimensiunea ferestrei glutInitWindowSize (600, 600); // seteaza pozitia initiala glutInitWindowPosition (100,100); glutCreateWindow ("TESTE"); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
70 MODEL BILET 1
1. Caracterizati grafica digital (2 pct). 2. Caracterizati grafica vectorial (2 pct). 3. Explicati modelele de culori RGB si CMYK (2 pct). 4. Sa se explice fiecare functie OpenGl utilizata in programul urmator (1.5 pct).
5. Explicati ce rezulta in urma testarii setului de comenzi (2 pct). 1. #include <GL/glut.h> 2. #include <stdlib.h> 3. #include <math.h>
4. void Display(void) a. { b. glClear(GL_COLOR_BU FFER_BIT);
c. glBegin(GL_LINES); d. for(int i=0;i<100;++i) i. { ii. glVertex3f(0,0,0); iii. glVertex3f(1- i/100.0,i/100.0,0); iv. } e. glEnd();
f. glFlush(); g. }
5. int main(void) a. { b. glutCreateWindow("mode l"); c. glutDisplayFunc(Display); d. glColor3f(1,1,0); e. glutMainLoop(); f. return 0; g. }
72 n dorina de ridicare continu a standardelor desfurrii activitatilor dumneavoastra, va rugm s completai acest chestionar i s-l transmitei indrumatorului de an.
Disciplina: ________________________ Unitatea de invatare/modulul:__________________ Anul/grupa:__________________________ Tutore:_________________________
Partea I . Coninut
1. Care dintre subiectele tratate in aceasta unitate/modul considerai c este cel mai util i eficient? Argumentati raspunsul.
2. Ce aplicatii/proiecte din activitatea dumneavoastra dorii s imbunatatiti/modificai/implementai n viitor n urma cunotinelor acumulate n cadrul acestei unitati de invatare/modul?
3. Ce subiecte considerai c au lipsit din acesta unitate de invatare/modul?
73 4. La care aplicatii practice ati intampinat dificultati in realizare? Care credeti ca este motivul dificultatilor intalnite?
5. Timpul alocat acestui modul a fost suficient?
6. Daca ar fi sa va evaluati cunostintele acumulate din parcurgerea unitatii de invatare/modului, care este nota pe care v-o alocati, pe o scala de la 1-10?. Argumentati.
Partea II. Impresii generale
1. Acest modul a ntrunit ateptrile dumneavoastr?
2) Avei sugestii care s conduc la creterea calitii acestei unitati de invatare/modul?
3) Avei propuneri pentru alte unitati de invatare?Argumentati.
V mulumim pentru feedback-ul dumneavoastr! n totalitate n mare msur n mic msur Nu