L'apporto del sistema operativo alla programmazione OpenGL. Le API GL Extensions.
OpenGL è una libreria grafica molto potente ma per poterne sfruttare le capacità ed apprezzarne i risultati a schermo è necessario prima "collegare" il sistema operativo con essa, cioè si deve creare una zona dello schermo ben definita dove OpenGL e il sistema operativo concordino sul tipo di pixel da utilizzare, sulle sue caratteristiche e sulle rispettive competenze.
Solitamente la zona del video nella quale intendiamo disegnare è la classica finestra oppure lo schermo intero (modalità fullscreen), mentre il tipo di pixel rappresentato viene chiamato pixel format.
Una prima soluzione è quella di utilizzare la libreria GLUT (GL Utility Toolkit), una libreria che permette di scrivere codice per la creazione e la gestione delle finestre indipendente dal sistema operativo su cui si sta lavorando, una sorta di interfaccia standard. Nonostante sia una proposta allettante è poco utilizzata perchè è penalizzante in termini di prestazioni e si ha un controllo ridotto sulle impostazioni di alcune paramentri specifici del sistema.
Proprio per migliorare l'interazione tra sistemi operativi e OpenGL i primi dispongono di alcune API (Application Program Interface) conosciute come OpenGL Extension, create appositamente per comunicare con tale libreria.
Queste API si possono trovare nei seguenti Sistemi Operativi:
- Windows - WGL Extension (a partire dalle versioni 95 e NT)
- Apple Macintosh - AGL Extension
- IBM OS/2 Warp - PGL Extension
- X Window System - GLX Extension
Naturalmente per quanto riguarda X Window System di Linux/Unix è necessario far notare che a differenza di Windows, dove la GUI (Graphic User Interface) è parte del Kernel, esso non è altro che il Server grafico ed è trattato dal sistema operativo come un qualsiasi processo. In particolare il Server XFree86 è il più diffuso.
Il procedimento per collegare il Sistema Operativo ad OpenGL prevede la creazione di una finestra attraverso le normali API del Window System, la creazione del contesto OpenGL (glContext) e l'assegnazione di quest'ultimo alla finestra.
Il glContext riveste un ruolo molto importante perchè è su di esso che andremo a disegnare, evitando di utilizzare le API di disegno predisposte dal Window System.
Se sulla macchina dove viene eseguito un programma che si appoggia ad OpenGL non sono presenti i relativi driver non sarà possibile creare un Direct Render Context, ciò significa che l'applicazione non sarà in grado di creare il glContext e noi non vedremo nulla.
Le OpenGL extension più importanti che i sistemi operativi mettono a disposizione riguardano:
- Le richieste di informazioni sulle capacità dell'implementazione (hardware o software) OpenGL installata sulla macchina;
- La scelta di un pixel format adatto alle nostre richieste;
- La creazione e la distruzione di un glContext;
- L'assegnamento del glContext creato alla finestra del sistema operativo;
- La sincronizzazione delle operazioni di disegno con le richieste del sistema operativo;
- Lo scambio dei buffer;
- La creazione dei font;
Le API di sicronizzazione evitano che il Window System esegua delle chiamate sul programma quando OpenGL non ha ancora concluso il proprio lavoro e viceversa, ciò si dimostra di una certa importanza quando il programma client e il server OpenGL non sono sulla stessa macchina.
Lo scambio dei buffer è fondamentale per tutte le applicazioni OpenGL che normalmente utilizzano la tecnica del doppio buffer. Vale a dire che mentre viene visualizzato il buffer A le operazioni di disegno vengono svolte nell'area di memoria del buffer B, quando tali operazioni sono concluse i due buffer verranno scambiati, B verrà visualizzato mentre A sarà pronto per essere modificato. Grazie a tale tecnica si risolvono i fastidiosi problemi di sfarfallio dovuti al tentativo del monitor di visualizzare la memoria video quando si sta ancora disegnando su di essa.
Infine per quanto riguarda le funzioni per la creazione dei font, che si rivelano molto utili, hanno il compito di facilitare al programmatore il compito di visualizzare del testo in modalità grafica. Tramite queste funzioni è infatti possibile creare i bitmap di tutti i caratteri dei font disponibili sul sistema.
Il fatto che lo sviluppo delle API per l'interazione di OpenGL sia curato direttamente dai sistemi operativi facilita enormemente il lavoro della libreria che si deve preoccupare solamente di fornire una interfaccia standard (il glContext) valida per tutti i sistemi e quindi altamente portabile.