1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure...
-
Upload
marco-marinelli -
Category
Documents
-
view
214 -
download
0
Transcript of 1 Programmazione grafica 1 Daniele Marini. 2 Linguaggio di riferimento OpenGL: libreria di procedure...
1
Programmazione grafica1
Daniele Marini
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
3
Disegnare al tratto - “Line drawing”
Il plotter a penna
moveto (x,y)lineto (x,y)
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?
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
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
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
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();
9
Triangolo di SierpinskyIl programma seguente traccia un triangolo di Sierpinskyper punti
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
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
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
Spazio mondo /Spazio schermo
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)
15
Traslazione: (-xmin,-ymin)
Scala: umax−umin
xmax−xmin
,vmax−vmin
ymax−ymin
⎛
⎝ ⎜ ⎜
⎞
⎠ ⎟ ⎟
Traslazione inversa : (umin,vmin)
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
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, ..)
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();
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
20
Poligoni
Hanno diversi aspetti
Possono essere semplici e intrecciati
Convessi o non convessi
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!
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
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
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)
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
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
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
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)
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.
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 */
}
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);
}
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())
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()