Knowledge Aided
Engineering Manufacturing
and Related
Technologies
INFORMATICA GRAFICA 25 Marzo Introduzione a OpenGL
Michele Antolini – [email protected]
KAEMaRT Michele Antolini
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 dell’interfaccia OpenGL passa al consorzio Khronos Group
KAEMaRT Michele Antolini
Opengl
• Astrazione rispetto all’hardware sottostante
• Implementazioni software di funzioni non supportate dall’hardware
• Sfruttamento delle capacità dei diversi acceleratori 3D
KAEMaRT Michele Antolini
Opengl
• L’interfaccia OpenGL ha portato nel tempo ad una convergenza nell’architettura hardware delle schede gra!che
• punti, linee, poligoni come primitive base • pipeline per trasformazioni e illuminazione • Z-buffering • 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
• 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>
KAEMaRT Michele Antolini
OpenGL
• rendering 3D • lighting • z-buffering • alpha blending • texture mapping • antialiasing • fog
Libreria gl
KAEMaRT Michele Antolini
OpenGL
• gestione parametri viewing • gestione texture mapping • polygon tessellation (decompositore generico
di poligoni concavi) • curve e super!ci parametriche • gestione errori
Libreria glu
KAEMaRT Michele Antolini
OpenGL
• interfaccia con il window system • gestione eventi • gestione input keyboard/mouse • primitive 3D • realizza trasparenza rispetto al window
system sottostante
Libreria glut
KAEMaRT Michele Antolini
OpenGL – Con!gurazione
• 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
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 • Include directories:
• Search directories • Lib directories:
• Linker settings
KAEMaRT Michele Antolini
OpenGL – Con!gurazione
• Windows: • Compiler: <freeglut dir>\include • Linker: <freeglut dir>\lib • Linker settings: -lfreeglut, -lopengl32, -lglu32
• 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 – 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: bufferizzazione 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) • ...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 )
KAEMaRT Michele Antolini
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
);
KAEMaRT Michele Antolini
OpenGL – Viewing volume
Proiezione prospettica void glFrustum(left,right,bottom,top,near,far)
top
left
right
far near
KAEMaRT Michele Antolini
OpenGL – Viewing volume
Proiezione prospettica void gluPerspective(fovY,aspect,near,far)
far near
w
fovY h
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
right
near far
Proiezione ortogonale parallela 2D void glOrtho2D(left,right,bottom,top)
KAEMaRT Michele Antolini
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 !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 ) (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();
KAEMaRT Michele Antolini
OpenGL - Primitive
V1
V2
V3 V4
V5 V6
GL_LINE_STRIP
V1
V2
V3 V4
V5 V6
GL_LINES
V1
V2
V3 V4
V5 V6
GL_POINTS
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 differenti possono avere colore differente; in tal caso il colore viene
interpolato da un vertice all’altro
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
V1
V2
V3 V4
V5 V6
GL_LINE_STRIP
V1
V2
V3 V4
V5 V6
GL_LINES
V1
V2
V3 V4
V5 V6
GL_POINTS
KAEMaRT Michele Antolini
OpenGL - Esercizio
V1
V2
V3 V4
V5 V6
GL_LINE_LOOP
V1 V2
V3
V4
V5
V6
GL_TRIANGLES
V3 V1
V2
V4 V5
V6
GL_TRIANGLE_STRIP
KAEMaRT Michele Antolini
OpenGL - Esercizio
V1 V2
V3
V4 V6
V5
GL_TRIANGLE_FAN
V1 V2
V3 V4
V5 V6
V7 V8
GL_QUADS
GL_QUAD_STRIP V1
V2 V4
V3 V5
V6 V8
V7
KAEMaRT Michele Antolini
Esercizio
• Completare le funzioni dell’header !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 tronco (wireframe) il cui asse centrale non corrisponda con uno degli assi X,Y o Z (non usare glRotate )
• Visualizzare il cono utilizzando 4 viste (prospettica, frontale, da sinistra, dall’alto)
KAEMaRT Michele Antolini
Esercizio
• Inviare via email i sorgenti dell’esercizio
• Oggetto: [Infogra!ca] Lab01
• Nome e numero di matricola all’interno del main.cpp
Top Related