E-mail: coviello@deemail.poliba.it GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari E-mail: coviello@deemail.poliba.it
OpenGL OpenGL: È una libreria grafica che fornisce gli strumenti per disegnare una scena in una finestra. Assume di avere a disposizione una finestra su cui disegnare e pertanto non prevede alcuna funzionalità per la gestione delle finestre. E’ multipiattaforma e quindi utilizzabile sia su sistemi linux che windows
GLUT GLUT: È una libreria che fornisce le funzionalità per la creazione e gestione delle finestre. Gestisce anche l’interazione dell’utente con tali finestre Permette la creazione di finestre monolitiche e pertanto non fornisce gli strumenti per la creazione di interfacce grafiche come pulsanti, pannelli ecc. Le interazioni sono catturate attraverso delle funzioni callback. Tale callback viene associata a un certo tipo di evento provocato dall’utente sulla finestra (esempio di evento: click col pulsante destro del mouse)
Cenni al linguaggio C Le parti fondamentali di un programma sono: una Global Declarative Part il Main Program le Funzioni e le Procedure I commenti
Linguaggio C La Global Declarative Part contiene la dichiarazione dei simboli che potranno essere referenziati in tutto il programma. La dichiarazione può essere diretta o indiretta. Nella dichiarazione diretta compaiono esplicitamente gli elementi globali (Costanti, Variabili, ecc.), in quella indiretta invece, compaiono i nomi di contenitori (Librerie) al cui interno si trovano i simboli che si necessita referenziare. Il Main Program è individuato dalla parola chiave main ( ) una DeclarativePart, che contiene la dichiarazione degli elementi disponibili nel programma principale; una ExecutablePart, racchiusa tra i simboli { }, che contiene le Istruzioni eseguibili da cui è composto il programma.
Linguaggio C Le Funzioni e Procedure hanno una struttura analoga a quella del Main Program. Un Commento, che non è influente dal punto di vista esecutivo perchè non considerato dal programma di traduzione, è delimitato dai simboli /* e */ Per inserire una sola riga di commento basta farla precedere da //
Un tipico programma La Global Declarative Part contiene la dichiarazione degli Header file delle librerie che verranno utilizzate in fase di compilazione. #include <stdio.h> /*La libreria standard di I/O consente di effettuare operazioni di lettura/scrittura su dispositivi logici e fisici, come files, linee seriali, e periferiche in genere. */ #include <GL/glut.h> /* Dichiarazione dell’header file della libreria GLUT */
Il main Il main del programma contiene le seguenti parti. Inizializzazione glutInit(&argc, argv); /* richiede al sistema operativo le risorse per aprire una finestra su cui poter disegnare*/ glutInitDisplayMode(GLUT_RGB); /* Stabilisce le caratteristiche della finestra. In particolare GLUT_RGB stabilisce che venga supportato il formato RGB per i colori*/ Creazione delle finestre glutInitWindowSize(500, 500); /* stabilisce le dimensioni della finestra in cui disegnare*/ glutCreateWindow(“esempio"); /*crea la finestra e specifica il titolo che comparirà sulla barra della finestra*/
Il main Registrazione di funzioni callback definite dall’utente. Ogni programma deve comunque contenere almeno una callback che viene richiamata ogniqualvolta la finestra diventa visibile glutDisplayFunc(display); /*la funzione definita dall’utente si chiamerà display e conterrà il codice openGL che descrive la scena da disegnare*/ Innesco del loop principale che è un ciclo senza fine glutMainLoop(); /* rende visibile la finestra e attende l’accadimento di un evento associato a una callback*/
Callback di visualizzazione In questa funzione viene inserito tutto il codice openGL. La funzione è richiamata ogni qualvolta la finestra viene resa visibile. Alcune delle parti principali sono: Pulizia del buffer dove si andrà a disegnare glClear(GL_COLOR_BUFFER_BIT); Assegnazione degli attributi e chiamata delle primitive
Le primitive di OpenGL Le primitive grafiche di OpenGL vengono specificate da una lista di vertici. A seconda della primitiva specificata i vertici assumono un significato diverso La lista dei vertici si trova sempre racchiusa da due istruzioni di inizio e fine della primitiva: glBegin(NOME_PRIMIITVA); (…) glEnd();
Esempi di primitive GL_POINTS: la lista dei vertici rappresenta un punto nello spazio GL_LINES: ogni coppia di vertici consecutivi formano gli estremi di un segmento GL_LINE_STRIP: permette il disegno di una spezzata. Una linea unisce il vertice corrente col successivo GL_LINE_LOOP: come GL_LINE_STRIP a parte il fatto che l’ultimo vertice viene unito con il primo GL_TRIANGLES: permette il disegno di triangoli utilizzando tre vertici consecutivi
Attributi Per modificare alcune proprietà delle primitive è possibile utilizzare delle funzioni per modificare gli attributi. La specifica di questi attributi deve essere fatta prima dell’utilizzo della primitiva. glPointSize(5.0); /*fissa la grandezza dei punti mediante un valore floating. Il valore di default è 1.0*/ glLineWidth(5.0); /*fissa lo spessore dei segmenti mediante un valore floating Il valore di default è 1.0 */
Esempio 1 #include <GL/glut.h> //disegno dei vertici di un quadrato void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPointSize(3.0); glLineWidth(3.0); glColor3f (0.4, 0.1, 0.2); glBegin(GL_POINTS); glVertex2f(-0.5,-0.5); //vertice in basso a sinistra glVertex2f(-0.5,0.5); //vertice in alto a sinistra glVertex2f(0.5,0.5); //vertice in alto a destra glVertex2f(0.5,-0.5); //vertice in basso a destra glEnd(); } void main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB); glutInitWindowSize(500, 500); glutCreateWindow(“esempio"); glutDisplayFunc(display); glutMainLoop();
Output
Esempio 2 Utilizzando la stessa lista di vertici e cambiando la primitiva GL_POINTS in GL_LINES si ottiene il seguente output
Esempio 3 Utilizzando la stessa lista di vertici e cambiando la primitiva GL_POINTS in GL_LINE_LOOP si ottiene il seguente output