domenica 6 novembre 2011

Now3D Cloud versione alpha

Il lavoro di implementazione di Now3D Cloud sta procedendo bene e a breve rilascerò la versione Beta! continua a leggere qui

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.

mercoledì 12 ottobre 2011

Now3D Cloud sta arrivando...

sabato 8 ottobre 2011

Velocizzazioni

Voglio rendervi partecipi degli ultimi sviluppi di Now3D2 attraverso le novità che hanno reso possibile il render delle immagini comprese nel tema di Now3D2.

Comincerò mostrandovi i miglioramenti in termini di velocizzazioni, mentre nel prossimo post vi mostrerò le vere e proprie novità.

Velocizzazione PLY
Ho ottimizzato il caricamento di mesh PLY. Ad esempio la mesh Dragon qui a sinistra contenente 871000 poligoni è stata caricata in soli 5 secondi invece dei 15 minuti della vecchia versione!

Velocizzazione Nodi
Varie ottimizzazioni al codice di gestione dei Nodi hanno portato a una velocizzazione nel reperimento dei valori dei nodi nell'ordine del 1600%!!!

Velocizzazione Raytracing
Invece l'algoritmo del Raytracing pur subendo una drastica riorganizzazione (di cui ne parlerò nel prossimo post) che ha aumentato notevolmente la flessibilità, ha comunque avuto un miglioramento di velocità di circa del 90%.

Velocizzazione Antialiasing
Per ultimo anche l'algoritmo di AntiAliasing a seguito di importanti modifiche ha avuto grandi benefici con velocizzazioni dell'ordine del 360%.

Risultato
Questo di seguito è uno screenshot che mostra la finestra di renderizzazione alla conclusione del rendering della prima immagine del tema d Now3D2 per Windows 7.
Il rendering è durato 3733 secondi (circa 1 ora e 2 minuti), su un PC dotato di CPU E8400 a 3.00GHz, e ha generato 136.944.176 raggi in modalità AA high per un'area di 1366x768 pixel.

lunedì 26 settembre 2011

Now3D2 (Tema per Windows 7)

Potete scaricare il tema di Now3D2 per Windows 7. Le immagini di questo tema sono state renderizzate interamente grazie all'ultima versione di Now3D2 (nome definitivo dell'ex N3D.Net). Scarica Now3D2_Theme.zip (3.5MB)

Una volta scaricato, aprite il file zip e fate doppio-click sul file "Now3D2.themepack" per installare il tema.

A breve potrete leggere su questo Blog le ultime novità sugli sviluppi di Now3D2.
Uffizi HDR Image courtesy of Paul Debevec
Venice HDR Image courtesy of USC Institute for Creative Technologies
PLY Meshes courtesy of Stanford University Computer Graphics Laboratory

venerdì 19 agosto 2011

Now3D 1.30

Finalmente Now3D (versione VB6) è compatibile con Windows 7 (anche a 64bit)!
Potete acquistarlo tramite un piccolo contributo direttamente dallo store AppUp della Intel:
Scarica Now3D 1.30
Sul mio sito potete leggere le ultime news.

lunedì 7 marzo 2011

Il Backstage della Demo Real-Time

Come in un "Dietro le quinte", vi voglio presentare alcune delle novità di questi ultimi mesi che hanno reso possibile la Demo Real-Time. Ve le mostrerò nello stesso ordine cronologico con le quali le ho affrontate e implementate.

Velocizzazione degli Shader
Il primo spunto nel creare una demo in tempo reale l'ho avuto durante una rivisitazione dell'algoritmo di gestione dei nodi.
Infatti, dopo aver scoperto un grave abbassamento delle performance di rendering delle visualizzazioni scanline, anche del 50% rispetto alle prime versioni di questo nuovo Now3D, ho deciso di identificare quale elemento della pipeline di rendering scanline era più pesante, e il colpevole principale era l'algoritmo di gestione dei Nodi.
Così, una riorganizzazione del codice di gestione dello standard dei nodi, mi ha portato all'eliminazione delle SubConnection (oramai entità obsolete), e questo fatto ha avuto l'effetto non proprio indesiderato di velocizzare la resa di molti degli shader implementati, riportando Now3D di nuovo in carreggiata.

Nuove modalità ScanLine
Ma il vero via all'implementazione di una demo Real-Time è iniziato con una riorganizzazione dei tipi di visualizzazioni ScanLine.

Modalità VertexShade e PixelShade
Ho voluto rivedere la nomenclatura delle modalità ScanLine e il gouraud l'ho rinominato VertexShade, dato che effettivamente interpola i valori ai vertici dei poligoni, mentre il Phong l'ho rinominato PixelShade, dato che elabora ogni singolo Pixel.
Nel contempo, ho trovato un modo di unire la velocità di resa della modalità VertexShade al dettaglio di resa del PixelShade.
Nel vecchio Now3D la modalità scanline Gouraud gestiva le texture con un codice ad hoc rispetto a quello standard del Phong, la restituzione delle texture erano sufficientemente precise ma rallentava notevolmente la resa.
Quindi, per questo nuovo Now3D ho preferito lasciare un motore unico di gestione e delegare la modalità VertexShade alla visualizzazione interpolata tra i valori calcolati sui vertici. Il dettaglio a questo punto sarà legato al numero di poligoni dell'oggetto.

