You are on page 1of 69

UNIVRSITATEA TITU MAIORESCU

FACULTATEA DE INFORMATICA

GRAFICA PE CALCULATOR

Mironela Prnu

2014-2015

Acest material este destinat studentilor anului II, invatamant la distant,


specializarea Informatic.

Nota final acordata fiecrui student, va conine


urmtoarele componente n procentele
menionate:
- proba scrisa
- realizare referat

60%
40%

Fiecare student va realiza un referat de maxim 6


pagini, despre unul din subiectele tratate in curs. De
asemenea se vor realiza minim 5 programe
asemanatoare cu cele tratate in suportul de curs.
Toate functiile utilizate vor fi explicate ca rol si
parametrii.
Referatul si fisierele C vor fi transmise cel mai tarziu
cu 2 zile inainte de proba de verificare, pe adresa de
email mironela.pirnau@prof.utm.ro.

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
3

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).

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,
5

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-verdealbastru) 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.
6

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.
7

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.
8

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.
9

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.

10

Un exemplu comun de Sistem Informatic Geografic l reprezent Sistemele de


Navigaie. Harta rutier n form vectorial este georefereniat astfel nct
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)
11

Canalele (Channels)
Retuarea
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 ntruna 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.
12

Vanishing Point: Ofer posibilitatea de a clona, picta sau lipi elemente ce


automat se transpun n perspectiva obiectelor din imagine.
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 APIuri 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.
13

- Un singur punct de intrare, cum ar fi o metoda, o functie sau o


procedura.
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.
14

In sisteme de operare Windows este disponibil un Software Development


Kit (SDK), care ofera documentatia si unelte pentru a permite
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 closedsource (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).
15

Interfetele API din DirectX


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 APIuri 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
16

jocurilor. Cu timpul, dupa ce puterea placilor video au crescut, OpenGL a


devenit standard si conducatorul pietei. In acel punct a inceput "batalia"
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.
17

DirectPlay este defavorizat si inlocuit cu Games for Windows - LIVE, in timp


ce DirectShow este defavorizat si inlocuit cu Media Foundation, un set
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).

18

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.

19

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
20

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().
21

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)
{
22

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.

23

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
24

(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
25

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);
26

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 (v0, v1, v2,.vn1) 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
GL_POINTS
GL_LINES

GL_LINE_STRIP

GL_LINE_LOOP

GL_TRIANGLES

Primitiv geometric
Deseneaz n puncte
Deseneaz segmentele de dreapt izolate
(v0,v1), (v2,v3), .a.m.d. Dac n este impar
ultimul vrf este ignorat
Deseneaz linia poligonal format din
segmentele (v0,v1), (v1,v2), .. . (vn2, v n
1)
La fel ca primitiva GL_LINE_STRIP, dar se
mai desenez segmentul (vn, v0) care
nchide o bucl.
Deseneaz o serie de triunghiuri folosind
vrfurile (v0,v1,v2), (v3,v4,v5), .a.m.d. Dac
n nu este multiplu de 3, atunci ultimele 1
27

GL_TRIANGLE_STRIP

GL_TRIANGLE_FAN
GL_QUADS

GL_QUADS_STRIP

GL_POLYGON

sau 2 vrfuri sunt ignorate.


Deseneaz o serie de triunghiuri folosind
vrfurile (v0,v1,v2), (v2,v1,v3),...a.m.d.
Ordinea este aleas astfel ca triunghiurile s
aib aceeai orientare, deci s poat forma o
suprafa nchis.
Deseneaz triunghiurile (v0,v1,v2), (v0,v2,v3),
.a.m.d.
Deseneaz o serie de patrulatere
(v0,v1,v2,v3), (v4,v5,v6,v7), .a.m.d. Dac n
nu este multiplu de 4, ultimele 1, 2 sau 3
vrfuri sunt ignorate.
Deseneaz o serie de patrulatere
(v0,v1,v3,v2), (v3,v2,v5,v4), .a.m.d Dac n <
4, nu se desenaz nimic. Dac n este impar,
ultimul vrf este ignorat.
Deseneaz un poligon cu n vrfuri,
(v0,v1,vn1). 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).
28

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
29

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, antialiasing, 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 , 2n 1), care se obin
prin conversia numerelor n virgul mobil prin care sunt reprezentate i
prelucrate culorile primitivelor geometrice, ale materialelor, etc.

