1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure...

33
1 Programmazione grafica 1 Daniele Marini

Transcript of 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure...

Page 1: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

1

Programmazione grafica1

Daniele Marini

Page 2: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

2

Linguaggio di riferimento

• OpenGL: libreria di procedure che realizza un API (application programmer’s interface)– Standard de facto

– Disponibile su windows, mac, IRIX, Solaris

– Linux dispone di librerie free Mesa - subset di OpenGL

– La struttura semantica è simile a quella di altre librerie: GKS, Direct3D, Java3D

Page 3: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

3

Disegnare al tratto - “Line drawing”

Il plotter a penna

moveto (x,y)lineto (x,y)

Page 4: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

4

Disegno al tratto

• Tracciare linee definite in uno spazio cartesiano piano

• Modalità molto diffusa ma con limiti: come lavorare in 3D?

• Come gestire strutture geometriche più evolute?

Page 5: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

5

Disegno al tratto

• Possiamo pensare un disegno piano come la proiezione di un disegno tridimensionale

• Oppure come un disegno definito nello spazio 3d ma con punti su un medesimo piano di equazione z=0

Page 6: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

6

Disegno al tratto• I punti saranno allora vettori, o vertici: p(x,y,z)o, nel

piano, p(x,y,0)• Possiamo definire una primitiva grafica glVertex* dove

* assume il valore:

ntv con n ={2,3 o 4}dimensione dello spazio

t = {i,d o f} integer, double o floatv se presente e’ un puntatore a un array di valori

Page 7: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

7

Primitive grafiche glVertex

#define Glint integer

glVertex2i(Glint xi, Glint yi)

Definisce un punto di coordinate intere in uno spazio 2D

#define Glfloat float

glVertex3i(Glfloat x, Glfloat y, Glfloat z)

Definisce un punto di coordinate float in uno spazio 3D

Glfloat vertex[3]

glVertex3fv(vertex)

Definisce un punto le cui coordinate float, in uno spazio 3D, sono registrate nell’array vertex

Page 8: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

8

Primitive grafiche glVertex

– Possiamo raggruppare punti per costruire strutture più complesse:

glBegin(GL_LINES); definisce un segmentoglVertex2f(x1,y1);

glVertex2f(x2,y2);

glEnd();

glBegin(GL_POINTS); definisce una coppia di puntiglVertex2f(x1,y1);

glVertex2f(x2,y2);

glEnd();

Page 9: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

9

Triangolo di SierpinskyIl programma seguente traccia un triangolo di Sierpinskyper punti

Page 10: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

10

void draw_sierpinsky( void ){/* define a point data type */ typedef GLfloat point2[2]; point2 vertices[3]={{0.0,0.0},{250.0,500.0},{500.0,0.0}};

/* i vertici di un triangolo */ int i, j, k; int rand();

/* standard random number generator */

point2 p ={75.0,50.0}; /* An arbitrary initial point inside triangle */

glClear(GL_COLOR_BUFFER_BIT); /*clear the window */

1/2

Page 11: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

11

/* compute and plots 5000 new points */ for( k=0; k<5000; k++) { j=rand()%3;

/* pick a vertex at random */ /* Calcola il punto mdio tra il vertice scelto e il vecchio punto */

p[0] = (p[0]+vertices[j][0])/2.0; p[1] = (p[1]+vertices[j][1])/2.0;

/* traccia il nuovo punto */ glBegin(GL_POINTS); glVertex2fv(p); glEnd(); } glFlush(); /* clear buffers */

}

2/2

Page 12: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

12

Le coordinate schermo

La figura precedente è definita in uno spazio cartesiano indipendente dal dispositivo di visualizzazione (display, carta, …)

In passato il disegno veniva descritto direttamente in coordinate del dispositivo

La conversione tra coordinate ‘mondo’ - “world co-ordinates” e coordinate dispositivo - “device co-ordinates” si chiama trasformazione window-to-viewport

Page 13: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

Spazio mondo /Spazio schermo

Page 14: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

14

Coordinate mondoWC world co-ordinates

Coordinate schermoSC screen co-ordinates

window viewport

Window in WC: (xmin, ymin), (xmax,ymax)

Viewport in WC: (umin,vmin), (umax,vmax)

(xmin, ymin)

(xmax,ymax)

(umin,vmin)

(umax,vmax)

Page 15: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

15

Traslazione: (-xmin,-ymin)

Scala: umax−umin

xmax−xmin

,vmax−vmin

ymax−ymin

⎝ ⎜ ⎜

⎠ ⎟ ⎟

Traslazione inversa : (umin,vmin)

Page 16: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

16

Caratteristiche di OpenGL(e di qualunque sistema grafico)

• maschera le funzioni device dependent

• È strutturata in primitive, attributi, funzioni di visualizzazione, funzioni di trasformazione funzioni di input, funzioni di controllo

User programGraphics system

APII/O devices

Function call output

inputdata

Page 17: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

17

Interfaccia di OpenGL

• I nomi di funzione iniziano con gl

• È composta di più librerie:– GL libreria principale

– GLU graphics utility library - contiene funzioni per definire primitive grafiche di uso frequente (sfere, e altri oggetti comuni)

– GLUT GL utility toolkit - interfaccia con il sistema di windowing (windows, mac, X-Window, ..)

Page 18: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

18

• Fa uso di macro per evitare costanti magiche (abbiamo visto GL_POINTS, ..)

• Le librerie sono incluse nel codice:

#include <GL/glut.h>

oppure

#include <glut.h>• Le primitive base sono specificate con punti (vertici):glBEGIN(type);

glVertex*(…);

glVertex*(…);

glEnd();

Page 19: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

19

• I tipi principali sono:

GL_POINTS

GL_LINES

GL_LINE_STRIP

GL_LINE_LOOP

p1p2

p3

p4p5

p1p2

p3

p4p5

p1p2

p3

p4p5

p1p2

p3

p4p5

segmenti

Page 20: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

20

Poligoni

Hanno diversi aspetti

Possono essere semplici e intrecciati

Convessi o non convessi

Page 21: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

21

Poligoni in OpenGL

GL_POLYGON simili a GL_LINE_LOOP, hanno un interno e un esterno, sono “fillati” sulla base degli attributi associati, il bordo non ha spessore, non tratta poligoni intrecciati; gli attributi sono assegnati con

glPolygonMode

GL_TRIANGLES, GL_QUADS casi speciali di poligoni, sequenze di punti sono interpretate come vertici di triangoli o quadrilateri

GL_TRIANGLE_STRIP, GL_QUAD_STRIP, GL_TRIANGLE_FAN triangoli o quadrilater con vertici in comune: si possono risparmiare coordinate!

Page 22: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

22

GL_TRIANGLE_STRIP GL_QUAD_STRIP GL_TRIANGLE_FAN

p0 p2 p4 p6

p1 p3 p5 p7

p0 p2 p4 p6

p1 p3 p5 p7

Page 23: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

23

I tipi di dati numerici

SuffixData Type Typical Corresponding OpenGL Type Definition C-Language Type

b 8 bit integer signed char GLbytes 16 bit integer short GLshorti 32 bit integer long GLint, GLsizeif 32 bit floating point float GLfloat, GLclampfd 64 bit floating point double GLdouble, GLclampdub 8 bit unsigned integer unsigned char GLubyte, GLbooleanus 16 bit unsigned integer unsigned short GLushortui 32 bit unsigned integer unsigned long GLuint, GLenum,

GLbitfield

Page 24: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

24

Il testo• Caratterizzato dalla fonte “character font”

• Testo “stroke” - o al tratto, definito con vertici e linee• Testo raster - definito con rettangoli di pixel on/off,

chiamati bit blocks, per massima efficienza sono implementate operazioni speciali sul frame buffer, bitblt (bit-block-transfer)

