La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Informatica Grafica OpenGL1 l Libreria grafica composta da circa 150 comandi. Realizzata in vari linguaggi (noi useremo quella in C). l Sviluppato dalla.

Presentazioni simili


Presentazione sul tema: "Informatica Grafica OpenGL1 l Libreria grafica composta da circa 150 comandi. Realizzata in vari linguaggi (noi useremo quella in C). l Sviluppato dalla."— Transcript della presentazione:

1 Informatica Grafica OpenGL1 l Libreria grafica composta da circa 150 comandi. Realizzata in vari linguaggi (noi useremo quella in C). l Sviluppato dalla Silicon Graphics. Originariamente si chiamava IRIS GL. Ora è gestito da un comitato indipendente che controlla e modifica lo standard. Disponibile gratuitamente su molte piattaforme (Windows e UNIX). l Pensato per essere hardware-independent. Per ottenere questo scopo, non contiene comandi per gestire le finestre.

2 Informatica Grafica OpenGL2 Struttura OpenGL l OpenGL è una rendering library. Non ci sono strutture predefinite come in PHIGS, lavora in immediate mode. Per costruire oggetti complessi e modificarli si usano librerie costruite sopra OpenGL (Es. OpenInventor). l OpenGL usa un insieme di primitive abbastanza ridotto. Inoltre non scrive direttamente sullo schermo ma accede ad un framebuffer. l OpenGL è una state-machine. Le variabili di stato guidano il rendering.

3 Informatica Grafica OpenGL3 Pipeline Grafica Lo schema di esecuzione di un programma OpenGL è il seguente:

4 Informatica Grafica OpenGL4 Librerie

5 Informatica Grafica OpenGL5 Primo Esempio main() {OpenAWindow(); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); glBegin(GL_POLYGON); glVertex3f(0.25, -0.25, 0.0); glVertex3f(0.75, 0.25, 0.0); glVertex3f(0.75, 0.75, 0.0); glVertex3f(0.25, 0.75, 0.0); glEnd();glFlush; KeepTheWindow(); }

6 Informatica Grafica OpenGL6 Convenzioni l Tutti i comandi hanno il prefisso gl e seguono le stesse regole di Java. Es: glClearColor. l Costanti e variabili di stato sono scritte tutte in maiuscolo, iniziano con GL_ e le parole sono separate da _. Es: GL_COLOR_BUFFER_BIT. l I tipi in OpenGL hanno dei nomi interni che incominciano per GL, del tipo: GLbyte, GLshort, GLint, GLfloat, GLdouble

7 Informatica Grafica OpenGL7 Sintassi Molti comandi finiscono con 2 suffissi (es.: glVertex2f() ). Il primo (2) denota il numero di argomenti, mentre il secondo (f) denota il tipo (float). I tipi ammessi sono: b8-bit integerub8-bit unsigned integer s16-bit integerus16-bit unsigned integer i32-bit integerui32-bit unsigned integer f32-bit floating-pointd64-bit floating-point Alcuni comandi possono prevedere un terzo suffisso (v) per indicare che si applicano a vettori.

8 Informatica Grafica OpenGL8 GLUT l GLUT = OpenGL Utility Toolkit l Gestisce:creazione di finestre, unità di input (mouse e tastiera), menu, solidi, ecc... l Disponibile su molte piattaforme (UNIX, Windows, Mac), permette di scrivere codice portabile. l Adatto ad applicazioni semplici. Per applicazioni complete meglio usare i comandi del sistema operativo specifico.

9 Informatica Grafica OpenGL9 Struttura l GLUT gestisce completamente il funzionamento del programma, ma demanda ad openGL la generazione dellimmagine. l Le funzioni principali sono: glutInitglutInitDisplayMode glutInitWindowPositionglutInitWindowSize glutCreateWindowglutMainLoop glutDisplayFuncglutPostRedisplay

10 Informatica Grafica OpenGL10 Esempio (1) int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutCreateWindow (hello); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }

11 Informatica Grafica OpenGL11 Esempio (2) void init(void) {glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); } void display( void ) {glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex3f(0.25, 0.25, 0.0);glVertex3f(0.75, 0.25, 0.0); glVertex3f(0.25, 0.25, 0.0);glVertex3f(0.25, 0.25, 0.0); glEnd(); glFlush(); }

12 Informatica Grafica OpenGL12 Colore in OpenGL l Il colore viene (normalmente) specificato nel formato RGBA, dove A sta per Alpha che specifica la trasparenza del pixel (tenuta in considerazione se siamo in modalità Blending). l Il colore è una variabile di stato, un disegno viene fatto nel colore attivo.

