OpenGL, una macchina a stati

OpenGL è considerata una macchina a stati in quanto le operazioni da lei eseguite nel processare dati geometrici e pixel sono guidate dallo stato in cui si trovano i parametri interni, variando i parametri si ottengono risultati differenti.

I valori dei parametri sono accessibili attraverso delle funzioni create appositamente per questo scopo ed è quindi possibile cambiare lo stato della macchina in ogni punto del codice. Questo significa che durante le operazioni di disegno si può abilitare e disabilitare più volte una determinata capacità.
Ognuno di questo stati, sono diverse decine, entra in gioco in una o piu' fasi della rendering pipeline durante la quale viene coinvolto ogni aspetto della renderizzazione, dal tipo di primitiva di disegno, al colore, all'intensità della luce, ai filtri delle texture.

Le funzioni che OpenGL offre per acquisire i parametri sono le seguenti:
void glGetBooleanv(GLenum pname, GLboolean *params);
void glGetDoublev(GLenum pname, GLdouble *params);
void glGetFloatv(GLenum pname, GLfloat *params);
void glGetIntegerv(GLenum pname, GLint *params);

pname è il parametro di cui vogliamo sapere il valore mentre params è il puntatore alla zona di memoria dove verranno inseriti i dati di ritorno.

Ad esempio il codice seguente acquisisce nella variabile color il colore attuale:
float *color = new float[4];
glGetFloatv(GL_CURRENT_COLOR, color);

Un'ulteriore funzione molto semplice per controllare se una determinata modalità è attiva è :
GLboolean glIsEnabled(GLenum cap);
dove enum è la modalità da controllare.

Mentre le funzioni per l'acquisizione fanno parte di una stessa famiglia glGet* non esiste una controparte glSet per impostare i diversi valori, ma si utilizzano invece delle funzioni il cui nome può variare in base al parametro di cui si occupano.
Una funzione usata per un gran numero di operazioni che riguardano l'attivazione o la disattivazione di un parametro è :
void glEnable(GLenum cap);
e la sua inversa
void glDisable(GLenum cap);
dove cap è lo stato da modificare.

Un esempio di utilizzo:
if(glIsEnabled(GL_BLEND))
glDisable(GL_BLEND);
    
Altri parametri, come accennato, hanno funzioni apposite. Ne è un esempio la famiglia di funzioni glColor* per la gestione del colore e la famiglia di funzioni glLight* per la gestione delle fonti di luce.
Questo codice imposta bianco il GL_CURRENT_COLOR  
glColor3f(1.0, 1.0, 1.0);
Può rendersi necessario variare temporaneamente il valore di alcuni parametri per poi riportarli nella situazione iniziale, a questo scopo sono presenti le due funzioni glPushAttrib e glPopAttrib.
void glPushAttrib(GLbitfield mask);
void glPopAttrib(void);

La prima salva in uno stack i valori interessati dalla maschera di bit mask mentre la seconda ripristina il valori precedentemente salvati.

Privacy Policy