Top Banner
1 Programmazione grafica 1 Daniele Marini
33

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

May 02, 2015

Download

Documents

Marco Marinelli
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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()