Sunteți pe pagina 1din 35

Programarea aplicaiilor

grafice
Biblioteca 3D OpenGL
Interfa software cu hardware-ul grafic
Coninutul laboratoarelor
Introducere general n programarea OpenGL
O privire de ansamblu asupra OpenGL i GLUT
Redarea elementar
Transformri
Ascunderea suprafeelor
Iluminarea
Curbe i suprafee curbe
Decuparea i liste de display
Maparea texturilor
Animaia cu dublu buffer
O privire de ansamblu asupra
OpenGL i GLUT

O privire de ansamblu asupra OpenGL i
GLUT
Ce este OpenGL
Arhitectura OpenGL
OpenGL ca un renderer
API nrudite
Ce este OPenGL?
API pentru redarea graficii
imagini colori de calitate ridicat compuse din
primitive geometrice i primitive imagine
Independent de sistemul de ferestre
independent de sistemul de operare
Arhitectura OpenGL
Evaluator
polinomial
Operaii pe
vrfurilor

Asamblarea
primitivelor
Liste de
display
Raste-
rizare
Operaii
pe
fragment
Frame-
buffer
Memorare
textur
Opearaii
cu pixeli
Date
vrfuri
Date
pixeli
OpenGL ca un renderer
Primitive geometrice
puncte, linii i poligoane
Primitive imagine
imagini i bitmap-uri
flux independent pentru primitive
geometrice i imaginelegate prin maparea
texturilor
Redarea depinde de stare
culori, materiale, surse de lumin, et.
API nrudite
AGL, GLX, WGL
legtur ntre OpenGL i sistemele de
ferestre
GLU(OpenGL utility Library)
parte a OpenGL
NURNS, suprafee cuadrice, etc.
GLUT (OpenGL Utility Toolkit) sau GLAUX
API portabil
nu este oficial parte a OpenGL
API nrudite
GLX pentru sistemul X Windows, obinuit
pe platformele Unix
AGL pentru Apple Macintosh
WGL pentru Miocrosoft Windows
OpenGL i API-urile nrudite





X, Win32, Mac O/S GL



GLX, AGLsau WGL


GLU
Programul de aplicaie
OpenGL Motif
Widget or similar

GLUT
Software i/sau hardware
Bazele GLUT
Structura de baz a unei aplicaii GLUT
Se configureaz i se deschide fereastra
Se iniializeaz starea OpenGL
Se nregistreaz funciile callback
Redare
Redimensionare
Intrri: tastatur, mouse, etc.
Bucla de procesare a evenimentelor de
intrare.

Program exemplu

void main (int argc, char** argv)
{
int mode = GLUT RGB| GLUT_DOUBLE;
glutInitDisplayMode (mode);
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( resize );
glutKeyboardFunc( keyboard );
glutIdleFunc( idle );
glutMainLoop();
}
Iniializarea OpenGL

void init (void)
{
glClearColor( 0.0, 0.0, 0.0, 1.0);
glClearDepth(1.0);

glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_DEPTH_TEST);
.}
Funcii callback GLUT
Rutine care se apeleaz cnd se ntmpl ceva
redimensionarea sau redesenarea ferstrei
intrri de la utilizator
animaie

nregistrarea funciilor callback
glutDisplayFunc()- apelat cnd trebuie s fie
remprosptai pixeli din fereastr.
glutReshapeFunc()- apelat cnd fereastra i modific
dimensiunea.
glutKeyboardFunc()- apelat cnd se apas o tast la
tastatur.
glutMouseFunc()- apelat cnd utilizatorul mut mouse-ul
n timp ce este apasat butonul mouse-ului.
glutPassiveMouseFunc()- apelat cnd mouse-ul este
mutat fr a avea legtur cu starea butonului mouse-ului.
glutIdleFunc)- apelat cnd nu se ntmpl nimic altceva.
Foarte util n animaii


Redarea OpenGL

void display (void)
{
glClear ( GL_COLOR_BUFFER_BIT);
glBegin( GL_TRIANGLE_STRIP);
glVertex3fv(v[0]);
glVertex3fv(v[1]);
glVertex3fv(v[2]);
glVertex3fv(v[3]);
glEnd();
glSwapBuffers();
}
Idle Callbacks




void idle (void)
{
t+=dt;
glutPostRedisplay();
}
(Apelurile callback pentru
intrrile utilizatorului)

void keyboard (char key, int x, int y)
{
switch(key) {
caseq:caseQ:
exit( EXIT_SUCCESS);
break;
case r: case R:
rotate=GL_TRUE;
break;
}
}
TRANSFORMRI

Transformri n OpenGL
Modelare
Vizualizare
orientarea camerei
proiecie
Animaie
Maparea la ecran
Analogia cu fotografierea
Volumul de
vizualizare
model
Aparatul de
fotografiat
trepied
Fereastra de
vizualizare
Analogia transformrilor cu
fotografierea
Transformarea de proiecie
ajustarea lentilelor aparatului
Transformarea de vizualizare
definirea poziiei trepiedului i orientarea
volumului de vizualizare n spaiu
Transformrile de modelare
micarea modelului
Transformrile ferestrei de vizualizare
mrirea sau micorarea fotografiei

