Ideju sam preuzeo sa sledeceg linka:
http://www.gamedev.net/reference/articles/article2193.asp
Cilj demo-a je bio da detaljno razumem kako radi jedan od nacina generisanja senki.
Nacin generisanja senki:
1. Renderovanje scene iz perspektive svetla u Depth buffer render target ( DepthRT )
2. Renderovanje scene iz perspektive kamere pri kojem se odredjuje koji pixel je u senci koristeci podatke iz Depth buffer render target i smestanje vrednosti rezultata ovog testa (crna ili bela boja) u poseban render target ( ShadowMapRT ) ciji sadrzaj izgleda ovako.
3. Blurovanje ShadowMapRT pomocu vertikalnog i horizontalnog Gaussian blura dva puta ( BlurRT ) tako da se dobija iluzija mekane senke. Primer.
4. Na kraju se renderuje scena sa osvetljenjem. Iz BlurRT se uzimaju vrednosti (ShadowTerms) tako sto se u Light shaderu proracunaju screen space texture koordinate i izvrsi se lookup BlurRT texture. Na kraju se konacna boja ( diffuse + specular ) mnozi ShadowTerm-om. Blur shader je dosta zahtevan, koliko mi se cini, pa bi u buducnosti mogao da probam sa blurovanjem downsamplovane verzije ShadowMap-e zbog Frame Rate-a mada nisam siguran kakav ce kvalitet senki biti.
Soft Shadows 1
Ovde sam dodao malo ambient osvetljenja senkama tako da izgledaju realnije ( nisu skroz crne )
Soft Shadows 2
Soft Shadows 3
U primerima je velicina Shadow Mape 512x512. Mogao sam da izaberem 1024x1024 ( bolje izgleda ) ali vizeulno i 512x512 zadovoljava.
Sledeci korak je dodavanje vise svetala koja bacaju senke. Ideja je da se renderuje u vise ShadowMap Render Targeta i da se vrednosti pixela iz tih RT-a mnoze tako da se dobije jedna ShadowMapa na kojoj su siluete senki svih svetala.
Za sledeci demo cu uraditi bolju scenu u MAX-u :)