giovedì 7 maggio 2015

Luce e riflessioni in tempo reale in Unity 3D

Su questo link possono essere viste una serie di ambientazioni virtuali diverse con variazione dello stato di illuminazione fra giorno e notte, con materiali che emettono luce, particles effect, acqua, riflessioni, ecc... in relazione allo skybox (cielo di sfondo).
I vari ambienti con una camera mobile per mezzo dei tasti W-A-S-D presentano un'immensa superficie che simula l'acqua, con il moto secondario di onde, riflessioni degli oggetti e trasparenze del fondale.
Sull'isoletta sono posti degli alberi ed alcune texture a simulare terreni diversi.
Altri pulsanti redirezionano ad un sito web preimpostato o le ">>>>>>>>>>" spostano ad una scena successiva, in circolo.
I pulsanti "Q" ed "E" permettono di accelerare o rallentare la rotazione fra giorno e notte, con tanto di stelle sullo sfondo in rotazione.
In una scena, con i pulsanti "1" e "2" si comanda la presenza di pioggia o di una nevicata.
Il pulsante "F" in qualsiasi scena attiva una o più sequenze di fuochi artificiali (da premere molto velocemente per non azionarne troppe), i cui riflessi sono visibili sull'acqua.
I fuochi artificiali assieme a tutti gli altri effetti di luce e riflessione in tempo reale sono un buon benchmark per le capacità grafiche del proprio computer.
L'aspetto della scena è migliorato dal fatto che le riflessioni non sono precalcolate, ma vengono valutate in tempo reale frame per frame.

Per quanto riguarda gli skybox:
  • nella prima scena appare uno procedural skybox, il più semplice da implementare, che tuttavia non presenta nè nuvole, nè paesaggi ad infinito, facendo apparire lo sfondo povero di contenuti;
  • nella seconda scena il cielo ad infinito è simulato con una sfera di dimensioni finite, intorno all'ambiente ed una texture 3D rappresentante cielo e nuvole: senza una texture con un adeguato tiles, questo evidenzia delle linee di separazione fra un bordo e l'altro della texture applicata, oltre ad influire sul precalcolo dell'illuminazione della scena (conviene disattivare la sfera nel calcolo delle luci) e sulla visualizzazione delle stelle;
  • nella terza scena lo sfondo è simulato con uno skybox, al quale viene mutata costantemente l'esposione per simulare l'arrivo delle tenebre;
  • nella quarta scena si utilizzano sempre delle sfere per simulare il cielo nuvoloso, essendo troppo complesso e pesante con soli "particles effect", ma questo influisce sui "particles effect dei fuochi d'artificio", oltre ad aver i problemi prima citati con l'uso di una sfera attorno alla scena;
  • nella quinta scena viene utilizzato uno skybox di sfondo ed uno script per alternare il giorno e la notte, mentre le nuvole sono simulate con due diversi particles effect, uno che si intona con la notte, l'altro che rimane ad eguale luminosità, sembrando una luce di notte.
In tutti i casi è stato applicato un flares per la luce direzionale del sole.
Il risultato migliore lo si ottiene con uno skybox coerente alle condizioni della scena, a cui viene mutata l'esposizione tramite script.

Tuttavia questo impone delle nuvole fisse ed una certa difficoltà nel passare da una scena con cielo skybox di sfondo splendente ad una scena con cielo skybox di sfondo nuvoloso.
Per un tale scenario forse conviene utilizzare qualche package completo per le condizioni atmosferiche: per esempio environment gator.
L'uso di nuvole realizzate con "particles effect" porta ad un maggiore appesantimento della scena, necessita comunque di script che modifichino lo stato di illuminazione della nuvola con il sopraggiungere della notte, e rende difficoltoso coprire la distanza ad infinito, che apparirà sempre  sgombra da nuvole, se si usa un procedural skybox o con nuvole fisse se si usa uno skybox fisso.


L'illuminazione dell'ambiente è precalcolata in tempo reale, ciò significa che facendo ruotare l'illuminazione nell'ambiente virtuale, si vedrà un fascio di luce illuminare il pavimento e le pareti progressivamente con il tramontare del sole.
L'effetto di riflessione sulla superficie dipenderà dal tipo di shader utilizzato.
Nelle varie scene ci sono varie tipologie di shader: standar shader specular che sfruttano il physical baded rendering; Allegoritmics shader; tessellation shader
Gli standard shader sono stati utilizzati per simulare l'effetto del marmo, con texture di vari colori, e per realizzare la superificie illuminata, sfruttando specular map, emission map, normal map, hightmap...
Tendenzialmente gli standard shader sono perfetti per creare materiali opachi, metallici, con riflessioni o lucidi, e poco adatti per materiali imperfetti.
Tali shader soffrono del problema di tiling per superfici vaste.
I materiali prodotti dalla Allegoritmics hanno shader complessi che permettono relazioni complesse fra diversi comportamenti di texturizzazione, variabili con script d'ambiente, diversificati per parti d'area (per esempio se si vuole creare una superficie in parte opaca, in parte riflettente) e randomizzabili a piacimento.
I tessellation shader, applicati a due semplici sfere mostrano la possibilità di realizzare effetti volumetrici mediante l'uso di semplici texture 2D, grazie alle funzioni di forma dello shader ed alla heightmap associata.
In particolar modo le due heightmap utilizzate necessiterebbero di un miglioramento vista la cattiva rappresentazione volumetrica risultante.
In un caso si è semplicemente convertita la texture in scala di grigi.
Nell'altro caso sono stati modificati i livelli di contrasto per rendere al meglio i dislivelli fra le parti concave e quelle in rilevo.



L'uso di filtri sulle texture da utilizzare, per esempio come l'effetto carta invecchiata sullo skybox, non fornisce risultati ottimali.
Nell'immagine si può vedere come il filtro, non avendo procedure che considerino la congiuntura fra elementi, metta in relazione i bordi congiunti.
Inoltre l'effetto del filtro sulla texture dipende molto dalla distanza di rappresentazione nell'ambiente virtuale, in genere peggiorando la visualizzazione a lunga distanza od a breve distanza.
Tutto ciò porta a preferire l'uso di filtri e "post effect" legati alla visualizzazione direttamente nella scena.


Nessun commento:

Posta un commento