重磅:3D光影已经完善,LayaAir2.6.0重构了阴影系统!
而与光效息息相关的另一个重要系统“阴影系统”,也是三维引擎中最常用的渲染功能之一。尤其是实时阴影相对于静态阴影,会大幅提升场景的生动性,带来更真实的视觉体验。因此,一个良好的阴影算法从引擎使用的角度来看是非常重要的。
LayaAir引擎团队本着精益求精的态度,在2.6.0版本中,对阴影系统进行了重构,针对现有的阴影系统功能进行了诸多改进和一些新特性的增加,带来了性能、效果、以及易用性的提升,下面我们来进行逐条讲解。
在以前引擎版本的阴影中,阴影使用普通渲染目标,在渲染时需要编码,采样时还需要解码。本次的2.6.0版本中,重构并使用了硬件级的Depth纹理来生成ShadowMap,大幅节约了渲染 ShadowMap的开销,充分挖掘了硬件潜力,所有平台下,均可大幅度提升生成ShadowMap渲染性能。
曾经有开发者抱怨阴影的明暗不能调节,达不到预期效果。本次重构,我们充分考虑了阴影的易用性,Light增加shadowStrength属性,提供了阴影的明暗调节功能,开发者可根据项目情况自行调节阴影深浅。
本次重构阴影系统时,我们充分考虑了对ShaodowMap精度的运用,增加shadowNearPlane属性,并通过阴影深度压缩技术提升ShadowMap的Z轴精度,另外开发者也可通过shadowNearPlane接口自行增加阴影深度范围,但是一般情况并不需要开发者理会。
也有开发者对我们反馈过阴影看不见、阴影找不到等问题,本次我们针对该问题,简化了shadowDistance接口概念,优化后shadowDistance为距离摄像机的最大距离,不再和光源位置混淆。阴影的可见距离只和距离摄像机的距离有关。
对于沿着灯光方向超过shadowDistance后无法在视锥内产生阴影的问题,开发者无需再关心,阴影内部做了优化,引擎会始终保持沿灯光方向投射阴影的正确性,shadowDistance接口易用性得到加强。
在对本次版本的易用性优化方面,我们考虑到曾经有开发者不明白shadowPCFType的含义而提出疑问,所以基于易用性角度出发,我们将shadowPCFType接口名称调整为更容易理解的ShdowMode,其值调整为Hard/SoftLow/SoftHigh(硬边缘阴影/低幅度软边缘阴影/高幅度软边缘阴影),使含义更加通俗直观。
“阴影斑”是很多引擎实现阴影无法避免的一个问题,而且对于不同的场景往往需要针对性的调节,在以前版本的阴影系统中并没有暴露可调接口。本次重构的版本里,我们为开发者增加了shadowDeothBias和shadowNormalBias两个接口来解决“阴影斑”的问题,开发者可根据项目情况自行控制参数调节。但是大部分情况,开发者其实无需理会。
实时阴影通常会增加大量的渲染批次,而阴影的裁剪精度在一定程度上也决定了渲染批次的最小值。尽可能的减少渲染到ShadowMap的批次可以降低性能开销。本次在重构阴影系统时,我们提升阴影裁剪精度,优化了阴影裁剪算法,减少shadowMap中不必要的渲染物体,使批次尽可能达到最少。从而提升了阴影的性能。
在很多的移动端设备,纹理单元通常只有8个,而在以前引擎版本的阴影系统中,最多会占用3个。这对一些拥有复杂贴图的Shader(比如引擎内置的PBR材质)是比较难受的。于是本次重构阴影系统,我们采用了阴影图集的方式,来优化阴影占用Shader纹理单元,让ShadowMap占用纹理单元在任何情况都保持为1,合理可控。为开发者自定义复杂Shader保留了更多的纹理单元。
ShadowMap数量保持为1之后,以前的接口shadowPSSMCount显然不具备名称表达的合理性,所以我们将其调整为shadowCascadesMode,调整后的名称含义为阴影的级联模式(NoCascades/TwoCascades/FourCascades) 。
支持Directional Lightmap RenderTexture增加Depth格式
RenderTexture增加ShadowMap格式
shaderPass增加pipelineMode
SystemUtils.supportRenderTextureFormat()增加Depth和ShadowMap格式支持
以往引擎版本更新说明:
LayaAir2.3支持任意多光源渲染, 引擎开始在GitHub实时提交维护了!3D导出插件支持Unity2018了!
引擎案例介绍:
END
推荐阅读: