Friday, December 5, 2008

Shadow Maps reprise


Shadow maps are a good tool to display shadows into a scene, but has pro and cons.
Pros:
- are fast: you need to render the scene only twice to obtain it
- are simple: the shaders is not very complex, and it's easy to customize it.

Cons:
- are imprecise: the shadow is obtained with a projection of a 2d texture. This means jagged shadows when you are near to the object. With some filtering you can reduce the aliasing problem but not to eliminate
- are usable only with spotlight lamps. And the sun is not a spotlight, but an omnidiretional light.
- are good only if the light source is near to the object. If the distance grows, some errors appears, due to precision errors.

There's another option: to use a volume shadow, another tecnique to generate more precise shadows, but it's more complex and heavy (it's the same tecnique used in doom3 engine).
For now i'm trying to optimize the shadow maps, and some good result are born.

---

Proseguendo con lo studio delle shadow maps ho scoperto che sono un ottimo strumento per creare ombre ma hanno i loro pro e contro.

Pro:

- Sono molto veloci: basta renderizzare la stessa scena due volte per ottenere le ombre
- Sono di semplice implementazione: gli shaders sono abbastanza snelli ed e' facile mettervi mano

Contro:

- Sono imprecise: essendo il risultato di una proiezione di una texture bidimensionale, se la texture non ha una gran risoluzione si nota molto l'effetto "scalinatura" tipico dei pixel ingranditi. Effetto che si puo' ridurre applicando dei filtri ma non eliminare
- Sono utilizzabili solo con luci a cono (la classica lampada da scrivania). Il sole e' invece una luce omnidirezionale.. posso solo simularne l'effetto facendo si' che il cono di luce sia sempre puntato verso la telecamera dando l'impressione della omnidirezionalita', pero' cio' che sta fuori dal cono verra' erroneamente mostrato in ombra.
- Danno risultati decenti solo se la luce e' vicina all'oggetto.. piu' si allontana e piu' insorgono problemi dovuti alla precisione, con risultati spesso pessimi.

Una seconda possibilita' e' data dalle shadow volumes, una tecnica differente, piu' precisa ma purtroppo piu' complessa e pesante. Per intenderci e' la stessa tecnica usata nell'engine di Doom3.

Ad ogni modo per ora sto provando ad ottimizzare le shadow maps, e devo dire che ho ottenuto qualche buon risultato, come potete vedere dall'immagine e dal filmato.

9 comments:

Unknown said...

Complimenti.

Marte said...

ma quando si passa dietro un corpo celeste che non emette luce (pianeta, asteroide ecc..) si viene ombreggiati, giusto? teoricamente non si dovrebbe vedere quasi nulla dietro tale ombra, visto che la luce del sole vicino é nascosta e quella delle stelle é troppo distante per illuminare completamente..

PdG said...

Si' in teoria e' proprio cosi'.
Nello spazio non c'e' luce ambientale (non essendoci atmosfera), quindi le zone in ombra sono totalmente nere, a meno delle proprie luci.
Ovviamente va valutato se val la pena essere eccessivamente realistici. Tenere la scena completamente in ombra semplicemente perche' si e' dietro un pianeta potrebbe essere bruttino.

Marte said...

bruttino certo.. però realistico.
chiaramente é una tua decisione, ma il mio consiglio é di ombreggiare pesantemente i corpi che passano dietro ad un pianeta, ma essere meno rigorosi sulla lunga distanza ecco..

davide said...

Si scrive "onni...qualcosa".
Questo tau ceti è una merda o l'embrione di una figata?

PdG said...

e' chiaramente una merda che domande :)

Anonymous said...

perchè non consideri un porting in XNA, almeno trovi codice pronto per varie cose:

Omnidirectional Shadow Mapping
http://www.youtube.com/watch?v=_mliL_qiy_M&fmt=22

Sun Shader
http://www.youtube.com/watch?v=gkV3raj93_o&fmt=22

Volumetric Clouds
http://www.youtube.com/watch?v=3QqD26SXWDc&fmt=22

Marte said...

ti segnalo Solar Model:

http://www.ffsoftworks.com/solarmodel.php?show=screenshots

ed il source code:

http://sourceforge.net/projects/solarmodel/

Anonymous said...

Si, probabilmente lo e