Now3D 的个人资料Now3D Live照片日志列表 工具 帮助

日志


10月21日

Shader e RayTracing

Il RayTracing mette la quinta!!!

Devo ammettere che stare al passo con i programmi professionali non è facile! Superano Now3D su moltissimi aspetti: velocità, numero di poligoni gestiti e qualità del Rendering.
Vorrei rendere il nuovo Now3D un prodotto il più possibile simile ai vari programmi professionali, e devo dire che con questi ultimi passi inizio finalmente a intravedere una luce.
Infatti, in questi ultimi mesi di programmazione ho voluto affrontare uno dei problemi maggiori della versione VB6 di Now3D, e cioè la lentezza.
Così ho velocizzato il RayTracing! Animoticon
Ma prima parliamo nuovamente dei materiali...
 

I Materiali

La volta scorsa vi ho anticipato di come stavo strutturando i Materiali, questa volta vi presenterò il lavoro fatto per rendere il motore di Now3D più flessibile e più potente.
Ho implementato una struttura ad oggetti per poter gestire nella maniera più flessibile nuovi Materiali, Mappe, Shader e BRDF.
Il Materiale potrà disporre di mappe standard o volendo potrà contenerne di nuove; avrà due proprietà fondamentali per identificare il modo con cui la luce si diffonde (BRDF Diffusivo) e si riflette (BRDF Speculare).
 20071016_Materiale
 

Le Mappe

Ho creato una classe ereditabile per poter gestire nuove Mappe con poco codice. Il loro utilizzo principale è quello di fornire tramite gli Shader i valori delle variabili principali utilizzate nei Materiali e nei vari BRDF.
 

I BRDF

Gli algoritmi di BRDF servono a simulare in maniera realistica il modo in cui la luce "rimbalza" sui materiali.
La classe Materiale ne implementa due tipi principali: Diffusivo e Speculare. Il primo serve per definire il modo con il quale la luce viene diffusa una volta giunta su una superfice e il secondo il modo con il quale la luce riflette sul materiale.
Per ora ho implementato l'Anisotropic, il Phong, il Blinn e l'Oren-Nayar. Il codice è strutturato in modo da poter gestire in futuro anche altri BRDF più complessi.
 

Gli Shader

