由于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吧…
原文地址:https://www.cnblogs.com/hyapp/p/12608758.html