glColor3f(0.8,0.8,0.8);
glBegin(GL_POLYGON);
glVertex3d(-4,2,-20);
glVertex3d(-1,5,-20);
glVertex3d(5,2.5,-20);
glVertex3d(3,-3,-20);
glVertex3d(-1,-4,-20);
glEnd();
Sistemul de vizualizare OpenGL
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#():
30

glLoadMatrixd(const GLdouble* m);


glLoadMatrixf(const GLfloat* m);
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#():
glMultMatrixd(const GLdouble* m);
glMultMatrixf(const GLfloat* m);
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).
31

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 M2 = T(0,8,0) S(2,2,2):
glTranslated(0,-8,0);
glScaled(2,2,2);
Transformarea M3 = T(8,0,0)RZ(/4)S(2,1,2):
glTranslated(8,0,0);
glRotated(45,0,0,1);
glScaled(2,1,2);
Transformarea M4 = T(8,0,0)RZ(/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
32

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
MV = RZ(gama)T(xv, yv, zv):
glRotated(-gama, 0,0,1);
glTranslated(-xv,-zv,-zv);
Primul obiect are matricea de instaniere MI1 = 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 M2 = 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).
33

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
34

folosite. Funcia glTexImage2D() are urmtorul prototip:


void glTexImage2D(GLenum target,GLint level,
GLint internalFormat,GLsizei width,
GLsizei height,GLint border,
GLenum format,GLenum type,const GLvoid *pixels);
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.
35

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#():
void glTexEnvf(GLenum target,GLenum pname,GLfloat param);
void glTexEnvi(GLenum target,GLenum pname,GLfloat param);
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:
void glTexCoord1f(GLfloat s);
void glTexCoord2f(GLfloat s,GLfloat t);
void glTexCoord3f(GLfloat s,GLfloat t,GLfloat r);
void glTexCoord4f(GLfloat s,GLfloat t,GLfloat r, GLfloat q);
void glTexCoord1f(GLdouble s);
void glTexCoord2f(GLdouble s,GLdouble t);
36

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.
exemplu folosind textura
#include <GL/glut.h>
#define imageWidth 64
#define imageHeight 64
static GLubyte image4[imageHeight][imageWidth][4];
static GLubyte image8[imageHeight][imageWidth][4];
static GLuint texName[2];
void Makeimages(){
int c;
for (int i=0;i<imageHeight;i++){
37

for (int j=0;j<imageWidth;j++){


c = (((i&0x4)==0)^((j&0x4)==0)) *255;
image4[i][j][0] = (GLubyte) c;
image4[i][j][1] = (GLubyte) c;
image4[i][j][2] = (GLubyte) c;
image4[i][j][3] = (GLubyte) 255;
c = (((i&0x8)==0)^((j&0x8)==0)) *255;
image8[i][j][0] = (GLubyte) c;
image8[i][j][1] = (GLubyte) c;
image8[i][j][2] = (GLubyte) c;
image8[i][j][3] = (GLubyte) 255;
}
}
}
void Init(void){
glClearColor(0.6, 0.6, 0.6, 1.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
/* TEXTURARE */
Makeimages();
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(2, texName); // se creaza doua texturi
/* Definirea primei texturi */
glBindTexture(GL_TEXTURE_2D,texName[0]);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,imageWidth,
imageHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,image4);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,
GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,
GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
/* Definirea celui de-a doua texturi */
glBindTexture(GL_TEXTURE_2D, texName[1]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imageWidth,
imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,image8);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_DECAL);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,
GL_REPEAT);
38

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,
GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glEnable(GL_TEXTURE_2D);
}
void Display(){
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, texName[1]);
glPushMatrix();
glTranslated(-2.0,0.0,-8);
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-0.5,-1.0,0.0);
glTexCoord2f(0.5,0.0);glVertex3f( 0.5,-1.0,0.0);
glTexCoord2f(0.5,1.0);glVertex3f( 0.5, 1.0,0.0);
glTexCoord2f(0.0,1.0);glVertex3f(-0.5, 1.0,0.0);
glEnd();
glPopMatrix();
glPushMatrix();
glTranslated(0.0,0.0,-8);
glRotated(-70,1.0,0.0,0.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(-0.5,-1.0,0.0);
glTexCoord2f(0.5,0.0);glVertex3f( 0.5,-1.0,0.0);
glTexCoord2f(0.5,1.0);glVertex3f( 0.5, 1.0,0.0);
glTexCoord2f(0.0,1.0);glVertex3f(-0.5, 1.0,0.0);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, texName[0]);
glPushMatrix();
glTranslated(1.5,0.0,-8);
glBegin(GL_QUADS);
glTexCoord2f(0.5,0.0);glVertex3f(0.0,-1.0,0.0);
glTexCoord2f(1.0,0.0);glVertex3f( 1.0,-1.0,0.0);
glTexCoord2f(1.0,1.0);glVertex3f( 1.0, 1.0,0.0);
glTexCoord2f(0.5,0.5);glVertex3f(-0.0, 0.0,0.0);
glEnd();
glPopMatrix();
39

