Creare un Program

La creazione di un program è simile alla creazione di uno shader. Ci sono quattro passaggi:

  1. Creazione;
  2. Aggiunta degli shader;
  3. Linking;
  4. Usare il program.

Creazione

Per creare un nuovo program, basta chiamare la funzione:

GLuint glCreateProgram();

che ritorna l'id del program creato, o 0 se la creazione è fallita.

Aggiunta degli shader

Un program è una raccolta di shader, perciò bisogna indicare quali shader ne fanno parte. Per questo esiste la funzione:

void glAttachShader(GLuint  program,  GLuint  shader);

In program deve essere messo l'id del program, in shader l'id dello shader (già esistente) che deve essere collegato. Con più chiamate è possibile collegare più shader allo stesso program.

Linking

Una volta che tutti gli shader necessari sono stati aggiunti all'interno di un program e sono stati compilati singolarmente, la procedura di Linking collega insieme questi shader e rende il program utilizzabile.
Dopo il linking il program è ancora modificabile (anche se di solito non c'è motivo per farlo), ma è necessario un nuovo linking perchè le modifiche divengano effettive.

void glLinkProgram(GLuint  program);

Come sempre, program è l'id del program.

Anche il linking, come la compilazione degli shader, può fallire. Ad esempio, una funzione di cui è stato dichiarato solo il prototipo, ma non è mai stata definita in nessuno shader, verrà rilevata solo in questa fase.

Il rilevamento degli errori è del tutto simmetrico a quello degli shader. Con la funzione:

void glGetProgramiv(GLuint program, GLenum pname, GLint * params);

si ottiene l'intero puntato da params uguale a GL_TRUE se il linking ha avuto successo, GL_FALSE altrimenti. program è l'id del program, mentre pname deve essere uguale a GL_LINK_STATUS.

Anche i program hanno il loro InfoLog, accessibile con la funzione:

void glGetProgramInfoLog(GLuint id, int maxLength, int *length, char *log);

Dove, questa volta, id è l'id del program.

Per ottenere la lunghezza dell'InfoLog senza ritirarlo:

void glGetProgramiv(GLuint program, GLenum pname, int *param);

Dove program è l'id del program, pname è GL_INFO_LOG_LENGTH. Il numero richiesto viene scritto nell'intero puntato da param.

Usare il program

L'attivazione di un program indica alla GPU che dovrà usare quel program per le operazioni successive. Mentre i passaggi precedenti vengono fatti di solito in fase di inizializzazione, questa può (dovrebbe) essere effettuato appena prima di disegnare la scena.
La funzione per attivare un program è:

void glUseProgram(GLuint id);

dove id è l'id del program che deve essere usato. L'id fittizio 0, che non può mai essere ottenuto per un program valido, indica la Fixed Function Pipeline. Quando viene usato provoca la disattivazione di tutti i program e il ripristino delle funzionalità di default.

È possibile integrare chiamate a glUseProgram all'interno di display list.


Copyright © 2011 Riccardo Monica
Eccetto ove espressamente indicato altrimenti, il contenuto di questa pagina è disponibile secondo la licenza Creative Commons Attribuzione - Condividi allo stesso modo 3.0.