SimpleMaterial
Nella ricerca di una modalità veloce di resa, ho voluto implementare una modalità utile alla modellazione degli oggetti, quindi uno shader semplice e veloce, gestito dal Viewer e applicabile agli oggetti esclusivamente in fase di renderizzazione.

FastShade
A questo punto, una leggera modifica al codice del VertexShade lo ha reso tre volte più veloce, ma ne ha pregiudicato ulteriormente la precisione, creando in alcuni casi risultati disattesi (immagine a destra). Comunque sia, quest'ultima velocizzazione mi ha dato la possibilità di immettere Now3D nella via degli applicativi di visualizzazione in tempo reale (almeno 24 aggiornamenti dello schermo al secondo)!

Visualizzazione Environment in modalità ScanLine
L'idea di fare una demo mi ha portato a pensare a cosa mettere in questa demo. Avvolgere un'immagine all'ambiente che circonda la scena era una delle caratteristiche del vecchio Now3D che più mi piacevano ed ero proprio curioso di vederla animare in modo più fluido grazie alla nuova modalità FastShade. Quindi mi sono rimboccato le maniche.

Velocizzata GeoSphere tramite KDTree
Però, per arrivare a questo, dovevo per prima cosa velocizzare la costruzione della GeoSphera, e l'algoritmo KDTree mi è stato tantissimo di aiuto, l'ho standardizzato alle nuove procedure VB.Net e l'ho applicato.
Ora posso generare una Geosphera a dettaglio 8 (327680 poligoni) in soli 3 secondi, prima non sarebbe bastata un'ora.

Environment per lo ScanLine con GeoSphere
Una volta velocizzata la costruzione della GeoSphera, ho dovuto implementare un metodo per visualizzare la faccia nascosta dell'oggetto GeoSphere, e così ho implementato il metodo InvertNormal() dello Shape di tipo Mesh.

Ho anche tolto l'uso dei nodi ReflectBitmap e AmbientBitmap, quindi basterà utilizzare l'EnvironmentBitmap che, a seconda della mappa alla quale sarà connesso, si comporterà come Reflect o Ambient.

Modalità real-time
A questo punto avevo bisogno di implementare una modalità di visualizzazione simile a quella usata negli applicativi che sfruttano le DX, una modalità di refresh automatico della schermata, quindi sempre attiva. In termini tecnici questa nuova modalità sfrutta il tempo di inattività (Idle) di Windows per richiedere il successivo ridisegno della viewer. Unica accortezza è che tutte le azioni sugli oggetti devono avvenire all'interno di questa routine.

Usare l'HDR per le immagini e l'Ambient Map
Un'idea che mi balenò in testa fu quella di mostrare un ambiente che cambiasse illuminazione in tempo reale, simile a un video che ho fatto con il vecchio Now3D (vedi video di seguito).


Cambiare l'esposizione
Per prima cosa ho implementato delle funzioni applicate alla camera tramite le quali poter comandare l'espozione (Exposure) e la Gamma dell'immagine finale.

Immagini HDR
Poi, ho implementato il formato di immagini HDR, cioè un formato che contiene una maggiore profondità di illuminazione e che gioca un ruolo importante nell'effetto di cambio d'esposizione.
L'implementazione è stata fatta aggiungendo la possibilità di far caricare anche le immagini in formato "HDR" al nodo Bitmap, e, quindi, per ereditarietà a tutti gli shader che lo utilizzano (SurfaceBitmap, BumpBitmap, EnvironmentBitmap).

Nodo ProbeToIrradiance
Un'altra tecnologia che ho voluto riprendere dal vecchio Now3D è quella della mappa ambientale precalcolata. In pratica, precalcolo un'immagine con mappatura Probe per poter simulare la luce ambientale senza usare pesanti algoritmi (es: MonteCarlo), quindi, ideale per animazioni in tempo reale (questo algoritmo si basa sul lavoro di Ravi Ramamoorthi e Pat Hanrahan. Prefilter Environment Map).
L'algoritmo è stato inserito nello standard dei Nodi, utilizzabile da solo o insieme ad altri nodi a formare un albero di nodi (o shader).

Shader AmbientBitmap
Una volta implementato il nodo ProbeToIrradiance, l'ho inserito nello shader AmbientMap da usare esclusivamente con la Mappa Ambientale.

Mouse e Tastiera
Oramai la demo era quasi pronta, mancavano giusto dei piccoli controlli che ho voluto implementare per darvi la possibilità di attivare funzioni (bottoni) o modificare parametri (slider).
Quindi, ho approfittato dell'occasione per migliorare il ritorno degli eventi del mouse e della tastiera direttamente dall'oggetto.

domenica 27 febbraio 2011

Seconda Demo

Demo Real-Time
L'implementazione del nuovo Now3D anche se a rilento continua.
Finalmente posso mostrarvi un assaggio del nuovo modulo real-time di questo nuovo applicativo.

HDR Images courtesy of Paul Debevec

Ho rilasciato una demo RealTime che sfrutta il motore 3d realtime del nuovo Now3D che sto sviluppando.
Se siete anche voi appassionati come me di programmazione di grafica 3d, potete modificare a piacimento il sorgente di questa demo.

Ed ora, buon divertimento!

Seguirà una serie di post riguardo le molte novità aggiunte in questi ultimi mesi.