• Non ci sono risultati.

Gli shader visti per la realizzazione delle tecniche presentate nei precedenti capitoli (che sono una semplicazione di quelli eettivamente integrati nella VR3Lib) sono

CAPITOLO 4. REALIZZAZIONE DELLE TECNICHE PRESENTATE 137 solo un sottoinsieme di tutti gli shader che sono stati scritti e inseriti nella nuova libreria per implementare funzionalità built-in.

Non esaminiamo la struttura di tutti gli shader che sono stati scritti per la rea- lizzazione di ulteriori funzionalità, tuttavia mettiamo in evidenza che nella VR3Lib sono stati integrati anche degli shader per:

• disegnare uno sfondo caricando un'immagine specicata dall'utente (sfondo statico);

• disegnare la skybox (tecnica vista nel par. 2.1.5), intesa come un tipo particolare di sfondo;

• disegnare del testo specicato dall'utente, sia come entità nello spazio tridi- mensionale che come semplice messaggio di testo in una data posizione della nestra OpenGL.

Tutti questi shader aggiuntivi, insieme a quelli visti precedentemente, sono inseriti nella nuova libreria come stringhe costanti contenenti frammenti di codice GLSL. Il corpo completo degli shader viene costruito a tempo di esecuzione sulla base delle operazioni richieste dall'utente. Gli shader completi di tutti il codice sorgente vengono poi compilati e collegati per formare degli shader program da usare nella pipeline OpenGL. Questa compilazione a tempo di esecuzione può avere un certo peso sul tempo di startup dell'applicazione. Un approccio alternativo sarebbe quello di mantenere una cache di shader precompilati da utilizzare ad ogni esecuzione (che viene riempita quando si compilano nuovi shader), vedi capitolo 7.

Capitolo

5

Struttura e Funzionamento della VR3Lib

Nel capitolo 4 abbiamo visto come realizzare le tecniche di rendering esaminate in precedenza tramite l'utilizzo di shader scritti in linguaggio GLSL; la struttura vista per questi shader è simile a quella presente eettivamente all'interno della nuova libreria.

In questo capitolo esaminiamo come la VR3Lib è stata organizzata in moduli e classi. Faremo occasionali riferimenti alla struttura della precedente libreria per mettere in evidenza le dierenze con la nuova versione. È necessario tenere presente che l'obiettivo principale della libreria realizzata durante il lavoro di tesi è quel- lo di riuscire a renderizzare scene ad elevato livello di realismo dove gli oggetti si comportino in modo sicamente plausibile. Non ci si propone dunque di reimple- mentare tutte le funzionalità proprie della vecchia VRLib (che aveva come obiettivo principale un'elevata essibilità).

La libreria risultante fornisce all'utente un'interfaccia molto semplice simile a quella della VRLib, e anche le funzionalità aggiunte che non erano previste nella vec- chia libreria sono state inserite mantenendo il paradigma di utilizzo della precedente versione.

In analogia con la precedente VRLib, la nuova libreria assume che ogni utilizzo da parte dell'utente avvenga solamente dopo che la nestra dell'applicazione è stata creata e il contesto OpenGL allocato. Sotto queste condizioni, tipicamente si proce- de inizializzando la libreria ed eseguendo alcune operazioni di startup (come caricare le mesh per gli oggetti virtuali), per poi iniziare il ciclo principale dell'applicazione che esegue un rendering continuo e si occupa di gestire l'input da parte dell'utente. La gestione del usso di esecuzione dell'applicazione non è a carico della libreria VR3Lib. Si possono sfruttare delle librerie per impostare questo tipo di esecuzione

CAPITOLO 5. STRUTTURA E FUNZIONAMENTO DELLA VR3LIB 139 tramite una serie di callback, per avere una gestione appropriata dei comandi del- l'utente e per inizializzare la nestra e il contesto OpenGL: un esempio è la libreria open source e cross-platform freeglut (progettata per sistemi Windows e Unix-like). Un'applicazione minimale che sfrutta la libreria VR3Lib potrebbe avere la seguente forma:

VR3Scene * scene ; // reference to a scene VR3Obj * obj ; // reference to an object // Executed at startup

