花了大概幾周的時(shí)間實(shí)現(xiàn)了軟陰影。總的來(lái)說(shuō)難度還是比較大的,而且我也走了些彎路,不過(guò)也值得,單是寫shader不是很難,但要放到引擎中還是有點(diǎn)難度。shadowmap的原理我就不講了,網(wǎng)上有很多。
這里所說(shuō)的是light space shadowmap。單是shadowmap的實(shí)現(xiàn)有兩種:一種是創(chuàng)建浮點(diǎn)紋理存放深度,然后在shader中與當(dāng)前像素的深度比較。另一種是創(chuàng)建depthstencil紋理,并設(shè)為當(dāng)前的深度緩沖,最后拿這個(gè)紋理作為shadowmap。注意,第二種才是真正的nvidia上說(shuō)的hardwareshadowmap,第一種并不是。我這里說(shuō)的是通過(guò)兩種的比較來(lái)總結(jié)一下。
這兩種方法都有一個(gè)共同點(diǎn):就是要把像素中的坐標(biāo)轉(zhuǎn)換到lightviewproj(以燈為視點(diǎn)的投影空間)的紋理坐標(biāo)。
我之前一直是用第一種方法,也參考了nvidia上的hardwareshadowmap和softshadowmap,但問題就出來(lái)了,深度一定要自己比較,所以當(dāng)實(shí)現(xiàn)了軟陰影的時(shí)候,自己比較就無(wú)法看到軟陰影,但不比較,深度又有錯(cuò)誤,而且depthbias起不到應(yīng)有的作用。
后來(lái)改用第二種方法,所有問題都解決了,紋理為D24S8,用tex2DProj就可以自動(dòng)比較深度,至于為什么能比較,我也不太清楚。如果有高手可以解釋一下就非常感謝了。