起因
项目的Shadow开始出现了问题,有2个BUG报到了我的身上
- 比较薄的Mesh出现了漏光(Light leaking)现象
- 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