Sei sulla pagina 1di 39

Knowledge Aided Engineering Manufacturing and Related Technologies

INFORMATICA GRAFICA
21 Aprile Introduzione a OpenGL

Michele Antolini michele.antolini@mail.polimi.it

Computer graphics

I programmi di gra ca (non solo 3D) hanno una struttura molto simile Fasi: De nizione geometrie (vertici, vettori, linee, poligoni, curve, super ci) De nizione punto di vista, FOV, proiezione Rasterizzazione, shading (+ eventuali texture) Sono coinvolti vettori, matrici, equazioni matematiche
KAEMaRT Michele Antolini

Software -> Hardware

Anni 80: Presenza di algoritmi maturi per le operazioni 3D Necessit di applicare ad un grande numero di dati le medesime operazioni 1984: la IBM rilascia il primo tentativo di scheda per PC dedicata all'accelerazione hardware 2D/3D (con un processore 8088-2, 8MHz) Negli anni '90 l'accelerazione 2D prima e 3D poi diventano sempre pi importanti per le prestazioni dei computer, cos societ come S3, ATI, Matrox cominciano a produrre schede di accelerazione hardware sempre pi performanti
KAEMaRT Michele Antolini

OpenGL

1992: la Silicon Graphics sviluppa una speci ca per disegnare scene tridimensionali a partire da chiamate a funzioni primitive Si tratta della prima de nizione di Open Graphics Library (OpenGL) De nita come interfaccia: i costruttori implementano le funzioni in base allo speci co hardware sottostante 2007: il controllo dellinterfaccia OpenGL passa al consorzio Khronos Group

KAEMaRT

Michele Antolini

Opengl

Astrazione rispetto allhardware sottostante Implementazioni software di funzioni non supportate dallhardware Sfruttamento delle capacit dei diversi acceleratori 3D

KAEMaRT

Michele Antolini

Opengl

Linterfaccia OpenGL ha portato nel tempo ad una convergenza nellarchitettura hardware delle schede gra che
punti, linee, poligoni come primitive base pipeline per trasformazioni e illuminazione Z-buering Texture mapping Alpha blending

Retrocompatibilit con versioni precedenti


KAEMaRT Michele Antolini

Opengl - Date

1992: OpenGL 1.0 1997 (gennaio): OpenGL 1.1, texture su GPU 1998-2003 OpenGL viene aggiornato pi o meno annualmente 2004: OpenGL 2.0, shaders programmabili (GLSL, OpenGL Shading Language) 2008: OpenGL 3.0, geometry shader, vertex array (tra le altre cose) 2010 (11 marzo) OpenGL 4.0:
tassellazione virgola mobile a 64bit (doppia precisione) per gli shader supporto OpenCL (GPGPU) per lo sfruttamento della GPU per General

Purpose computing
KAEMaRT Michele Antolini

OpenGL

OpenGL non si occupa di:


event management input management (tastiera/mouse) window management