• OpenGL non ha funzioni per il testo, GLUT ha un set minimale di caratteri bitmap e stroke:

glutBitmapCharacter(GLUT_BITMAP_8_BY_13, c)

Page 25: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

25

Attributi di linee e poligoni

• Si distingue tra il tipo di primitiva e il modo in cui deve essere visualizzata

• Si adotta una nozione di binding degli attributi, permanente o temporaneo

• In “Immediate mode” gli attributi sono passati direttamente al sottosistema di output senza venir memorizzati

• Tipici attributi sono: dotted, dashed, solid per linee; bold, italic, .. per caratteri

Page 26: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

26

Colore• Il colore è descritto in OpenGL nello spazio

RGBglColor3f(1.0, 0.0, 0.0) rosso pieno

glClearColor3f(1.0, 0.0, 0.0) definito in RGBAlfa

glutSetColor(int color, GLfloat red, Glfloat blue,

Glfloat green) inizializza una LUT

Page 27: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

27

Visualizzare (viewing)• Visualizzare in 2D: window to viewport mapping, clipping

• Visualizzare in 3D: proiezioni e camera model– Clipping 3D

• Proiezioni ortografiche

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)

void glOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) equivale a far=1.0 near=-1.0

Page 28: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

28

Funzioni di controllo

• Interazione con la window: l’origine è in basso a sinistra; la window va inizializzata:

glutInit(int *argcp, char **argv)

glutCreateWindow(char *title)

glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE)

glutWindowSize(480,640)

glutInitWindowPosition(0,0)

• Rispettare i rapporti nella viewport (aspect ratio)void glViewport(GLint x, GLint y, Glsizei w, Glsizei h)

Page 29: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

29

Mettere tutto assieme

Main, draw_sierpinsky e myinit:

void glutMainLoop(void) esegue un loop di processamento di eventi se non ci sono eventi resta in loop, termina quando riceve un segnale di kill

void glutDisplayFunc(void (*func)(void)) la grafica viene spedita al display, func è il nome della funzione che veine chiamata quando il sistema di windowing rileva che OpenGL richiede di venire rinfrescato; questo accada almeno la prima volta; se mettiamo il nostro codice dentro func, essa viene eseguita una volta (non c’e’ interazione) e il disegno apparirà sullo schermo.

Page 30: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

30

mainvoid main(int argc, char** argv)

{

/* Standard GLUT initialization */

glutInit(&argc,argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

/* default, not needed */

glutInitWindowSize(500,500);

/* 500 x 500 pixel window */

glutInitWindowPosition(0,0);

/* place window top left on display */

glutCreateWindow("Sierpinski Gasket");

/* window title */

glutDisplayFunc(draw_sierpinsky);

/* display callback invoked when window opened */

myinit(); /* set attributes */

glutMainLoop(); /* enter event loop */

}

Page 31: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

31

myinit

#include <GL/glut.h>

void myinit(void)

{

/* attributes */

glClearColor(1.0, 1.0, 1.0, 1.0);

/* white background */

glColor3f(1.0, 0.0, 0.0);

/* draw in red */

/* set up viewing */

/* 500 x 500 window with origin lower left */

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0, 500.0, 0.0, 500.0);

glMatrixMode(GL_MODELVIEW);

}

Page 32: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

32

Altre caratteristiche di OGL

• È una macchina a stati, es. il colore corrente è uno stato

• Gli stati sono normalmente abilitati con glEnable() glDisable()

• Gli stati si possono interrogare, es: glGetBooleanv(), glGetDoublev(), glGetFloatv(), or glGetIntegerv()

• Alcune variabili hanno comandi di interrogazione specifici, es: glGetLight*(), glGetError(), or glGetPolygonStipple())

Page 33: 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure che realizza un API (application programmers interface)

33

Altre caratteristiche di OGL

• Gli stati si possono salvare e recuperare in uno stack (appendice B OGL Book, directory OGL_doc), es: glPushAttrib(), glPopAttrib()