13 Informatica Grafica OpenGL13 Buffers l OpenGL mantiene in memoria almeno 4 buffers: TipoIdentificativo Color buffer GL_COLOR_BUFFER_BIT Depth buffer GL_DEPTH_BUFFER_BIT Accumulation buffer GL_ACCUM_BUFFER_BIT Stencil buffer GL_STENCIL_BUFFER_BIT Nel Color buffer vengono memorizzate le immagini. Il Depth buffer serve per leliminazione delle parti nascoste. Lo Stencil buffer serve per restringere il disegno e lAccumulation buffer per area di lavoro.

14 Informatica Grafica OpenGL14 Inizializzazione Buffers l glClearColor setta il colore RGBA da usare per loperazione di glClear del Color Buffer. l glClearDepth setta il valore di profondità da usare per loperazione di glClear del Depth Buffer. l glClear inizializza il buffer (o i buffers) che contengono usando il propri clear values correnti.

15 Informatica Grafica OpenGL15 Primitive La primitiva fondamentale è la lista di vertici, che viene usati per diversi oggetti grafici: Punti: GL_POINTS Linee: GL_LINES, GL_LINE_STRIP,GL_LINE_LOOP Quadrilateri: GL_QUADS, GL_QUAD_STRIP Poligoni: GL_POLYGON Triangoli: GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN Le liste di vertici sono racchiuse tra: glBegin( ); ….. glEnd();

16 Informatica Grafica OpenGL16 Disegno Primitive Ogni primitiva viene disegnata in modo diverso. GL_POINTSSolo i vertici GL_LINESLe linee da 0 ad 1, da 2 a 3, etc GL_POLYGONIl poligono pieno GL_TRIANGLESI triangoli pieni formati dai vertici 0-2, 3-5, etc... GL_LINE_STRIPLa spezzata (non chiusa) che congiunge i vertici in ordine GL_LINE_LOOP La spezzata (chiusa) che congiunge i vertici in ordine

17 Informatica Grafica OpenGL17 Disegno Primitive (2) GL_QUADSI quadrilateri pieni formati dai vertici 0-3, 4-7, etc... GL_QUAD_STRIPI quadrilateri pieni formati dai vertici 0-3, 2-5, 4-7 etc... GL_TRIANGLE_STRIPI triangoli pieni formati dai vertici 0-2, 1-3, 2-4 etc... GL_TRIANGLE_FANI triangoli pieni formati dai vertici 012, 023, 034 etc...

18 Informatica Grafica OpenGL18 Disegno Primitive (3)

19 Informatica Grafica OpenGL19 Poligoni Si possono modificare gli stili di disegno di un poligono con il comando: glPolygonMode(Glenum face, Glenum mode); face specifica a quale faccia (davanti GL_FRONT, dietro GL_BACK, entrambe GL_FRONT_AND_BACK) si applica il mode, il quale vale GL_POINT, GL_LINE o GL_FILL (default). Convenzionalmente la faccia front vede i vertici in senso antiorario, ma si può modificare. Ad ogni vertice possiamo associare una normale (usata nel rendering) con glNormal();

20 Informatica Grafica OpenGL20 Disegno l OpenGL è pensato per unarchitettura hardware con pipeline. Per questo motivo, i comandi vengono memorizzati in un buffer ed eseguiti quando il buffer è pieno e la CPU è disponibile. Per forzare il disegno abbiamo 2 comandi: glFlush(); Forza lesecuzione dei comandi dati. termina immediatamente glFinish(); Forza lesecuzione dei comandi dati e termina solo dopo la loro esecuzione

21 Informatica Grafica OpenGL21 Visualizzazione in OpenGL

22 Informatica Grafica OpenGL22 Specifica Vista l La proiezione è definita da 2 matrici: GL_MODELVIEW : Porta gli oggetti in coordinate di vista. Analoga alla View Orientation, ma più generale. GL_PROJECTION : Porta il volume di vista nel volume canonico (Qui x, y, z tra -1 ed 1). Analoga alla View Mapping. Quale matrice viene modificata è un valore di stato. Modificato con glMatrixMode();

23 Informatica Grafica OpenGL23 Operazioni su Matrici l Operazioni fondamentali sono: glMatrixMode(mode)Sceglie la matrice da modificare GL_PROJECTION o GL_MODELVIEW glLoadIdentity()Inizializza allidentità glLoadMatrix(matrice)Carica una matrice 4x4 glMultMatrix(matrice)moltiplica, a destra, la matrice corrente per la matrice specificata

