由於Universal Render Pipeline目前(2020年4月1日)把陰影淡入淡出這個功能竟然給取消了…我自己拿片元位置到相機位置的距離進行了一個淡化,但是陰影邊緣老是被裁切…后來研究了一下Unity里面這個CBuffer是干嘛的。有一些結論,鑒於似乎沒搜到,就發個博客吧。。。
至於這些東西為啥是這樣…,我也不知道。。。反正人家Unity就是這么干的
unity_ShadowFadeCenterAndType決定了陰影消散的中心:xyz保存的是camPos + normalize( camFront ) * 0.26666f * shadowDistance, type是1或者0(沒細研究,這里不需要)。
_LightShadowData決定了淡化的范圍:z: 5/_ShadowDistance, w保存了一個被z決定的值(2.66666)。需要細說一下。。。
根據陰影中心的計算方式,陰影中心坐標在相機位置的前方0.2666(1/3.75)倍陰影距離處,以這個中心畫一個(1-0.266666)的圓,當作陰影的邊界,使得正前方的陰影距離剛好是設置好的陰影距離(對,兩側的距離確實不夠shadowDistance,要不然不會被裁掉)。這個時候可以用ComputeShadowFade函數里面的式子算一下,直接代入完全散盡的陰影處距離(2.75/3.75=0.73333)shadowDistance:
(2.75/3.75)*_shadowDistance * 5/ shadowDistance = (2.75*5)/3.75 = 3.666666 = 2.6666666+1
陰影漸變開始的最遠近距離處(圓心偏了…所以會這樣)為0。這里的新的常數5是控制陰影衰減范圍的一個參數,后面另它為變量k,改變k可以控制陰影淡入淡出范圍。
這里可以明顯看出來,這個_LightShadowData.w就是讓最遠處為1的一個偏移修正值。既然是這樣,那么這個5也可以用來改變控制陰影淡入淡出的范圍,假定我們需要讓陰影的c%是漸變的(從[c, 1]漸變)。那么可以計算出來控制參數
k=1/c (即Unity默認的那個5意味着20%的陰影被淡化了)
offset = k * 0.7333 - 1
這個offset就是_LightShadowData的w值了
主要是在這里不太會打公式。。。詳細的推導步驟等我弄好公式把pdf放到Github吧…
