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.

mercoledì 20 ottobre 2010

Novità sui nodi

Nuovi Nodi
In occasione dell'implementazione delle nuove mappe AmbientMap e ReflectMap ho voluto aggiungere i seguenti nuovi nodi:

SingleToSingleUnit
Trasforma la connessione di input di tipo Single in una di output di tipo SingleUnit. Utile per bloccare un valore Single tra 0 e 1.

RayNormal
Restituisce un il vettore normale all'intersezione del raggio.

RayDirection
Restituisce un il vettore direzione del raggio.

ReflectRay
Questo nodo ha come input due connessioni di tipo punto 3d: il vettore normale e la direzione. Il risultato è il vettore riflesso utile come input del nodo XYZ2UV per la mappa riflesso (ReflectMap).

P3DtoTextureSpace
Questo nodo serve a trasformare le coordinate di un oggetto in quelle a una unità per le mappature che si applicano interamente all'estensione dell'oggetto come quella Cylinder o Planar.

Modifica Nodo XYZ2UV
Aggiunto l'attributo "mapping" utile alla scelta dei tipi mappatura:

Avvolgimento su superficie
Cylinder Mapping Planar Mapping Sphere Mapping

Environment
 
Esempio di texture di tipo Probe
Picture courtesy of Paul Debevec.
Esempio di texture di tipo Sphere (anche chiamata Spherical)  

Nuovi Shader di tipo Bitmap
Implementati alcuni nuovi nodi shader utili alla semplificazione dell'applicazione di una immagine a una mappa di un materiale o a un ambiente.

SurfaceBitmap
Nodo utile all'applicazione di una immagine alla superficie di un oggetto.

ReflectionBitmap
Grazie a questo nodo si può applicare facilmente una immagine alla mappa riflesso di un materiale.

EnvironmentBitmap
Questo nodo è utile ad applicare una immagine all'ambiente attorno alla Scena (si usa con la mappa Environment della Scena).

BumpBitmap (ex Bump2D)
Standardizzato nel nome e negli attributi.

domenica 19 settembre 2010

Migliorie sull'Interfaccia

Rivisitazione dell'Interfaccia
Ho voluto rivedere l'interfaccia per renderla più user-friendly e per donarle un aspetto più definitivo in vista di una prossima demo...e non dico altro! ;)

Nuova Interfaccia

Una Camera più Viewport
Gestita la possibilità di assegnare velocemente una camera a più di una Viewport. Tramite una nuova finestra a comparsa all'interno di ogni vista (accessibile passando sopra col mouse su una barra posta sopra ogni viewport) è possibile scegliere la Camera assegnata.

Menu a comparsa di una Viewport

Nuove ToolBar
Aggiunte le barre degli strumenti (toolbar) classiche, utili per accedere velocemente ai comandi principali. Queste, possono essere spostate su qualunque lato della finestra di Now3D.
La prima gestisce le operazioni classiche di un file di progetto (nel nostro caso la scena) con inizializzazione, apertura e salvataggio della scena.
Sempre la prima toolbar contiene anche i pulsanti di gestione dell'Undo e del Redo, con finestra a tendina che visualizza la lista delle azioni da annullare o ripetere.
La seconda toolbar gestisce gli strumenti utili per l'editor, scelta tra le azioni possibili sugli oggetti (spostamento, rotazione, dimensionamento, rotazione tramite quaternion) e scelta tra visualizzazione a una camera o a 4 camere.
L'ultima toolbar gestirà i bottoni di configurazione e avvio del rendering RayTracing.

La nuova toolbar
I bottoni di gestione Undo-Redo incorporati nella toolbar

Gestione delle Gerarchie da interfaccia
Adesso tramite semplici comandi di "Add child to" accessibili all'interno delle finestre di pop-up associate alle istanza, è possibile aggiungere oggetti figli, e quindi creare delle gerarchie.
Per accedere a queste pop-up basta cliccare su una istanze col pulsante destro del mouse, sia sull'icona rappresentante l'istanza dell'albero della scena, che sull'istanza stessa su di una viewport.