glutSwapBuffers();
}
void Reshape(int w, int h){
h = (h == 0) ? 1 : h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (GLfloat) w/(GLfloat) h,
0.1, 4000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("Texture Check Image");
Init();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}

40

Exemple OpenGl
Exemplu 1

Exemplu 2

41

Exemplu 3

Exemplu 4

42

Exemplu 5

Exemplu 6

43

Exemplu 7

Exemplu 8

44

Exemplu 9

Exemplu 10

45

Exemplu 11

46

Exemplu 12

Exemplu 13

47

Exemplu 14

Exemplu 15

48

Exemplu 16

Exemplu 17

49

Exemplu 18

Exemplu 19

50

Exemplu 20

51

Exemplu 21

52

Exemplu 22

Exemplu 23
53

Exemplu 24

54

Exemplu 25

55

Exemplu 26

Exemplu 27
56

Exemplu 28

Exemplu 29
57

Exemplu 30

Exemplu 31
58

Exemplu 32
59

Drawing Circles with OpenGL


void drawCircle( float Radius, int numPoints )
{
glBegin( GL_LINE_STRIP );
for( int i=0; i<numPoints; i++ )
{
float Angle = i * (2.0*PI/numPoints); // use 360 instead of 2.0*PI if
float X = cos( Angle )*Radius; // you use d_cos and d_sin
float Y = sin( Angle )*Radius;
glVertex2f( X, Y );
}
glEnd();
}

60

Exemplu 33

61

Exemplu 34

62

Exemplu 35

63