Lambiente di sviluppo per OpenGL e` normalmente costituito da alcune librerie:


gl

OpenGL glu GL Utilities gl<ws> Estensione per <ws> (window system) glut Interfaccia a <ws>

KAEMaRT

Michele Antolini

OpenGL

Libreria gl rendering 3D lighting z-buering alpha blending texture mapping antialiasing fog

KAEMaRT

Michele Antolini

OpenGL

Libreria glu gestione parametri viewing gestione texture mapping polygon tessellation (decompositore generico di poligoni concavi) curve e super ci parametriche gestione errori

KAEMaRT

Michele Antolini

OpenGL

Libreria glut interfaccia con il window system gestione eventi gestione input keyboard/mouse primitive 3D realizza trasparenza rispetto al window system sottostante

KAEMaRT

Michele Antolini

OpenGL Con gurazione

In laboratorio utilizzeremo leditor CodeBlocks Compilatore: gcc Windows: MinGW (porting di gcc sotto Windows) OSX: necessario pacchetto XCode Linterfaccia OpenGL non cambia a seconda del sistema operativo Cambiano le opzioni di compilazione e, spesso, dettagli nelle direttive #include GL Utility Toolkit Windows: freeglut
http://freeglut.sourceforge.net
KAEMaRT Michele Antolini

OpenGL Con gurazione

Creazione nuovo progetto vuoto Project->New->Empty Project Scegliere nome e directory Compilatore: GNU GCC Compiler Project->Build Options->Search directories Windows: Compiler: <freeglut dir>\include Linker: <freeglut dir>\lib Linker settings: freeglut, opengl32, glu32

KAEMaRT

Michele Antolini

OpenGL Con gurazione

OSX Compiler:
System/Library/Frameworks/OpenGL.framework/Headers System/Library/Frameworks/GLUT.framework/Headers

Linker settings->Other linker options:


-framework OpenGL -framework GLUT

Linux Compiler:
/usr/local/include

Linker
glut, GLU, GL

KAEMaRT

Michele Antolini

OpenGL Con gurazione

Windows: Compiler: <freeglut dir>\include Linker: <freeglut dir>\lib Linker settings: freeglut, opengl32, glu32 OSX Compiler:
System/Library/Frameworks/OpenGL.framework/Headers System/Library/Frameworks/GLUT.framework/Headers

Linker settings->Other linker options:


-framework OpenGL -framework GLUT

Linux Compiler:
Linker

/usr/local/include glut, GLU, GL

KAEMaRT

Michele Antolini

OpenGL Prima compilazione

main.c #include <stdlib.h> //Win32 / Linux #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> //OSX #include <OpenGL/gl.h> #include <OpenGL/glu.h> #include <GLUT/glut.h> int main(int argc, char** argv) { return 0; }

KAEMaRT

Michele Antolini

OpenGL - comandi

Formato generale: <lib_name><Command_name><signature> dove <signature>: [[<arg_number>]<arg_type>] ... ] Esempi: glColor3f libreria gl, Colore, 3 dati, oat glVertex2i libreria gl, Vertice, 2 dati, int glutCreateWindow libreria glut, crea la window
KAEMaRT Michele Antolini

OpenGL tipi di dati

tipo abbrev. lungh. ------------------------------GLbyte b 8 bit GLubyte ub 8 bit GLshort s 16 bit GLushort us 16 bit GLint i 32 bit GLuint ui 32 bit GLfloat f 32 bit GLdouble d 64 bit

KAEMaRT

Michele Antolini

OpenGL - comandi

Nel main() necessario impostare la con gurazione iniziale utilizzando chiamate alla libreria GLUT glutInit( int argc, char** argv): inizializzazione GLUT glutInitDisplayMode( unsigned int mode ): combinazione tramite operatore | (OR) di parametri relativi alla modalit di visualizzazione GLUT_RGBA, GLUT_RGB, GLUT_ALPHA, GLUT_INDEX: selezione colori in RGB o tramite indexing con eventuale trasparenza (ALPHA)
GLUT_SINGLE, GLUT_DOUBLE, GLUT_ACCUM,

GLUT_DEPTH, GLUT_STENCIL: buerizzazione dei frame


GLUT_STEREO: abilita la visualizzazione stereoscopica

KAEMaRT

Michele Antolini

OpenGL - comandi

Creazione nestra di visualizzazione


glutInitWindowSize( int width, int height ) glutInitWindowPosition( int x, int y ) glutCreateWindow ( char *name )

KAEMaRT

Michele Antolini

OpenGL - comandi

Gestione della nestra


Vengono utilizzati puntatori a funzione per implementare callback glutDisplayFunc(void (*func)(void)) Viene chiamata quando il contenuto della nestra deve essere ridisegnato glutReshapeFunc(void (*func)(int width, int height)) Viene chiamata quando la nestra viene spostata o ridimensionata glutPostRedisplay(void)
Forza la chiamata alla Display Function

KAEMaRT

Michele Antolini

OpenGL - comandi

Eventi di input
glutKeyboardFunc( void (*func)(unsigned int key, int x, int y) Quando viene premuto un tasto (ASCII) restituisce il codice (key) e le coordinate (x,y) del mouse glutMouseFunc(void (*func)(int button, int state, int x, int y)) Pressione di un tasto del mouse. button pu valere GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON o GLUT_MIDDLE_BUTTON state pu valere GLUT_UP o GLUT_DOWN

KAEMaRT

Michele Antolini

OpenGL - comandi

Eventi di input
glutMotionFunc( void (*func)(int x, int y) )
Questa callback viene attivata quando il mouse si muove con uno o pi tasti premuti

Primitive oggetti 3D

glutWire<name>, glutSolid<name> (es. glutWireCube(int size) glutWireCube( GLDouble size) ...Sphere( GLdouble radius, GLint slices, GLint stacks) ...Torus( GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings ) ...Cone( GLdouble radius, GLdouble height, GLint slices, GLint stacks ) ...Teapot( GLdouble size )

KAEMaRT

Michele Antolini

OpenGL - comandi

Impostazione del punto di vista void gluLookAt(


GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble ); eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz

KAEMaRT

Michele Antolini

OpenGL Viewing volume

Proiezione prospettica void glFrustum(left,right,bottom,top,near,far)

top
left right

near far

KAEMaRT

Michele Antolini

OpenGL Viewing volume

Proiezione prospettica void gluPerspective(fovY,aspect,near,far)

fovY near

h
far

fovY = Field Of View Y aspect = w/h

KAEMaRT

Michele Antolini

OpenGL Viewing volume

Proiezione ortogonale parallela void glOrtho(left,right,bottom,top,near,far)

left

near

right

far

Proiezione ortogonale parallela 2D void glOrtho2D(left,right,bottom,top)


KAEMaRT Michele Antolini

OpenGL - Viewport

void glViewport(x,y,width,height) scala limmagine su una viewport che ha origine in (x,y) e ha dimensioni (width,height) i parametri sono in window coordinates width e height possono essere inferiori alla dimensione della nestra una nestra pu contenere diversi viewport
KAEMaRT Michele Antolini

OpenGL - Viewport

void glViewport(x,y,width,height) dopo aver de nito una ulteriore viewport, chiamare glLoadIdentity() gluLookAt( ... )

KAEMaRT

Michele Antolini

OpenGL - Colore

due modalit: indicizzata RGB modalit indicizzata: selezione modalit


glutInitDisplayMode( GLUT_INDEX );
entry della Look-up Table

glutSetColor( index, r, g, b );
selezione del colore corrente

glIndexi( index );

KAEMaRT

Michele Antolini

OpenGL - Colore

modalit rgb: selezione la modalit


glutInitDisplayMode( GLUT_RGB );
selezione colore corrente

glColor3f( r, g, b );

KAEMaRT

Michele Antolini

OpenGL - Primitive

le primitive di OpenGL (punti, linee, triangoli, poligoni) sono descritte in termini di vertici i vertici sono descritti in coordinate omogenee (x, y, z, w) = (x/w, y/w, z/w, 1)
glVertex4f( x, y, z, w ) glVertex3f( x, y, z ) glVertex2f( x, y ) (x, y, z, (x, y, z, w ) 1.0)

(x, y, 0.0,1.0)

il formato generale per il drawing e`:


