INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I...

39
Knowledge Aided Engineering Manufacturing and Related Technologies INFORMATICA GRAFICA 25 Marzo Introduzione a OpenGL Michele Antolini – [email protected]

Transcript of INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I...

Page 1: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

Knowledge Aided

Engineering Manufacturing

and Related

Technologies

INFORMATICA GRAFICA 25 Marzo Introduzione a OpenGL

Michele Antolini – [email protected]

Page 2: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 3: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 4: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 5: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

KAEMaRT Michele Antolini

Opengl

•  Astrazione rispetto all’hardware sottostante

•  Implementazioni software di funzioni non supportate dall’hardware

•  Sfruttamento delle capacità dei diversi acceleratori 3D

Page 6: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 7: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 8: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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>

Page 9: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

KAEMaRT Michele Antolini

OpenGL

•  rendering 3D •  lighting •  z-buffering •  alpha blending •  texture mapping •  antialiasing •  fog

Libreria gl

Page 10: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 11: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 12: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 13: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 14: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 15: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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;

}

Page 16: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 17: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 18: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 19: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

KAEMaRT Michele Antolini

OpenGL - comandi

Creazione !nestra di visualizzazione

•  glutInitWindowSize( int width, int height )

•  glutInitWindowPosition( int x, int y )

•  glutCreateWindow ( char *name )

Page 20: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 21: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 22: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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 )

Page 23: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

);

Page 24: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

KAEMaRT Michele Antolini

OpenGL – Viewing volume

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

top

left

right

far near

Page 25: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 26: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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)

Page 27: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 28: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

KAEMaRT Michele Antolini

OpenGL - Viewport

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

gluLookAt( ... )

Page 29: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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 );

Page 30: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

KAEMaRT Michele Antolini

OpenGL - Colore

modalità rgb: •  selezione la modalità glutInitDisplayMode( GLUT_RGB );

•  selezione colore corrente glColor3f( r, g, b );

Page 31: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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();

Page 32: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 33: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 34: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 35: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 36: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 37: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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

Page 38: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

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)

Page 39: INFORMATICA GRAFICA - unibg.it - OpenGL.pdf · KAEMaRT Michele Antolini Computer graphics • I programmi di gra!ca (non solo 3D) hanno

KAEMaRT Michele Antolini

Esercizio

•  Inviare via email i sorgenti dell’esercizio

•  [email protected]

•  Oggetto: [Infogra!ca] Lab01

•  Nome e numero di matricola all’interno del main.cpp