Shadow技术-起点

起因

项目的Shadow开始出现了问题,有2个BUG报到了我的身上

  1. 比较薄的Mesh出现了漏光(Light leaking)现象
  2. Cube旋转到一定角度,表面出现了“瑕疵”(Shadow Acne)

我开始意识到,确实需要一套比较完备、可控的阴影方案了

对Shadow的积累

目前我对Shadow技术的积累,仅限简单的Shadow Map原理和知道CSM大致的实现方式。
在看到前面两个BUG的时候,我大概知道是什么导致的,可以通过调整ShadowMap的尺寸以及两个bias参数来缓解这两个BUG,但是还是想借这个机会,“一劳永逸”的解决项目Shadow方案同时提升一下自己在Shaodw方面的积累

解决路线

传统手游项目对于静态物体大多使用烘焙阴影方案,动态物体可能使用Projector方式或者ShadowMap方式,配合Unity的Distance ShadowMask实现动静结合,还是非常不错的方案,效果和效率能达到一种完美的平衡(个人认为)
但是,由于项目的特殊需求,场景并不能使用烘焙方式来作为阴影解决方案(即使使用也可能需要实现一套Lightmap烘焙方案)。
目前项目使用的是传统的Shadowmap方式,基于Unity LWRP(4.0),Distance默认设置为25,1024尺寸
在这个配置下,无论如何调整bias都无法完美解决Light leaking、error Self-Shadow和Peter paning这三种问题
本质上,还是Shadowmap的精度问题。虽然可以通过提高Shadowmap的尺寸,但是我个人认为2048对于移动平台并不合适

调整Depth Bias和Normal Bias

首先通过调整这两个参数看是否能解决问题
这两个参数通过拉近物体的z值,和缩小物体来缓解Shadow Acne和错误的Self-Shadow问题
但是这两个值过大都会导致Peter Paning(Light leaking)问题,物体会看起来悬浮在平面上
而解决Light leaking问题,有两种方案

  • 一个是通过避免使用过薄的Mesh
  • 一种方法是进行Cull Front
    第一种就不说了,是一种避免方式,不是解决方式
    第二种其实在两个物体过于贴近的情况下,反而会产生更严重的悬浮问题,但是在距离不是很近的情况下,确实能很好的解决shadow acne和悬浮问题

Close Fit和Stable Fit

调整bias无望,开始选择对比Standard(Unity内置管线)对于阴影的实现,主要是因为目前使用的4.0版本的LWRP其实缺陷比较多,从Standard找到“稳定”的方式也是有可能的,通过对比发现Close Fit确实能提高不少阴影的效果
但是Close Fit实际上对于特定场景结构下,选择最小的光源视锥范围进行Shadowmap的生成,本质上是提高Shadowmap的精度。在Caster物体比较多、大的情况下,会退化到Stable Fit的效果上
虽然没有解决我的问题,但是提出了关键的线索-提高Shadowmap精度

思考

其实,调整bias来解决shadow的一些瑕疵问题是正确的,但是前提是shadowmap的精度足够,close fit在特定情况下能解决,也是因为close fit本质上在提高shadowmap的精度
在调整shadowmap尺寸不可行的情况下,调整shadow distance也是一个方案,但是调的过小,远处物体阴影丢失(因为没有烘焙的阴影)也是无法忍受的现象

CSM

CSM是解决shadowmap精度和性能直接平衡问题一种比较好的方法,之前考虑到性能问题关闭了CSM而使用传统的shadowmap,不过仔细一想,可能CSM性能的消耗不是很大
CSM会在距离相机较近的物体上使用精度较高、光源视锥更小(合适)来进行Shadowmap的渲染,远处物体使用更低精度、更大的光源视锥进行渲染
远处物体使用更小尺寸的Shadowmap,更大的光源视锥对比传统shadowmap方式应该性能更加节省,但是具体还没有性能测试,但是理论上感觉即使比传统shadowmap费,也费不了多少
准备研究一下CSM进行实验,如果一切顺利,CSM是项目即使使用的阴影方式(Mobile+PC)
具体细节,等仔细研究CSM过程中发现吧

你可能感兴趣的:(C++,Unity3D,Graphics)