OpenGL Tutorial 1 – Aprire una Finestra

16 novembre

<- Prev | Indice | Next ->

Codice di esempio

Background

Le specifiche OpenGl non definiscono alcuna API per la creazione e gestione delle finestre. I moderni sistemi di gestione delle finestre che supportano OpenGL includono un sotto-sistema che fornisce i necessari binding tra il constesto OpenGL e il gestore delle finestre. Nell’X Window System quell’interfaccia è chiamata GLX. Microsoft fornisce WGL (pronunciato: wiggle) per Windows e MacOS ha CGL. Lavorare direttamente con queste interfacce per creare una finestra nella quale mostrare la grafica di solito è un lavoro sporco il che è il motivo per la quale usiamo una libreria a più alto livello che astrae i dettagli. La libreria che useremo qui si chiama ‘OpenGL utility library‘ o GLUT. Fornisce un’API semplificata per la gestione delle finestre e degli eventi, controlla dell’IO e un po’ di altri servizi. In più, GLUT è cross platform il che permette una maggior portabilità. Alternative a GLUT possono essere SDL e GLFW.

Analisi del codice


glutInit(&argc, argv);

Questa chiamata inizializza GLUT. I parametri possono essere passati direttamente dalla linea di comando e includono utili opzioni come ‘-sync’ e ‘-gldebug’ che disabilitano la natura asincrona di X e controllano automaticamente per errori di GL e li mostrano (rispettivamente).


glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

Qui configuriamo alcune opzioni di GLUT. GLUT_DOUBLE abilita il double buffering (disegnare su un buffer in background mentre un secondo buffer è mostrato a schermo) e il color buffer dove finisce la maggior parte del rendering. Di norma useremo queste opzioni insieme ad altre che vedremo poi.


GlutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");

Queste chiamate specificano i parametri della finestra e la creano. Si ha anche la possibilità di dare un titolo alla finestra.


glutDisplayFunc(RenderSceneCB);

Lavorare con un gestore delle finestre implica spesso che le interazioni con il programma avvengono per mezzo di callback legate a eventi. GLUT si prende cura delle interazioni con il sottostante gestore delle finestre e ci fornisce alcune callback, per l’appunto. Qui usiamo giusto la callback principale per fare tutto il renderering di un unico frame. Questa funzione viene continuamente chiamata dal ciclo interno di GLUT.


glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

Questo è il nostro primo incontro con il concetto di stato in OpenGL. L’idea di fondo è che il rendering è un compito così complesso che non può essere trattato come una funzione con pochi parametri (e le funzioni progettate correttamente non ricevono mai molti parametri.) Si devono specificare shaders, buffers e vari flag che modificano il come verrà fatto il rendering. In più, molto spesso si vorrà mantenere la stessa configurazione per molte operazioni di rendering (per seempio se non si disabilità il depth test non c’è alcuna necessità di specificarlo per ogni parte del render). Per questo motivo la cofigurazione del rendering viene impostata settando flag e valori nell’OpenGL state machine e le chiamate di rendering stesse richiedono quei pochi parametri necessari per ottenere le giuste informazioni. Dopo aver chiamato una funzione che altera lo stato di OpenGL questa configurazione rimane tale fino ad un’altra chiamata che ne cambi lo stato. La chiamata di sopra setta il color che sara utilizzato per pulire il frambuffer (che verrà descritto in futuro). Il colore ha 4 canali (RGBA) ed è specificato come un valore normalizzato tra 0.0 e 1.0.


glutMainLoop();

Questa chiamata passa il controllo a GLUT che ora inizia il suo ciclo interno. In questo ciclo ascolta per eventi dal gestore delle finestre e li fa passare tramite le callback preconfigurate. Nel nostro caso GLUT chiamerà solo la chiamata che abbiamo registrato come la chiamata di display (RenderSceneCB).


glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();

L’unica cosa che facciamo nella nostra funzione di render è pulire il framebuffer (usando il colore definito precedentemente – prova a cambiarlo). La seconda chiamata dice a GLUT di scambiare i ruoli tra backbuffer e frontbuffer. Nel prossimo tutorial faremo il rendering nel framebuffer e poi ne mostreremo il contenuto a schermo.

Indice

<- Prev | Indice | Next ->

Tags: