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