借用场景LOD的思想,既然远处的模型替换成了低模,动画看上去也不会动了,那么阴影贴图渲染其实每帧变化并不大,也会随着级联阴影层级的提高变化越来越小;
因此可以想到,对远距离的级联阴影级别下,可以不对每个物体阴影做重新绘制;
将阴影贴图进行cache缓存,并对级联阴影的每个级别的阴影贴图块按不同的刷新率去更新,就可以降低每帧投影体绘制的次数了。
- 在URP下,主光源级联阴影是通过MainLightShadowCasterPass脚本完成的,拷贝一份MainLightShadowCasterCachedPass,同时修改UniversalRenderer中所有MainLightShadowCasterPass为MainLightShadowCasterCachedPass
- 由于级联阴影Texture不能每帧创建了,在MainLightShadowCasterCachedPass中移除m_MainLightShadowmapTexture的释放逻辑,并将释放逻辑分离出接口
- 将MainLightShadowmapTexture的释放逻辑移至UniversalRanderer下的Dispose中,相当于变相延长了它的生命周期
- 添加bool变量判断是否是第一帧,添加针对ShadowMap的更新数组,数组有几个元素代表了做几帧的更新循环,如1|4代表了第一个级别与第三个级别的级联阴影块,如此处代表了每3帧中第一个级别更新2次,第二个级别更新1次,另外一个创建记录当前运行到多少帧的变量,方便取模按照3帧一个循环更新阴影贴图
- 修改MainLightShadowCasterCachedPass中ShadowMap创建逻辑,只有当对象为空或者ShadowMap大小发生改变时才创建
- 修改RenderMainLightCascadeShadowmap中的每帧渲染逻辑替换为按3帧一循环的渲染逻辑,并把RenderShadowSlice替换为修改的RenderShadowSlice,以控制不同级别阴影块的单独绘制,而不是控制整个ShadowMap了