24 Informatica Grafica OpenGL24 Modelview Matrix l Modifica il disegno in modo che si possa applicare la matrice di proiezione. l Contiene il risultato di comporre un numero anche molto alto di trasformazioni. l In ogni momento memorizza la trasformazione necessaria a portare loggetto corrente in coordinate di vista.

25 Informatica Grafica OpenGL25 Matrici Trasformazione Le matrici di trasformazione vengono definite con i comandi: glTranslate*(x, y, z); Trasla di (x, y, z) glRotate*(angle, x, y, z); Ruota di angle (antiorario) rispetto alla retta da (x,y,z) allorigine glScale*(x, y, z); Scala sui tre assi Non esiste la trasformazione di shearing, ma si può inizializzare una matrice con 16 valori qualunque usando glLoadMatrix.

26 Informatica Grafica OpenGL26 Coordinate di vista l Per portarsi in coordinate di vista possiamo usare le trasformazioni viste oppure usare il comando gluLookAt(eyex,eyey,eyez, centerx,centery,centerz, upx,upy,upz) che porta in coordinate di vista partendo dalla situazione con losservatore in (eyex,eyey,eyez), il centro dellimmagine in (centerx,centery,centerz) ed il View up vector = (upx,upy,upz). Impone che il View Plane Normal sia la congiungente losservatore con il centro dellimmagine.

27 Informatica Grafica OpenGL27 Composizione Trasformazioni Le matrici si compongono sempre in modalità POSTCONCATENATE. Per rimpiazzare bisogna dare prima il comando glLoadIdentity(); Bisogna scrivere le trasformazioni in ordine inverso a quello in cui vengono applicate. l Le oprazioni si applicano sempre alla matrice corrente. Le matrici possono essere modificate durante lesecuzione.

28 Informatica Grafica OpenGL28 Esempio main () { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(-1.0, -1.0, 0.0); glRotatef(90.0, 0.0, 0.0, 1.0); glBegin(GL_POLYGON); glVertex3f(1.0, 1.0, 0.0); glVertex3f(2.0, 1.0, 0.0); glVertex3f(1.0, 2.0, 0.0); glEnd(); glFlush(); }

29 Informatica Grafica OpenGL29 Matrice di Proiezione l Bisogna modificare la matrice GL_PROJECTION l Assume che la trasformazione collegata alla matrice GL_MODELVIEW porti il sistema di vista a coincidere con gli assi coordinato (WC = VRC) e che il piano di proiezione sia diventato z = -d, cioè perpendicolare allasse z e sulle z negative.

30 Informatica Grafica OpenGL30 Proiezioni Prospettiche Proiezioni prospettiche. Il comando fondamentale è glFrustum(left, right, bottom, top, near, far) che definisce una matrice di proiezione dando i clipping planes (near e far) e la finestra (sul piano near). l Alternativa usando la libreria GLU: gluPerspective(fovy, aspect, near, far) Fornisce langolo di apertura sul piano xz (fovy), il rapporto della finestra w/h (aspect) il front ed il back plane.

31 Informatica Grafica OpenGL31 Proiezioni Prospettiche (2)

32 Informatica Grafica OpenGL32 Proiezioni Parallele Proiezioni parallele. Il comando fondamentale è glOrtho(left, right, bottom, top, near, far) che definisce una matrice di proiezione dando i clipping planes (near e far) e la finestra (su uno qualunque dei piani).

33 Informatica Grafica OpenGL33 Viewport Il viewport si definisce con il comando: glViewport(x, y, width, height); se non viene definito, per default si prende x=0, y=0 e width ed height uguali alla dimensione della finestra. Per non distorcere limmagine bisogna che width ed height siano nello stesso rapporto della larghezza ed altezza della finestra sul piano. l Può essere usato per avere più immagini nella stessa finestra. Ognuna occupa una parte.

34 Informatica Grafica OpenGL34 Operazioni su Matrici l OpenGL mantiene le matrici in degli stacks. Uno stack per la GL_MODELVIEW (dimensione almeno 32) ed uno per la GL_PROJECTION. l Le trasformazioni si applicano alla matrice top dello stack corrente. l Molto utili per memorizzare alcune matrici che devono essere applicate a più primitive. l Operazioni sugli stack sono: glPushMatrix()duplica la matrice affiorante e la inserisce in testa glPopMatrix()elimina la matrice affiorante.

