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