glBegin( tipo_di_primitiva ); <sequenza di vertici> glEnd();

KAEMaRT

Michele Antolini

OpenGL - Primitive

V2 V1 V5 V4 V6 V2 V1 V5 V4 V6 V2 V1 V5 V4 V6 V3 V3 V3

GL_POINTS

GL_LINES

GL_LINE_STRIP

KAEMaRT

Michele Antolini

OpenGL - Primitive

esempio: glBegin( GL_LINES ); glColor3f( 1.0, 1.0, 1.0 ); glVertex2f( -0.8, -0.8 ); glColor3f( 1.0, 0.0, 0.0 ); glVertex2f( 0.5, 0.2 ); glVertex2f( -0.5, 0.4 ); glColor3f( 0.0, 1.0, 0.0 ); glVertex2f( -0.2, 0.1 ); glEnd(); vertici dierenti possono avere colore dierente; in tal caso il colore viene interpolato da un vertice allaltro
KAEMaRT Michele Antolini

OpenGL Punti, Linee e Poligoni

Si pu impostare la dimensione di un punto con il comando glPointSize( GLfloat size ) default: 1.0) lo spessore di una linea con il comando glLineWidth( GLfloat size ) default: 1.0

KAEMaRT

Michele Antolini

OpenGL - Esercizio

V2 V1 V5 V4 V6 V2 V1 V5 V4 V6 V2 V1 V5 V4 V6 V3 V3 V3

GL_POINTS

GL_LINES

GL_LINE_STRIP

KAEMaRT

Michele Antolini

OpenGL - Esercizio
V2 V1 V5 V1 V5 V6 V3 V5 V6
KAEMaRT

V4 V6 V2

V3

GL_LINE_LOOP

V3 V4 V1 V2 V4

GL_TRIANGLES

GL_TRIANGLE_STRIP

Michele Antolini

OpenGL - Esercizio
V2 V3 V6 V5 V1 V4 V1 V2 V3 V2 V5 V4 V6 V7 V7 GL_QUAD_STRIP V4 V6 V8 GL_QUADS GL_TRIANGLE_FAN

V1

V3 V 8 V5

KAEMaRT

Michele Antolini

Esercizio
Completare le funzioni dellheader le Vector3D.h Non necessaria rotazione intorno ad un asse generico rotate( Vector3d &axis, double angle) Utilizzo Vector3d v1, v2(1.0,0.0,0.0), v3; v3 = v1+v2; v3 = 3.0*v3; Vector3d v4 = v3.cross(v2); v4.normalize(); v4.rotateX(0.1f); Scrivere una funzione per disegnare un poligono regolare dati raggio del cerchio in cui inscritto e numero di lati Disegnare un cono (wireframe) il cui asse centrale non corrisponda con uno degli assi X,Y o Z Visualizzare il cono utilizzando 4 viste (prospettica, frontale, da sinistra, dallalto)
KAEMaRT Michele Antolini

Potrebbero piacerti anche