GAMES202这部分的笔记会详细一些
https://xzyw7.github.io/post/real-time-shadows/
一、基于图片的实时阴影
1.1 平面投影阴影
Shadow Volume?
- Unity-Projector组件
1.2 阴影映射
略
1.3 屏幕空间阴影映射
- 渲染屏幕空间深度图
- 从光源渲染shadow map
- 屏幕空间做一次阴影收集计算(Shadows Collector),得到一张屏幕空间阴影纹理
- 绘制物体的时候,用物体的屏幕UV坐标,采样该屏幕空间阴影纹理
二、Shadow Mapping的优化
2.1 自阴影问题
不建议叫Z-fighting
- 当比较深度时,为了避免表面自阴影,需要设置容错阈值
- 深度偏移(Depth Bias)
- 法线偏移(Normal Bias)
- 偏移过大会出现阴影悬浮,也叫做Peter Panning
自阴影的优化/偏移优化
由于shadow map采样率,这一片都对应了同一个深度
- 深度偏移:增加深度偏移使该像素向光源靠近
- 法线偏移沿法线方向向外偏移
- 偏移单位是shadow map的纹素
- 在Shadow Receive计算阶段,逐像素进行
- 只会在阴影深度测试时使用,不影响场景
Unity中的偏移优化
- Shadow Caster阶段基于顶点的Normal Bias
- 在Shadow Caster阶段让遮蔽物进行反向偏移
- 优点:性能高
2.2 走样问题
- 初始采样
- 渲染shadow map
- 透视走样
- 重采样
- 摄像机视角对采样信号(shadow map)重采样
2.2.1 透视走样的原因及解决方案
级联阴影映射
- 透视走样最有效的解决方案
- 把视锥体分割为多个子视锥体
- 为每个子视锥体计算独立的相等大小的Shadow map
2.2.2 重采样的原因及解决方案
- 阴影映射是一张动态生成的纹理
- 滤波-纹理采样误差的解决方案
- 阴影的滤波
- 使用一部分Shadow map采样点来计算某个指定View采样点的最终阴影结果
- 阴影的滤波
- 采样数
- 规则滤波,3x3或5x5
- 采用Poisson Disk等的形式来分布一定数量的采样点
- 滤波核函数
- 高斯函数作为滤波核函数
作业
- 总结实时阴影的优化方案
- 尝试自己实现一套阴影系统
直接放GAMES202的作业在这了
https://xzyw7.github.io/post/guo-cheng-ji-lu-games202-huan-jing-pei-zhi-yu-shi-shi-yin-ying/
参考资料
[1] https://www.bilibili.com/video/BV1Jf4y1P7ch
【技术美术百人计划】图形 4.3 实时阴影介绍