为了减少阴影暗斑(Shadow acne)Unity采取了一种叫做阴影平坠(Shadow pancaking)的技术,它的思路就是减少沿光照方向渲染阴影贴图时使用的光照空间范围,这样子可以提高阴影贴图的精度,减少阴影暗斑(Shadow acne)
如下图所示,主要就是取灯光照射方向和视锥体之间的交集
淡蓝色圆圈表示产生阴影投射的物体
深蓝色矩形框表示原来的灯光空间
绿色线表示经过优化后的近平面,把所有不在视锥体也就是看不见的阴影投射物体都排除了
这样子,等于我们将阴影投射的物体截断在优化后的灯光近裁剪平面之内(在顶点Shader中),需要注意的是虽然一般情况下表现都没问题,但是遇到了一些特别大的横跨这个近裁剪平面的三角面时就会出问题。
如上图所示,蓝色的三角面中只有一个顶点是在近裁剪平面之外的,并且被截断了,这样就出问题了,会改变三角面的形状,产生错误的阴影。
我们可以调整Unity中质量设置中的Shadow Near Plane Offset的值来解决这个问题,让灯光空间的近裁剪平面往后移,但是如果这个值设置高了又会导致阴影暗斑(Shadow acne),因为又提高了阴影贴图所对应的灯光方向的空间。或者我们也可以通过将这个大三角面拆细来解决这个问题。
https://docs.unity3d.com/2019.4/Documentation/Manual/ShadowPerformance.html