OpenGL ed estensioni

OpenGL non è una liberia grafica. Esso è uno standard, un'API libera che può (deve, allo stato attuale) essere implementata dai produttori di schede video per essere compatibili con le applicazioni che usano l'accelerazione 3D.

Però, è risultato presto evidente che la grande varietà di schede video in commercio implementa funzioni specifiche che sono molto diverse tra loro. Perciò, a fianco dell'API di base di openGL, che implementa le funzioni grafiche più comuni, sono state create le estensioni, che il produttore può decidere se implementare oppure no.

Prima di poter usare un'estensione è necessario interrogare il driver della scheda video corrente per sapere se quella particolare funzione è implementata. Per questo esiste l'istruzione openGL:

glGetString(GL_EXTENSIONS)

che ritorna una stringa 0-terminata (GLchar *). Essa contiene un certo numero di nomi di estensioni, separate da spazi, che identificano le estensioni supportate dal driver.

A questo punto, si dovrebbe ottenere in qualche modo il puntatore al punto di ingresso di ciascuna funzione dell'estensione che il programma deve chiamare all'interno del driver. Si tratta di un procedimento molto complicato e a rischio di errore. Sostanzialmente, consiste nel dichiarare puntatori a funzione e poi inizializzarli chiamando ripetutamente all'interno del codice una delle funzioni

void(*)() wglGetProcAddress(const char * nome);     // per Windows 
void(*)() glXGetProcAddress(const char * nome);     // per i sistemi operativi basati su X

che ritornano un puntatore a funzione ad ogni chiamata.

Per evitare di individuare i puntatori alle funzioni a mano, è possibile usare una libreria che esegua queste funzioni automaticamente. In fase di inizializzazione, queste librerie ricercano automaticamente tutte le funzioni disponibili all'interno della libreria del driver e assegnano ad esse nomi convenzionali.

Specialmente per attivitą sperimentali, queste librerie sono un'ottima soluzione, perchč ha come unici svantaggi un (trascurabile) ritardo durante la fase di inizializzazione, una maggiore occupazione di memoria e la necessitą di includere una libreria in pił nell'eventuale distribuzione del programma.

In ogni caso, l'uso di queste librerie non estende in alcun modo le funzionalità offerte dal driver, si limita al massimo a cambiare il nome ad alcune funzioni. Perciò si può incorrere in gravi malfunzionamenti se la funzione richiesta non è implementata dal driver.

Una libreria molto usata per accedere alle estensioni è GLEW (openGL Extension Wrangler). GLEW fornisce un unico header che include l'header originale di OpenGL (gl.h), GLU e i nomi delle funzioni per tutte le estensioni disponibili.

Per usare GLEW, per prima cosa ci si deve procurare la libreria in formato binario. Può essere ottenuta per download diretto dal sito, per Windows, oppure compilata in locale a partire dai sorgenti. In molte distribuzioni di Linux a pacchetti, inoltre, il binario precompilato può essere installato automaticamente dal sistema operativo.

La direttiva di inclusione da aggiungere è (in molte installazioni):

#include <GL/glew.h>

Questo include già gli header di OpenGL gl.h e glu.h. Invece, se è necessario GLUT deve essere incluso a parte.

La libreria deve essere inizializzata tramite la funzione

glewInit()

È possibile verificare se una particolare estensione è supportata dal driver con la funzione:

GLboolean glewIsSupported(const char * estensione)

Ad esempio:

glewIsSupported("GL_EXT_geometry_shader4")    // ritorna true se i geometry shader sono supportati 

Inoltre, GLEW può controllare la presenza del supporto completo per particolari versioni di openGL. Tra le più importanti:

glewIsSupported("GL_VERSION_2_0")    // OpenGL 2.0: vertex e fragment shaders 
glewIsSupported("GL_VERSION_2_1")    // OpenGL 2.1: primo supporto per geometry shaders 
glewIsSupported("GL_VERSION_3_2")    // OpenGL 3.2: geometry shaders 
glewIsSupported("GL_VERSION_4_0")    // OpenGL 4.0: tessellation shaders 

A questo punto, le estensioni di OpenGL possono essere utilizzate senza ulteriori operazioni.


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.