• Non ci sono risultati.

Nel capitolo 4 abbiamo esaminato come realizzare mediante shader GLSL le tecniche presentate nei capitoli 2 e 3. Il codice per gli shader visti è una semplicazione di quello che è stato eettivamente integrato nella VR3Lib; abbiamo inoltre detto che le stringhe di codice GLSL vengono modicate a run time durante la costruzione degli shader program in base alla combinazione di tecniche che bisogna utilizzare per i vari oggetti virtuali.

Non è ancora chiaro il momento in cui questi shader program vengano costruiti; bisogna inoltre ricordare che la VR3Lib è anche in grado di gestire shader esterni scritti dall'utente, ma no ad ora non si è discusso di come tale funzionalità sia stata realizzata.

La classe VR3ShaderManager è una classe non istanziabile che fornisce una serie di funzioni membro statiche e possiede un insieme di membri dati statici. Questa si occupa di gestire tutti gli shader integrati all'interno della VR3Lib che sono stati scritti in una forma simile a quella vista nel capitolo 4: questi frammenti di codice GLSL vengono memorizzati in stringhe costanti e prelevati dal VR3ShaderManager quando è necessario costruire un nuovo shader program.

Uno shader program viene costruito dal codice GLSL integrato nella VR3Lib solamente quando eettivamente i suoi servigi vengono richiesti. Supponiamo di cominciare la fase di inzializzazione caricando una mesh contenente un unico sub- set avente un materiale che contiene come unica texture una normal map. Quando l'oggetto di tipo VR3Mesh::Subset viene costruito bisognerà impostare il valore di VR3Mesh::Subset::shader_program: solo a quel punto si sfrutteranno le funzio- nalità del VR3ShaderManager causando la costruzione dello shader program per lo shading con normal mapping, senza diuse texture e senza displacement mapping. Questo tipo di approccio alla creazione degli oggetti solo quando eettivamente necessari si dice lazy instantiation ed è una tecnica molto comune per limitare il consumo di risorse di processing.

La classe VR3ShaderManager mantiene un insieme di identicatori OpenGL con- tenenti i nomi sul server GL degli shader program già compilati e collegati. In questo modo se uno stesso shader program viene nuovamente richiesto si evita una secon- da costruzione dello stesso (a partire dalle stringhe GLSL) risparmiando tempo e memoria lato server GL.

Naturalmente lo shader manager gestisce non solo gli shader program relativi al rendering degli oggetti virtuali nella scena, ma anche tutti gli altri shader integrati

CAPITOLO 5. STRUTTURA E FUNZIONAMENTO DELLA VR3LIB 153 nella VR3Lib: per il disegno di testo nella scena, per il rendering dello sfondo e per tracciare e ltrare shadow maps con tecnica EVSM. Ovviamente una funzionalità del genere non era prevista nella precedente VRLib in quanto non vi erano shader built-in da gestire in modo ottimale. Nella VR3Lib la classe VR3ShaderManager fornisce anche tutti i metodi per la compilazione e il collegamento di shader generici (impiegati naturalmente nella costruzione degli shader program built-in).

Come nella vecchia VRLib, anche nella VR3Lib è stata inserita una classe che rappresenta uno shader program denito dall'utente (la classe VR3ShaderProgram). Questo tipo di shader program viene costruito sulla base di codice GLSL fornito dall'utente come stringa o prelevato da un le esterno; la versione di GLSL utiliz- zata deve essere la 3.30 (infatti la denizione del preprocessore `#version' viene aggiunta dalla VR3Lib e dunque l'utente deve necessariamente adattarsi a questa versione). Uno shader program costruito da codice fornito dall'utente viene incapsu- lato in un oggetto di tipo VR3ShaderProgram, e l'utente può attivare per lo shading questo shader program chiamando la VR3ShaderProgram::Start() e disattivarlo chiamando la VR3ShaderProgram::Stop(). Se uno shader program esterno è attivo durante il disegno di una mesh, tale programma verrà utilizzato al posto di quelli di default per i vari subset (che vengono costruiti sulla base degli shader built-in). Il riferimento allo shader program esterno correntemente attivo viene mantenuto in un membro dati statico della classe VR3ShaderProgram (con la stessa struttura con cui un membro statico della classe VR3Scene mantiene un riferimento alla scena correntemente attiva).

Tramite la classe VR3ShaderProgram è possibile anche impostare il valore delle varie variabili uniform che l'utente può aver previsto negli shader forniti (particolari variabili uniform predenite nella VR3Lib verranno impostate con valori forniti in automatico dalla libreria, ad esempio i sampler per accedere alle texture associate al materiale). Gli ingressi al vertex shader denito dall'utente dovranno avere una forma nota simile a quella degli shader built-in (in questo modo riceveranno i dati relativi ai vertici come accade per gli shader visti nel capitolo 4). Le uscite del frag- ment shader dovranno avere una particolare forma per andare a scrivere il risultato nei giusti buer di colore (vedere la documentazione per maggiori dettagli). Nella vecchia VRLib è presente la classe VRShaderProgram con funzionalità molto simili, ma la classe VR3ShaderProgram estende il supporto anche ai geometry shader scritti dall'utente.

Per facilitare operazioni di rendering complesse (eseguite magari tramite shader deniti dall'utente), nelle VRLib e nelle VR3Lib è prevista una classe VR3FBO che

incapsula la gestione di un FBO (framebuer object) per il rendering o-screen. Il concetto di FBO è stato introdotto in sez. 4.7. Rispetto alla classe VRFbo presente nella vecchia VRLib, la nuova classe riesce a gestire rendering in diversi color buer contemporaneamente e ognuno di questi potrà venire utilizzato come texture in un successivo passo di rendering.

La struttura delle classi di cui abbiamo discusso in questa sezione è illustrata in g. 5.5.

Figura 5.5: Classi VR3ShaderProgram, VR3ShaderManager e VR3FBO

In gura vengono mostrati i membri dati privati e statici della classe VR3ShaderManager che contengono gli identicatori di tutti i programmi caricati. Ognuno di questi membri dati ha una particolare struttura idonea ad immagazzi- nare i nomi lato server GL di un certo tipo di shader program built-in nella nuova VR3Lib:

• ms_std_programs

Immagazzina gli identicatori degli shader program costruiti per fare rendering degli oggetti virtuali in dipendenza dal tipo di materiale ad essi applicato: in

CAPITOLO 5. STRUTTURA E FUNZIONAMENTO DELLA VR3LIB 155 questo membro dati si può inserire uno shader program per ogni combinazione legale di texture applicate al materiale.

• ms_bg_programs

Immagazzina gli identicatori degli shader program costruiti per disegnare lo sfondo della scena: in questo membro dati si può inserire uno shader program per ogni tipo di sfondo supportato (attualmente i tipi legali sono 2: immagine bidimensionale e skybox).

• ms_shad_program

Memorizza l'identicatore dello shader program utilizzato per disegnare la versione non ltrata dello shadow map all'interno di un FBO previsto per lo scopo (vedi par. 4.7.1).

• ms_blur_programs

Memorizza la coppia di identicatori lato server GL degli shader program necessari per fare il ltraggio oine della shadow map prima di arrivare al rendering eettivo della scena (vedi par. 4.7.2).

• ms_text_program

Memorizza l'identicatore dello shader program utilizzato per disegnare del testo specicato dall'utente all'interno della scena.

In ogni caso tutti questi shader program vengono costruiti solamente quando il loro utilizzo diventa necessario (come detto sopra).