Sisteme de coordonate i
transformri
Pai n formarea unei imagini
Specificarea geometriei (coordonate reale)
Specificarea camerei (coordonatele camerei)
Proiecia (coordonatele ferestrei)
Maparea la viewport (coordonate de ecran)
Fiecare pas utilizeaz transformri
Fiecare transformare este echivalent cu
o schimbare n sistemele de coordonate
Transformri afine
Se doresc transformri care pstreaz
geometria
Linii, poligoane, quadrice
Afine=pstrarea liniei
Rotaie, translaie, scalare
Proiecie
Concatenare (compunere)
Coordonate omogene
Fiecare vrf este un vector coloan


w este de obicei 1.0
toate operaiile sunt nmuliri de matrici
direciile se pot reprezenta cu w=0

w
z
y
x
v
Transformri 3D
Un vertex este transformat de matrici
4x4
Toate operaiile afine sunt nmuliri de matrici
Toate matricile sunt memorate n OpenGL ca
coloan-major
Matricile sunt totdeauna post-multiplicate
Produsul unei matrici i un vector este

15 11 7 3
14 10 6 2
13 9 5 1
12 8 4 0
m m m m
m m m m
m m m m
m m m m
M
Specificarea transformrilor
Programatorul are dou stiluri de
specificare a transformrilor:
Prin specificarea matricelor(ex: glLoadMatrix,
glMultMatrix)
Prin specificarea operaiilor(ex: glRotate,
glOrtho)
Programatorul nu trebuie s memoreze
matricile
Programarea transformrilor
nainte de redare, vizualizare, localizare, i
orientare
poziia Ochi/camer
geometria 3D
Controlarea matricilor
Includerea stivei de matrici
Combinarea(compunerea) transformrilor
Fluxul transformrilor
c
o
o
r
d
o
n
a
t
e

Matricea de
modelare-
vizualizare


Modelare-
vizualizare

Modelare-
vizualizare

Matricea de
Proiecie



proiecie

mprirea
cu w
datorat
proieciei

Transforma
rea
fereastr-
viewport
Obiect ochi decupare dispozitiv normalizat fereastr
alte calcule aici
material-culoare
model de umbrire
modelul de redare al poligoanelor
eliminarea poligoanelor spate
decuparea
.
.
.

.
.
.

Operaii cu matrice
Specificarea stivei de matrice curent
glMatrixMode( GL_MODELVIEW sau GL_PROJECTION)
Alte operaii cu matrice sau cu stiva
glLoadIdentity() glLoadMatrix() glMultMatrix()
glPushMatrix() glPopMatrix()
Viewport-ul
De obicei coincide cu dimensiunile ferestrei
Rata de aspect va fi aceeai cu cea de la
transformarea de proiecie sau imaginea va fi
deformat
glViewport( x, y, width, height ) decupeaz vertexul sau poziia de raster.
Transformarea de proiecie
Forma volumului de vizualizare



Proiecia perspectiv
gluPerspective( fovy, aspect, zNear, zFar)funcie GLU
glFrustum(left, right, bottom, top,zNear, zFar) funcie OpenGL
Proiecia paralel ortografic
glOrtho( left, right, top, zNear, zFar )funcie OpenGL
gluOrtho2D(left, right, bottom, top ) funcie GLU care apeleaz glOrtho cu valoarea z
apropiat de 0.
Aplicarea transformrii de
proiecie
Secvena obinuit (proiecia paralel ortogonal)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho( left, right, top, zNear, zFar )

Transformri de modelare
Mutarea obiectelor
glTranslate{fd}( x, y, z )
Rotaia unui obiect n jurul unei axe
oarecare.
glRotate{fd}( angle, x, y, z )
unde unghiul angle se d n grade
Scalarea (mrirea sau micorarea)
obiectelor sau oglindirea
glScale{fd}( x, y, z )
Resize(): Perspective &
LooKAt
void resize( int w, int h )
{
glViewport( 0, 0, (Glsizei) w,
(Glsizei) h );
glMatrixMode( GL_PROJECTION);
glLoadIdentity();
gluPerspective( 65.0, (Glfloat) w/h,
1.0, 100.0);
glMatrixMode( GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0);
}

Resize(): Perspective &
Translate

void resize( int w, int h )
{
glViewport( 0, 0, (Glsizei) w, (Glsizei) h );
glMatrixMode( GL_PROJECTION);
glLoadIdentity();
gluPerspective( 65.0, (Glfloat) w/h, 1.0,
100.0);
glMatrixMode( GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0, 0.0, 5.0);
}
Resize(): Ortho (part 1)
void resize( int width, int height )
{
Gldouble aspect = (Gldouble) width/height;
Gldouble left = -2.5, right = 2.5;
Gldouble bottom = -2.5, top = 2.5;
glViewport( 0, 0, (Glsizei) w, (Glsizei) h );
glMatrixMode( GL_PROJECTION);
glLoadIdentity();
if( aspect < 1.0)
{ left /= aspect;
right /= aspect;
}
else
{ bottom *= aspect;
top *= aspect;
}
glOrtho( left, right, bottom, top, near, far );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}

S-ar putea să vă placă și