OnInit () {

VR3Init (); // initialize VR3Lib

scene = new VR3Scene (WIDTH , HEIGHT ,60.0 f); // create a scene obj = new VR3Obj (" obj . AAM "); // create an object

obj -> SetPosition (0.0f, 0.0f, -2.0f); // set the object position }

// Executed once per frame OnFrame () {

scene -> Begin (); // begin scene rendering obj -> Draw (); // draw the object

scene -> End (); // end scene rendering }

// Executed on exit OnExit () {

delete obj ; // destroy the object delete scene ; // destroy the scene VR3Deinit (); // deinitialize VR3Lib }

dove si nota la semplicità dell'interfaccia esportata verso l'utente. L'applicazione minimale di cui sopra non fa altro che creare un oggetto virtuale obj caricando delle informazioni da un le `obj.AAM' e disegnarlo ogni frame davanti alla telecamera a distanza di due unità (di default infatti la telecamera è nell'origine e guarda verso l'asse negativo delle z).

5.1 Librerie Utilizzate dalla VR3Lib

I puntatori a funzione necessari per eettuare con successo le chiamate OpenGL vengono gestiti nella VR3Lib tramite l'utilizzo della libreria open source e cross- platform GLEW (OpenGL Extension Wrangler Library), questa si occupa di fornire

alla VR3Lib tutti gli entry point per le chiamate OpenGL interrogando opportuna- mente il display driver e gestisce anche le chiamate relative alle estensioni disponibili sulla particolare macchina. Nella libreria VRLib invece non si usava alcun modulo esterno per la gestione delle chiamate OpenGL e delle estensioni (l'interrogazione del display driver avveniva direttamente ad opera della VRLib).

Una libreria da sfruttare per il rendering di scene virtuali deve essere in grado di caricare correttamente immagini memorizzate in le esterni con una certa varietà di formati (ad esempio per la costruzione di texture). La VRLib sfrutta per le sue operazioni sulle immagini la libreria cross-platform PaintLib (contenente solamente le funzionalità essenziali) la quale ha il vantaggio di essere estremamente semplice e lightweight16, con la conseguenza che sfruttando tale libreria siamo in grado di

mantenere le dimensioni della VRLib entro limiti accettabili. Le dimensioni sono un parametro fondamentale perché si ricorda che le VRLib sono il componente prin- cipale del motore XVR, e, siccome questo può venire scaricato dinamicamente da un server per eseguire applicazioni tridimensionali interattive online, è necessario mantenere delle dimensioni contenute. Nonostante la VR3Lib sia stata scritta come libreria generica per applicazioni di realtà virtuale ad elevato livello di realismo, in futuro si prevede di integrare la nuova libreria all'interno del sistema XVR: dunque il parametro delle dimensioni è importante anche per la nuova libreria.

Nella VR3Lib si è deciso di non sfruttare più i servizi oerti dalla PaintLib (la cui manutenzione è cessata nel 2005), ma di adarsi invece alla libreria cross-platform DevIL (Developer's Image Library) che risulta più potente, supporta una grande va- rietà di formati e viene ancora mantenuta. La libreria DevIL può venire congurata a tempo di compilazione per integrare solamente un sottoinsieme delle funzionalità e possiamo restringere a piacimento i formati dei le da supportare. Grazie a que- sta personalizzazione delle funzioni esportate dalla libreria, si riescono ad ottenere delle dimensioni molto ridotte e come vantaggio ulteriore è possibile semplicemente ricompilare la libreria qualora si vogliano aggiungere delle funzionalità precedente- mente non supportate. Sfruttando DevIL è inoltre possibile caricare immagini ad elevato range dinamico memorizzate nel formato Radiance RGBE (par. 2.1.5), ma queste non sono supportate da PaintLib.

Ricordando che la nuova libreria integra anche un supporto alla simulazione sica in tempo reale di corpi rigidi, si sfruttano i servizi del motore sico Nvidia PhysX che si occupa di gestire tutti gli aspetti della simulazione (compresa la generazione di

16 Un software si dice `lightweight' quando le risorse di calcolo richieste per la sua esecuzione sono molto contenute.

CAPITOLO 5. STRUTTURA E FUNZIONAMENTO DELLA VR3LIB 141 ussi di esecuzione appositi). Le precedenti librerie sono state scelte cross-platform per facilitare l'estensione della VR3Lib a sistemi Unix-like, ma purtroppo il PhysX SDK17 (che contiene le librerie dinamiche che costituiscono il motore sico) è di-

sponibile nelle ultime versioni soltanto per sistemi Windows (e noi utilizziamo la versione più recente al momento della stesura, la 2.8.4).

Sia GLEW che DevIL sono state compilate generando librerie statiche che sono state integrate nella VR3Lib a tempo di compilazione (in un unico le). Le librerie PhysX purtroppo sono disponibili gratuitamente solamente nella versione precom- pilata (un insieme di le .dll che implementano le funzionalità del motore). Queste librerie dinamiche dovranno venire distribuite insieme al motore XVR per suppor- tare la simulazione sica tramite PhysX (in particolare si tratta di 3 le .dll per un totale di circa 4 MB); naturalmente i le saranno necessari solamente quando le funzionalità di simulazione sica vengono eettivamente utilizzate.

Visto che PhysX non è disponibile su sistemi non Windows, opportuni ag di compilazione sono stati previsti per disabilitare completamente la porzione della VR3Lib relativa alla simulazione sica, in modo tale da facilitare l'estensione della libreria a sistemi Unix-like.