Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
INFORMATICA GRAFICA
21 Aprile Introduzione a OpenGL
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
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
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 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
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
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
OSX Compiler:
System/Library/Frameworks/OpenGL.framework/Headers System/Library/Frameworks/GLUT.framework/Headers
Linux Compiler:
/usr/local/include
Linker
glut, GLU, GL
KAEMaRT
Michele Antolini
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
Linux Compiler:
Linker
KAEMaRT
Michele Antolini
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
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,
KAEMaRT
Michele Antolini
OpenGL - comandi
KAEMaRT
Michele Antolini
OpenGL - comandi
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
KAEMaRT
Michele Antolini
top
left right
near far
KAEMaRT
Michele Antolini
fovY near
h
far
KAEMaRT
Michele Antolini
left
near
right
far
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
glutSetColor( index, r, g, b );
selezione del colore corrente
glIndexi( index );
KAEMaRT
Michele Antolini
OpenGL - Colore
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)
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
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