exemplu 37
#include <GL/glut.h> //header OpenGL ce include gl.h si glu.h
void init()//functia initiere
{
// glClearColor (0.0, 0.0, 0.0, 0.0);//stabileste culoarea de sters
// glShadeModel (GL_FLAT);
}
void display()//functia de desenare si afisare
{
glClear (GL_COLOR_BUFFER_BIT);//sterge urmele de desene din fereastra curenta
glBegin(GL_POLYGON);//initializare desen poligon
glColor3f (2.0, 0.0, 0.0);//culoarea de desenare
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glVertex2f(400.0,200.0);//stabilire coordonate triunghi
glVertex2f(400.0,400.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (1.0, 1.0, 0.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(200.0,400.0);//stabilire coordonate triunghi
glVertex2f(400.0,400.0);//stabilire coordonate triunghi
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (0.0, 1.0, 1.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(000.0,000.0); //stabilire coordonate triunghi
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glVertex2f(000.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (1.0, 0.5, 1.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(000.0,000.0); //stabilire coordonate triunghi
glVertex2f(200.0,200.0);//stabilire coordonate triunghi
glVertex2f(000.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (1.0, 1.0, 0.5);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(600.0,000.0); //stabilire coordonate triunghi
glVertex2f(600.0,200.0);//stabilire coordonate triunghi
glVertex2f(400.0,200.0);//stabilire coordonate triunghi
glEnd();//sfisit desenare
glFlush ();//executare functie
glColor3f (0.0, 1.0, 0.0);//culoarea de desenare
glBegin(GL_POLYGON);//initializare desen poligon
glVertex2f(200.0,400.0);//stabilire coordonate triunghi
glVertex2f(000.0,400.0);//stabilire coordonate triunghi
glVertex2f(200.0,600.0);//stabilire coordonate triunghi
64

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)
65

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);
66

// 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;
}

67

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).

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

19.
{
20.
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
21.
glMatrixMode (GL_PROJECTION);
22.
glLoadIdentity ();
23.
gluOrtho2D (0.0, (GLdouble) w, 0.0,
(GLdouble) h);
24.
}
25.
int main(int argc, char** argv)
26.
{
27.
glutInit(&argc, argv);
28.
glutInitDisplayMode (GLUT_SINGLE |
GLUT_RGB);
29.
glutInitWindowSize (600, 600);
30.
glutInitWindowPosition (100,100);
31.
glutCreateWindow (argv[0]);
32.
init ();
33.
glutDisplayFunc(display);
34.
glutReshapeFunc(reshape);
35.
glutMainLoop();
36.
return 0;
37.
}

#include <GL/glut.h>
void init()
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
void display()
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex2f(200.0,200.0);
glVertex2f(400.0,200.0);
glVertex2f(400.0, 400.0);
glEnd();
glFlush ();
}
void reshape (int w, int h)

5. Sa se scrie setul de comenzi (utilizand OpenGl) care, in urma executiei, vor conduce la
fereastra din figura alaturata (1.5 pct).

68

Model bilet 2
1. Prezentati cel putin 4 idei principale din referatul intocmit (2 pct).
2. Caracterizati grafica vectorial (2 pct).
3. Explicati modelele de culori RGB si CMYK (1 pct).
4. Sa se explice fiecare functie OpenGl utilizata in programul urmator (2 pct).
1.
#include <GL/glut.h>
2.
void init()
3.
{
4.
glClearColor (0.0, 0.0, 0.0, 0.0);
5.
glShadeModel (GL_FLAT);
6.
}
7.
void display()
8.
{
9.
glClear
(GL_COLOR_BUFFER_BIT);
10.
glColor3f (1.0, 0.0, 0.0);
11.
glBegin(GL_POLYGON);
12.
glVertex2f(200.0,200.0);
13.
glVertex2f(400.0,200.0);
14.
glVertex2f(400.0, 400.0);
15.
glEnd();
16.
glFlush ();
17.
}
18.
void reshape (int w, int h)
19.
{
20.
glViewport (0, 0, (GLsizei) w,
(GLsizei) h);

21.
glMatrixMode
(GL_PROJECTION);
22.
glLoadIdentity ();
23.
gluOrtho2D (0.0, (GLdouble) w,
0.0, (GLdouble) h);
24.
}
25.
int main(int argc, char** argv)
26.
{
27.
glutInit(&argc, argv);
28.
glutInitDisplayMode
(GLUT_SINGLE | GLUT_RGB);
29.
glutInitWindowSize (600, 600);
30.
glutInitWindowPosition
(100,100);
31.
glutCreateWindow (argv[0]);
32.
init ();
33.
glutDisplayFunc(display);
34.
glutReshapeFunc(reshape);
35.
glutMainLoop();
36.
return 0;
37.
}

5. Explicati ce rezulta in urma testarii setului de comenzi (2 pct).


1.
#include <GL/glut.h>
iv. }
2.
#include <stdlib.h>
e. glEnd();
3.
#include <math.h>
f. glFlush();
4.
void Display(void)
g. }
a. {
b. glClear(GL_COLOR_BU
5.
int main(void)
FFER_BIT);
a. {
b. glutCreateWindow("mode
c. glBegin(GL_LINES);
l");
d. for(int i=0;i<100;++i)
c. glutDisplayFunc(Display);
i. {
d. glColor3f(1,1,0);
ii. glVertex3f(0,0,0);
e. glutMainLoop();
iii. glVertex3f(1f. return 0;
i/100.0,i/100.0,0);
g. }

69

You might also like