自阴影问题解决

自阴影问题解决

由图可见,倾斜度比较高的地方会出现这种很难看的效果。 

 

参考:http://blog.****.net/ronintao/article/details/51649664

        Shadow Mapping 里的 Shadow acne 一节解释的比较清楚,根本原因就是 shadow depth map 的分辨率不够,因此多个 pixel 会对应 map 上的同一个点。

自阴影问题解决

图8、shadow acne成因图

        图中黄色箭头是照射的光线,黑色长方形是实际物体表面,黄色的波浪线是 shadow map中的对应值的情况。

        可以看到,由于map是对场景的离散取样,所以黄色的线段呈阶梯状的波浪变化,相对于实际场景中的情况,就有一部分比实际场景中的深度要大(对应着黑色线段部分),着部分不会产生阴影(注意图画反了);一部分比实际场景中的深度要小(对应着黄色线段部分),这部分会产生阴影,所以就出现了条纹状的阴影。

        由于这种情况,是物体的实际深度,与自己的采样深度,相比较不相等(实际深度大于采样深度)导致的,所以可谓是自己(采样的副本)遮挡了自己(实际的物体),所以被称为 self shadowing。
 

3、对策

        解决的方法很简单,其实只有实际深度大于采样深度的时候才有问题,那么我们在计算实际深度的时候,往灯光方向拉一点,让他减小一点就可以了

自阴影问题解决

图9、shadow acne的对策:Shadow Bias 

 

前面两节一直在说要加入shadow bias,但是可以看到,加小了没用,会有 shadow acne;加多了又会导致 peter panning。所以要怎么加,是有一定技巧的,最终的目标是要找到一个刚好能够消除 shadow acne的 bias 值。

        现在常用的shadow bias的计算方法,是基于物体斜度的,称为 slope scale based depth bias

        简单来说就是

自阴影问题解决

公式的具象化可以参考下图:

自阴影问题解决

图11、slope scale depth bias示例



看了下Unity中对阴影的处理方法:
自阴影问题解决
自阴影问题解决
这里可以看出,就是用unity_LightShadowBias(在计算阴影的shader时从灯光中获得的)的x和y对阴影作偏移就可以解决自阴影了(因为偏移后对倾斜度太大的会减少像素和深度图的对应)

根据上面所说原理 
 ,可以通过调整照射英雄的平行光的shadow中的bias来解决,每个英雄需要不同的bias。
有两种解决方法,第一种是把Unity的投放阴影的shader放到自己的shader中用。然后在计算顶点时修改unity_LightShadowBias。
自阴影问题解决 
这样可以解决自阴影问题。但这个做法主要的问题是会影响到阴影的计算,对不同的GPU都可能会有点英雄。

 
2.第二种方法是直接调整灯光的bias。
在Camrena中加入一个脚本然后获取英雄的shader中的_ShadowBias。然后去设置灯光的bias。这样做就只是调整灯光的bias,而且不会影响到所有英雄的prefab。 

自阴影问题解决

自阴影问题解决

自阴影问题解决



最终的效果如下:


自阴影问题解决