35 Informatica Grafica OpenGL35 Esempio void disegna_bicicletta () { Posizionati nellorigine del modello, disegna il telaio; glPushMatrix(); glTranslatef(40,0,30); disegna prima ruota; glPopMatrix(); glPushMatrix(); glTranslatef(40,0,-30); disegna seconda ruota; glPopMatrix();

36 Informatica Grafica OpenGL36 Eliminazione Parti Nascoste Per default, OpenGL non elimina le parti nascoste, ma disegna gli oggetti nellordine in cui li incontra. Per eliminare le parti nascoste bisogna dare il comando: glEnable(GL_DEPTH_TEST); che rende attivo il Depth Buffer. Prima di usare il buffer bisogna però inizializzarlo con: glClear(GL_DEPTH_BUFFER_BIT); NOTA: Il comando glEnable si applica a tutte le variabili di stato booleane.

37 Informatica Grafica OpenGL37 Animazioni (1) l Luso maggiore di OpenGL non è per generare immagini, ma per fare delle animazioni. l Le animazioni richiedono di disegnare sullo schermo molte immagini in sequenza ad un ritmo di (possibilmente) almeno 30 al secondo. Esempio: apri finestra; for (i=0, i < massimo, i++) { pulisci la finestra; disegna immagine; aspetta fino ad (i+1)/30 secondi; }

38 Informatica Grafica OpenGL38 Animazioni (2) l Problemi: 1) Si nota che lo schermo viene pulito 2) Si vede mentre limmagine viene disegnata. 3) Limmagine non è stabile poiché lo schermo viene continuamente aggiornato

39 Informatica Grafica OpenGL39 Double Buffering (1) l Risolve (parzialmente) il problema dello sfarfallio (flickering) con la seguente tecnica: 1)Usa un secondo buffer dove viene effettuato il disegno. 2) Sostituisci il secondo buffer al primo solo dopo che è stato completamente disegnato.

40 Informatica Grafica OpenGL40 Double Buffering (2) l In OpenGL il double buffering viene gestito da GLUT (o dal sistema operativo). In GLUT abbiamo i comandi: glutInitDisplayMode(GLUT_DOUBLE) Dichiara che si useranno due buffers. Il primo viene presentato sullo schermo, mentre il disegno verrà fatto sul secondo. glutSwapBuffers() Scambia i due buffers, presentando il second sullo schermo.

41 Informatica Grafica OpenGL41 Esempio (1) int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutIdleFunc(spinDisplay); glutMainLoop(); return 0; }

42 Informatica Grafica OpenGL42 Esempio (2) #include #include static GLfloat spin = 0.0; void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(spin, 0.0, 0.0, 1.0); glColor3f(1.0, 1.0, 1.0); glRectf(-25.0, -25.0, 25.0, 25.0); glPopMatrix(); glutSwapBuffers(); } void spinDisplay(void) { spin = spin + 2.0; if (spin > 360.0) spin = spin ; glutPostRedisplay(); } void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); }

43 Informatica Grafica OpenGL43 Eliminazione parti nascoste l OpenGL ha built-in le procedure per leliminazione delle parti nascoste. Bisogna solo renderle attive. Questo richiede almeno 3 passi: 1) glutInitDisplayMode(GLUT_DEPTH | ……); Inizializza la finestra predisponendola per fare il controllo sulla profondità che elimina le parti nascoste 2) glEnable(GL_DEPTH_TEST); Abilita (in OpenGL) il controllo sulla profondità 3) glClearDepth();Sceglie il valore (tra 0 ed 1) di clear della profondità (per default vale 1). 4) glClear(GL_DEPTH_BUFFER_BIT); Inizializza il buffer che mantiene le informazioni sulla profondità

44 Informatica Grafica OpenGL44 Illuminazione l Per definire lilluminazione in OpenGL bisogna fare diversi passi: 1) Definire dei solidi, fornendo la normale uscente da ogni vertice; 2) Creare, selezionare e posizionare le sorgenti di luce; 3) Creare e selezionare un modello dilluminazione; 4) Definire le proprietà dei materiali presenti nella scena.

45 Informatica Grafica OpenGL45 Tipi di Luce l In OpenGL ci sono tre tipi di luce, ognuna con un proprio colore: 1) Ambiente; Luce dispersa dalla riflessione sulle superfici tale che non ha una direzione, ma illumina uniformemente tutti gli oggetti. 2) Diffusa; Luce che colpisce un oggetto e viene diffusa in tutte le direzioni 3) Speculare; Luce che colpisce un oggetto e viene diffusa principalmente in una direzione

