天天看點

shadow map 陰影圖算法的思考

       shadow map 以前早就研究過,不過一次不小心把以前做的東西都弄丢了,今天重新做了一下,

加到了系統裡,給大家看下效果:)

shadow map 陰影圖算法的思考

shadow map算法原理很簡單,先簡單介紹下算法給新人:

1.以光源所在位置為觀察點渲染場景(可以隻渲染需要産生陰影的物體)将渲染後的深度值儲存深度圖(一張事先準備好的紋理)。

在此步需要注意的是 此次渲染用到的模型觀視投影矩陣(以後簡稱mvp)需要儲存一下,下一步要用到。

2.正常渲染場景,将頂點坐标乘以步驟一時候的mvp,将坐标變換到以光源為觀察點的坐标系裡,比較z值和從深度圖中讀出來的

值得大小判斷遮擋,有遮擋的話将輸出顔色減弱或者換成别的随筆你了。其中有個地方需要注意,如何從深度圖紋理中讀資料,

這個我是這麼解決的:float2 suv = ((spos.xy/spos.z))//其中spos是變換到光源坐标系下的頂點資料,得到的suv經過處理後可以

當做深度圖的紋理坐标值,讀取方法為float4 shadow = tex2D(t11,(suv+1.0)*0.5),其中用到一個【-1,1】到【0,1】的變換。

剩下的就是比較了  :

            float sz =  1 - spos.z/(gDepthSize);//将深度值變換到【0,1】區間,gDepthSize是獲得深度紋理時渲染場景的最深值  

            //增加陰影

            if((sz < shadow.x))//sz是就是

            {

                color = color*(1 - shadow);

                color.w = 1.0;

                //color = float4(sz,sz,sz,1);

            }

//----------------------------------------------------------------------------------------------------------------------------

關于shadow map 算法的缺點,跟大家讨論一下:

永遠的困擾shadow map的失真問題,當光源照射場景稍大的時候失真現象就會很嚴重,有些改進算法,但都覺得治标不治本。

如果說我整個場景有很多到處跑的人,那他們的陰影效果要怎樣做呢???

感覺shadow map用在生成目前角色的陰影挺好,如果是大範圍的不大适合。很多靜态的物體可以先把陰影事先計算好,用的時候

直接讀取,沒有必要每幀都重新計算。

//----------------------------------------------------------------------------------------------------------------------------

shadow map 最大的好處是可以處理透明紋理的陰影,以為我的場景的樹是用透明紋理畫上去的,如果得到的陰影是個矩

形那就很怪了,幸好shadow map 沒有這個問題!!!

繼續閱讀