lunedì 17 ottobre 2011

Nuovi Standard

In questo post voglio parlarvi di un particolare tema che ho voluto affrontare in questi ultimi mesi di sviluppo di Now3D2, e cioè la definizione di nuovi standard.
Questi nuovi standard renderanno Now3D2 più potente e flessibile del suo predecessore.

Standard PlugIn
Comincio parlandovi di uno standard dal quale potranno nascere in futuro molte nuove implementazioni su Now3D2, e cioè lo standard di un particolare tipo di PlugIn, e cioè quelli che io chiamo di tipo "Libreria Esterna".
Questo tipo di plugin consiste in dll esterne al core di Now3D2, contenenti nodi (es: shader, oggetti, camere, ecc...) sviluppabili anche da terze parti e naturalmente utilizzabili in maniera nativa su Now3D2.
Ad esempio molti degli attuali Nodi e Shader che utilizzo su Now3D2 li ho voluti spostare su tre librerie esterne così da snellire la dll principale di Now3D2, e sono: N3D2.CompatibilityLib, N3D2.PrimitivesLib, N3D2.ShadersLib.
Di seguito due finestre di dialogo contenenti alcuni esempi di nodi di librerie esterne:
Browser per NodiBrowser per Oggetti
L'utilizzo di questi elementi esterni a Now3D2 si ricollega anche al motivo principale dell'adozione del formato XML. Infatti, al salvataggio di una Scena (o una Istanza o un Materiale o uno Shader) contenente elementi esterni al core di Now3D2, verrà applicato all'interno dell'xml un collegamento alla libreria richiesta.
Quindi, per poter ricaricare correttamente la stessa scena è richiesta l'installazione sul proprio PC della stessa libreria plugin utilizzata nella creazione della scena stessa o quantomeno una versione compatibile, altrimenti il caricamento verrà interrotto da un errore contenente possibili indicazioni su dove scaricare la libreria.

Standard Engine AA
Tramite questo nuovo standard sarà possibile applicare al motore raytracing di Now3D2 anche algoritmi Antialiasing (AA) di terze parti.
Per ora ho implementato due motori per il calcolo dell'AntiaAliasing: il Simple e l'HaltonAdaptive.
Il Simple usa semplici medie pesate di pochi (max 5) sub-pixel posizionati intorno al pixel attuale.
Mentre il motore HaltonAdaptive è basato sulla distribuzione di punti fatta da Halton ed è di tipo adattivo perchè genera il giusto numero di campioni solo quando necessita.
Rispetto all'algoritmo di AntiAliasing Halton che implementai nel primo Now3D (il tipo adattivo), adesso ho voluto raggiungere quasi la perfezione assoluta, questo grazie a varie ottimizzazioni dell'algoritmo originario e all'uso dei Filtri (funzioni applicabili ai valori di ritorno dei subpixel utili a una ricostruzione più accurata della scena sottesa dal pixel), dove il filtro MitchellNetravali è quello che reputo migliore.
La qualità è migliorata così come la velocità.
L'immagine di seguito è stata generata con il nuovo algoritmo in 208 secondi, mentre se passate sopra con il mouse sulla stessa immagine potrete vedere la stessa scena generata con il vecchio algoritmo in 815 secondi.


Standard RayTracing Engines
Pensando a quanti algoritmi di RayTracing presenti nel primo Now3D devo ancora convertire (es: riflessi distribuiti, rifrazioni distribuite, illuminazione globale tramite il metodo MonteCarlo, Irradiance Cache, il Final Gathering, ecc...), ho cercato di sviluppare uno standard che ne faciliti l'implementazione.
Grazie alla standardizzazione del motore del RayTracing sarà possibile, per uno sviluppatore, implementare motori alternativi di RayTracing per Now3D2.
Attualmente questo standard non è completamente definito, comunque ho potuto spostare molto del codice di gestione del RayTracing su una classe a parte (Engine RayTracing), e implementare anche una prima versione dei Riflessi Distribuiti (Engine MonteCarlo), di cui avete avuto una dimostrazione in una delle immagini contenute nel Tema di Now3D2.

Standard Tessellation
Infine, ho voluto standardizzare le primitive di tipo mesh tramite l'utilizzo di interfacce (di programmazione) standard contenenti le proprietà Details e UVDetails.
In questo modo sarà possibile, ad esempio, gestire il dettaglio dinamico degli oggetti contenuti in una scena a seconda della distanza degli oggetti stessi dalla telecamera (LOD o Level of detail), quindi minor dettaglio per oggetti lontanti e maggior dettaglio per quelli vicini.

Nessun commento:

Posta un commento