46 Informatica Grafica OpenGL46 Attivazione Illuminazione l Per default lilluminazione non e attiva. Per renderla attiva bisogna dare i comandi: 1) glEnable(GL_LIGHTING); Attiva lilluminazione. 2) glEnable(GL_LIGHT0); Accende la luce 0. Necessario se no le luci non illuminano la scena. Quando e attiva lilluminazione il modello di disegno deve essere GL_SMOOTH, quindi bisogna dare il comando glShadeModel(GL_SMOOTH);

47 Informatica Grafica OpenGL47 Definizione Normali l Le normali uscenti dai vertici servono per calcolare quanta luce colpisce il vertice. Tutte le primitive glut solide (non wire) hanno già definite queste normali. Se non sono definite, si aggiungono nel comando glBegin(GL_POLYGON); glNormal3f(0.0,0.0, 1.0); glVertex3f(0.25, -0.25, 0.0); glNormal3f(0.0,0.0, 1.0); glVertex3f(0.75, 0.25, 0.0); glNormal3f(0.0,0.0, 1.0); glVertex3f(0.75, 0.75, 0.0); glNormal3f(0.0,0.0, 1.0); glVertex3f(0.25, 0.75, 0.0); glEnd();

48 Informatica Grafica OpenGL48 Creazione Sorgenti Luce l Specificate con il comando glLightfv(Glenum light, Glenum pname, TYPE *param) dove light e il nome della luce (GL_LIGHT0.. GL_LIGHT7 in molte implementazioni), pname e il parametro da settare e param un vettore di valori da assegnare al pname. I parametri più importanti sono: GL_AMBIENTGL_DIFFUSEGL_SPECULAR definiscono le caratteristiche della luce GL_POSITIONGL_SPOT_DIRECTION definiscono posizione (direzione se allinfinito) e orientamento (solo se al finito) della luce.

49 Informatica Grafica OpenGL49 Scelta del Modello l Specifica le caratteristiche del modello di illuminazione da usare per la visualizzazione (rendering) della scena. Comando: glLightModelfv(Glenum pname, TYPE *param) dove pname e il parametro da settare e param un vettore di valori da assegnare al pname. l Per ora useremo sempre il modello di default. Vedremo meglio le caratteristiche più avanti nel corso.

50 Informatica Grafica OpenGL50 Proprietà dei Materiali l Bisogna definire come gli oggetti presenti nella scena reagiscono alla luce. Specificato con il comando: glMaterialfv(Glenum face, Glenum pname, TYPE *param) dove face e la faccia (front, back o entrambe), pname e il parametro da settare e param un vettore di valori da assegnare al pname. I parametri più importanti sono: GL_AMBIENTGL_DIFFUSEGL_SPECULAR GL_SHININESSGL_EMISSION che definiscono il comportamento del materiale quando viene illuminato.

51 Informatica Grafica OpenGL51 Effetti Avanzati l OpenGL può generare i seguenti effetti: 1) Oggetti trasparenti. 2) Blending di immagini 3) Antialiasing 4) Nebbia (visibilità limitata) 5) Texture mapping (incluso mipmapping)

52 Informatica Grafica OpenGL52 Buffers l Il framebuffer di OpenGL e composto in realtà da un insieme di buffers, che sono: 1) Color buffers (almeno 2, spesso di più per la visione stereo). 2) Depth buffer 3) Stencil buffer Usato per ritagliare aree dello schermo 4) Accumulation buffer Accumula i risultati per effetti speciali come Motion Blur, simulare il fuoco, ombre,...

53 Informatica Grafica OpenGL53 Primitive non Piane l OpenGL permette di disegnare: 1) Poligoni non semplici Attraverso la tessellazione 2) Quadriche Tutte le superfici esprimibili con equazioni quadratiche in 2 variabili (sfere, cilindri, dischi,..) 3) Curve parametriche e Superfici parametriche Supporto per le curve e superfici parametriche di Bezier e NURBS

54 Informatica Grafica OpenGL54 Selezione e Feedback l OpenGL permette di selezionare e fare il picking degli oggetti sullo schermo fornendo le primitive necessarie l Inoltre e possibile interrogare OpenGL per controllare le coordinate (trasformate) ed il colore (dopo lilluminazione) degli oggetti.


Scaricare ppt "Informatica Grafica OpenGL1 l Libreria grafica composta da circa 150 comandi. Realizzata in vari linguaggi (noi useremo quella in C). l Sviluppato dalla."

Presentazioni simili


Annunci Google