查看原文
其他

重磅:3D光影已经完善,LayaAir2.6.0重构了阴影系统!

郭磊 Layabox 2023-08-11
早在去年9月的2.3版本中,LayaAir引擎就支持了任意数量和任意类型的实时光源等,让场景的实时光照等渲染效果得以大幅提升。在上个版本重构完善PBR的时候,还接入了全局光,不断加强3D场景中关于光的效果。


而与光效息息相关的另一个重要系统“阴影系统”,也是三维引擎中最常用的渲染功能之一。尤其是实时阴影相对于静态阴影,会大幅提升场景的生动性,带来更真实的视觉体验。因此,一个良好的阴影算法从引擎使用的角度来看是非常重要的。


LayaAir引擎团队本着精益求精的态度,在2.6.0版本中,对阴影系统进行了重构,针对现有的阴影系统功能进行了诸多改进和一些新特性的增加,带来了性能、效果、以及易用性的提升,下面我们来进行逐条讲解。


一、提升生成ShadowMap的渲染性能

在以前引擎版本的阴影中,阴影使用普通渲染目标,在渲染时需要编码,采样时还需要解码。本次的2.6.0版本中,重构并使用了硬件级的Depth纹理来生成ShadowMap,大幅节约了渲染 ShadowMap的开销,充分挖掘了硬件潜力,所有平台下,均可大幅度提升生成ShadowMap渲染性能。


二、使用硬件ShadowMap提升阴影效果
在WebGL2.0下,我们本次的2.6.0版本中,使用了ShadowMap硬件纹理,对阴影性能与效果进一步做了提升。ShadowMap纹理的特点是由硬件进行深度比较,并且可以先比较后进行线性过滤,可谓是硬件级的PCF,不仅带来了性能的提升,还带来了效果的提升,一箭双雕。

三、提升自定义Shader阴影易用性
开发者使用以前的引擎版本,用自定义Shader实现阴影有些复杂,尤其是产生阴影的pass和渲染的pass混淆在一起时,不太友好。本次的2.6.0版本中,剥离ShadowCaster为独立pass,使得结构更加清晰,一目了然。让自定义Shader实现阴影更加简单。


四、大幅提升阴影效果和稳定性
在以往引擎版本的阴影系统中,我们移动摄像机经常会发现阴影的边缘会剧烈抖动,视觉效果非常难受,本次重构我们重点考虑了阴影效果的稳定性,解决摄像机移动和旋转时阴影边缘抖动的问题,大幅提升阴影效果和稳定性。在移动摄像机时,你会发现阴影坚若磐石,达到了烘培级阴影的稳定性,整体来说为开发者带来了极大的视觉舒适感。


五、提升软阴影效果并优化性能我们还在本次版本中,优化了软阴影的算法,减少了对shadowMap的采样次数,在一定程度上提升了软阴影的性能和效果。


六、提供阴影明暗调节功能

曾经有开发者抱怨阴影的明暗不能调节,达不到预期效果。本次重构,我们充分考虑了阴影的易用性,Light增加shadowStrength属性,提供了阴影的明暗调节功能,开发者可根据项目情况自行调节阴影深浅。


七、提升shdowMapZ轴精度

本次重构阴影系统时,我们充分考虑了对ShaodowMap精度的运用,增加shadowNearPlane属性,并通过阴影深度压缩技术提升ShadowMap的Z轴精度,另外开发者也可通过shadowNearPlane接口自行增加阴影深度范围,但是一般情况并不需要开发者理会。


八、优化shadowDistance易用性

有开发者对我们反馈过阴影看不见、阴影找不到等问题,本次我们针对该问题,简化了shadowDistance接口概念,优化后shadowDistance为距离摄像机的最大距离,不再和光源位置混淆。阴影的可见距离只和距离摄像机的距离有关。

对于沿着灯光方向超过shadowDistance后无法在视锥内产生阴影的问题,开发者无需再关心,阴影内部做了优化,引擎会始终保持沿灯光方向投射阴影的正确性,shadowDistance接口易用性得到加强。


九、阴影渲染模式的名称更易懂

在对本次版本的易用性优化方面,我们考虑到曾经有开发者不明白shadowPCFType的含义而提出疑问,所以基于易用性角度出发,我们将shadowPCFType接口名称调整为更容易理解的ShdowMode,其值调整为Hard/SoftLow/SoftHigh(硬边缘阴影/低幅度软边缘阴影/高幅度软边缘阴影),使含义更加通俗直观。


十、新增两个接口解决“阴影斑”

“阴影斑”是很多引擎实现阴影无法避免的一个问题,而且对于不同的场景往往需要针对性的调节,在以前版本的阴影系统中并没有暴露可调接口。本次重构的版本里,我们为开发者增加了shadowDeothBias和shadowNormalBias两个接口来解决“阴影斑”的问题,开发者可根据项目情况自行控制参数调节。但是大部分情况,开发者其实无需理会。


十一、提升了阴影性能

实时阴影通常会增加大量的渲染批次,而阴影的裁剪精度在一定程度上也决定了渲染批次的最小值。尽可能的减少渲染到ShadowMap的批次可以降低性能开销。本次在重构阴影系统时,我们提升阴影裁剪精度,优化了阴影裁剪算法,减少shadowMap中不必要的渲染物体,使批次尽可能达到最少。从而提升了阴影的性能


十二、缩减Shader纹理单元占用

在很多的移动端设备,纹理单元通常只有8个,而在以前引擎版本的阴影系统中,最多会占用3个。这对一些拥有复杂贴图的Shader(比如引擎内置的PBR材质)是比较难受的。于是本次重构阴影系统,我们采用了阴影图集的方式,来优化阴影占用Shader纹理单元,让ShadowMap占用纹理单元在任何情况都保持为1,合理可控。为开发者自定义复杂Shader保留了更多的纹理单元。

ShadowMap数量保持为1之后,以前的接口shadowPSSMCount显然不具备名称表达的合理性,所以我们将其调整为shadowCascadesMode,调整后的名称含义为阴影的级联模式(NoCascades/TwoCascades/FourCascades) 。


十三、提升ShadowMap利用率、阴影效果
在“稳定性的阴影”算法中通常会由于摄像机的FOV较大导致ShadowMap利用率非常低,本次重构阴影后我们采用球面分割代替了平行分割,大幅提升了ShadowMap利用率,同时也间接提升了阴影的效果。


十四、其它新增功能
  •     支持Directional Lightmap
  •     RenderTexture增加Depth格式

  •     RenderTexture增加ShadowMap格式  

  •     shaderPass增加pipelineMode

  •     SystemUtils.supportRenderTextureFormat()增加Depth和ShadowMap格式支持


以往引擎版本更新说明:


引擎案例介绍:


END


推荐阅读:

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存