Projector Shadow是常用的实时阴影实现方式,其基本原理是通过摄像机将需要显示阴影的物体,渲染到一张RenderTexture(RT)上,记录下物体的颜色值(可设置为自定义颜色),并将RT关联到Projector组件的材质上;然后通过Projector组件将需要接收阴影的物体以Projector组件的材质再渲染一遍来实现阴影的显示。
接下来将逐步展示Projector Shadow在Unity 2019.4.37实现过程中遇到的一些问题以及其优化方案。
1. 抗锯齿
Projector的直接效果会出现阴影边界有明显锯齿的现象。针对这种情况,可通过增大RT贴图的尺寸并降低阴影的颜色深度来降低锯齿的明显程度; 另外也可通过对RT进行Blur,实现模糊处理来达到降低锯齿的效果。下图分别是用Gaussian Blur和Percentage Closer Filtering(PCF)实现的抗锯齿效果,在手机端近镜头可以看出差别,但在拉远一点镜头后效果差不多,差异不明显。
2.?模型降低高度引起的阴影调整
当产生阴影的物体(投影物体)不是全在接收阴影的物体(被投影物)上面而是有部分陷入被投影物时,显示的阴影大小并没有变化,还是跟投影物全在被投影物上面时一样。
?对于这种情况,可以在Projector材质的shader中加入对顶点转换为投影坐标后的深度检测,剔除不在投影区域的阴影。 ?
3.?融合静态阴影
Projector的阴影投影到场景的静态阴影时会出现重叠现象。
?对于重叠现象可以借助烘培光照贴图时生成的ShadowMask贴图,通过shader采样来进行阴影融合。(注:在unity2018后,shadowmask贴图可以将texture type设置为single channel,选择Red即可,这样就生成了r8格式的texture,内存开销会变成之前的1/4)
4. 阴影批量显示的性能
Projector Shadow在处理需要显示大量实时阴影的情况时,并不具有优势。根据Projector的特性,产生阴影的物体会被多渲染一次,如果物体数量过多,会对渲染性能造成压力。
?在手游的阴影显示中,如果采用Projector的阴影方式, 一般用于主角的阴影显示或者只出现少量人物的场景(如PVP);对于其他不重要的人物阴影,建议使用固定面片的方式(假阴影)来展示。
|