Knowledge Aided Engineering Manufacturing and Related Technologies INFORMATICA GRAFICA 20 Aprile Introduzione a OpenGL michele.antolini@mail.polimi.it
Computer graphics I programmi di grafica (non solo 3D) hanno una struttura molto simile Fasi: Definizione geometrie (vertici, vettori, linee, poligoni, curve, superfici) Definizione punto di vista, FOV, proiezione Rasterizzazione, shading (+ eventuali texture) Sono coinvolti vettori, matrici, equazioni matematiche
OpenGL Astrazione rispetto all hardware sottostante Implementazioni software di funzioni non supportate dall hardware Sfruttamento delle capacità dei diversi acceleratori 3D
OpenGL L interfaccia OpenGL ha portato nel tempo ad una convergenza nell architettura hardware delle schede grafiche punti, linee, poligoni come primitive base pipeline per trasformazioni e illuminazione Z-buffering Texture mapping Alpha blending Retrocompatibilità con versioni precedenti
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
OpenGL OpenGL non si occupa di: event management input management (tastiera/mouse) window management L ambiente 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>
OpenGL Libreria gl rendering 3D lighting z-buffering alpha blending texture mapping antialiasing fog
OpenGL Libreria glu gestione parametri viewing gestione texture mapping polygon tessellation (decompositore generico di poligoni concavi) curve e superfici parametriche gestione errori
OpenGL Libreria glut interfaccia con il window system gestione eventi gestione input keyboard/mouse primitive 3D realizza trasparenza rispetto al window system sottostante
OpenGL Configurazione In laboratorio utilizzeremo l editor CodeBlocks Compilatore: gcc Windows: MinGW (porting di gcc sotto Windows) OSX: necessario pacchetto XCode L interfaccia 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
OpenGL Configurazione Creazione nuovo progetto vuoto Project->New->Empty Project Scegliere nome e directory Compilatore: GNU GCC Compiler Project->Build Options Include directories: Search directories Lib directories: Linker settings
OpenGL Configurazione Windows: Compiler: <freeglut dir>\include Linker: <freeglut dir>\lib Linker settings: -lfreeglut, -lopengl32, -lglu32 OSX (Codeblocks 10) 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
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;
OpenGL - comandi Formato generale: <lib_name><command_name><signature> dove <signature>: [[<arg_number>]<arg_type>]... ] Esempi: glcolor3f libreria gl, Colore, 3 dati, float glvertex2i libreria gl, Vertice, 2 dati, int glutcreatewindow libreria glut, crea la window
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
OpenGL - comandi Nel main() è necessario impostare la configurazione 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: bufferizzazione dei frame GLUT_STEREO: abilita la visualizzazione stereoscopica
OpenGL - comandi Creazione finestra di visualizzazione glutinitwindowsize( int width, int height ) glutinitwindowposition( int x, int y ) glutcreatewindow ( char *name )
OpenGL - comandi Gestione della finestra Vengono utilizzati puntatori a funzione per implementare callback glutdisplayfunc(void (*func)(void)) Viene chiamata quando il contenuto della finestra deve essere ridisegnato glutreshapefunc(void (*func)(int width, int height)) Viene chiamata quando la finestra viene spostata o ridimensionata glutpostredisplay(void) Forza la chiamata alla Display Function
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
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)...cube( 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 )
OpenGL - comandi Impostazione del punto di vista void glulookat( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz );
OpenGL Viewing volume Proiezione prospettica void glfrustum(left,right,bottom,top,near,far) y near x left right far z
OpenGL Viewing volume Proiezione prospettica void gluperspective(fovy,aspect,near,far) fovy near far fovy = Field Of View Y aspect = w/h
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)
OpenGL - Matrici OpenGL gestisce le sue impostazioni principali tramite una pila (stack) di matrici Projection, Modelview, Texture Si imposta la modalità corrente tramite glsetmatrixmode ( GLenum mode ) mode: GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE
OpenGL - Viewport void glviewport(x,y,width,height) scala l immagine 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 finestra una finestra può contenere diversi viewport
OpenGL - Viewport void glviewport(x,y,width,height) dopo aver definito una ulteriore viewport, chiamare glloadidentity() glulookat(... )
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 );
OpenGL - Colore modalità rgb: selezione la modalità glutinitdisplaymode( GLUT_RGB ); selezione colore corrente glcolor3f( r, g, b );
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 ) (x, y, z, w ) glvertex3f( x, y, z ) (x, y, z, 1.0) glvertex2f( x, y ) (x, y, 0.0,1.0) il formato generale per il drawing e`: glbegin( tipo_di_primitiva ); <sequenza di vertici> glend();
OpenGL - Primitive V 2 V 1 V 4 V 3 GL_POINTS V 5 V 6 V 2 V 1 V 4 V 3 GL_LINES V 5 V 6 V 2 V 1 V 4 V 3 GL_LINE_STRIP V 5 V 6
OpenGL - Primitive V 2 V 1 V 4 V 3 GL_LINE_LOOP V 5 V 6 V 5 V 1 V 2 V 3 GL_TRIANGLES V 6 V 4 V 3 V 1 V 2 V 5 GL_TRIANGLE_STRIP V6 V 4
OpenGL - Primitive V 1 V 2 V 3 GL_TRIANGLE_FAN V 6 V5 V 4 V 2 V3 V 1 V 4 V 5 V 6 V 8 V 7 GL_QUADS V 1 V 3 V 5 V 7 GL_QUAD_STRIP V 2 V 4 V 6 V 8
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 differenti possono avere colore differente; in tal caso il colore viene interpolato da un vertice all altro
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 pattern tratteggio void gllinestipple( GLint factor, GLushort pattern);
OpenGL Punti, Linee e Poligoni gllinestipple(4, 0xAAAA ); glenable(gl_line_stipple); glutwirecube(1); //dotted wireframe cube
ESEMPI
Esercizio Illustrate la costruzione grafica di una curva di Beziér di almeno secondo grado in 3 dimensioni Visualizzazione proiettata sul piano 2D Seconda viewport con visualizzazione prospettica o ortogonale Animazione
Esercizio Inviare via email i sorgenti dell esercizio michele.antolini@mail.polimi.it Oggetto: [Infografica] Lab01 Nome e numero di matricola all interno del main.cpp Usate la vostra email @studenti.unibg.it