Gli Shader sono le strutture a oggetti che mi hanno impegnato di più, ma che più mi hanno dato soddisfazioni.
Sono formati da classi nodi (N3DNode) connessi ad altri nodi tramite punti di aggancio compatibili (N3DConnection), in automatico i Nodi possono connettersi solo con altri Nodi compatibili (vedi frecce nell'immagine seguente).
20071016_Shader
Tramite queste classi Nodi e Connessioni è possibile creare Shader formati da un numero di Nodi illimitati.
20071015_Filtri
Su Now3D versione VB6 avete già avuto a che fare con i nodi e lì si chiamavano Filtri, erano molto meno flessibili e potenti degli Shader.
Comunque, gli stessi Filtri saranno implementati un pò alla volta anche su Now3D versione Dot.Net.
 

 

 

 

Ray Tracing

Inizialmente ho voluto implementare il RayTracing solo per poterne testare la velocità rispetto alla precedente versione di N3D.
Per prima cosa ho implementato un'interfaccia alla classe N3DShape per dare la possibilità di associare un algoritmo di intersezione "raggio-superficie" a qualsiasi shape.
Gli algoritmi di intersezione che ho implementato finora riguardano gli shape: Mesh e Sfera Perfetta.
20071019_RayTracing
La velocità di elaborazione che ho misurato era molto più bassa rispetto alla versione in VB6, anche se non avevo ancora implementato lo stesso algoritmo di spatial subdivision già presente sul vecchio Now3D. Questo algoritmo avrebbe sicuramente ribaltato il risultato, ma non mi sarebbe bastato. Volevo da questo Now3D uno strumento snello così da poter essere utilizzato per il rendering di scenari più complessi di semplici sfere, cilindri o tori; così ho raccolto la sfida e ho implementato l'algoritmo dell'Octree.
 

Octree

Come stavo dicendo, il risultato ottenuto con il RayTracing non mi aveva soddisfatto, così dopo anni di esperienza nella programmazione tramite tracciamento di raggi (RayTracing), mi sono deciso ad implementare un vero algoritmo di velocizzazione del RayTracing.
Devo dire che i risultati sono fantastici! Caldo
Come potete notare dall'immagine seguente, l'attivazione dell'Octree ha sbaragliato completamente il vecchio N3D!
20071020_RTTestBL'algoritmo dell'Octree consiste nel dividere il BoundingBox della la scena in otto aree uguali se parte di un oggetto si trova dentro una di queste aree, quest'ultima sarà suddivisa in otto ulteriori aree, e così via fino a formare una struttura ramificata (Tree). Una 20071017_OctreeTestervolta completata la costruzione di questa struttura, la navigazione della stessa è utile per migliorare il controllo dell'intersezione dell'oggetto con il raggio del RayTracing, che potrà essere fatto velocemente.
Lo scotto da pagare sta nel tempo di precalcolo dell'Octree e nel quantitativo di memoria utile per il suo salvataggio.
Ma più sono i controlli di intersezione da elaborare e più il tempo di precalcolo iniziale incide di meno fino a diventare tutto tempo guadagnato.
Quindi, dato che i benefici migliori si traggono dall'aumento del numero dei raggi utilizzati per il calcolo del rendering, allora qualsiasi algoritmo che fa uso intensivo dei raggi di RayTracing ne trarrà beneficio (esempio: AntiAliasing, RT Distribuito, Final Gathering, Ombre Sfumate, ecc...).
 

AA

Ho voluto implementare anche gli algoritmi di AntiAliasing, così da testare meglio i benefici della velocizzazione tramite Octree.
Di conseguenza, anche con l'AntiAliasing abilitato, il RayTracing risulta essere veloce "quasi" quanto quello di programmi grafici professionali.
Come si può notare dal grafico seguente:
20071020_RTAATestB 

Le DirectX su PocketPC

La volta scorsa vi ho parlato della prima implementazione delle DirectX su Now3D, adesso vi spiego la sua applicazione anche nella versione per PocketPC.
Da quanto ho capito, non esiste la possibilità di implementare le DX sui PocketPC con Windows Mobile 2003, ma solamente su quelli che montano sistemi operativi WM5 o WM6.
Il risultato è sicuramente migliore della versione che non usa le DX, il quale utilizzo era impossibile per via della lentezza, ma non esaltante. Infatti, ruotare un semplice Toro a 16 suddivisione in modalità Gouraud risulta, comunque, poco fluido. Spero di trovare il modo di offrirvi una buona, e usabile, libreria grafica 3D anche per il palmare...chi vivrà vedrà!
 

Altre News

 

Tipi di Luci

Implementate due tipologie fondamentali di Luci: Puntiformi e Direzionale a Cono; per adesso sono state strutturate in maniera analoga a quella della versione VB6, però ho in mente di strutturarle meglio e a oggetti.
 

Oggetti Editor

Migliorati gli oggetti editor di tipo Move e Quaternion.
 

Coming Soon

Per la prossima volta spero di riuscire a preparare una demo, così da potervi far apprezzare al meglio tutte le features implementate finora su Now3D versione Dot.Net.
 
 
Alla prossima!
 
Giuliano Cornacchiola
 

Stato Attuale lavori

Caratteristica

% Stato avanzamento

Descrizione

Spettro dei Colori 

0% Rendering utilizzando tutto lo spettro della luce.

 Le Constraint

0%  

Le Animazioni 

5%

Primi test di animazione.

Interfaccia

15%

Proprietà, Nodi, Finestre e albero della Scena.

Rendering RayTracing

25%

AntiAliasing, velocizzazione tramite Octree, Riflessi, Rifrazioni, RT Distribuito, Final Gathering.

Formato file XML

30%

 

Rendering Scanline

50%

Modalità: Flat, Gouraud, Phong.

Le Azioni

60%

Tipologia di oggetti utili a gestire gli input da parte dell'utente (mouse, tastiera e altro)  in azioni su altri oggetti.

Le Quaternion

60%

Migliore controllo dell'orientamento di un oggetto.

Accelerazione Hardware

70%

Implementata la modalità Gouraud tramite le DirectX.

Materiali

70%

Interfaccia standard per i Materiali le Mappe e i Filtri.

Le Istanze

95%

Gestione generica di Oggetti, Telecamere, Luci e molto altro, con la possibilità di condividere uno shape.