【笔记】【百人计划】图形4.3 实时阴影算法

GAMES202这部分的笔记会详细一些

https://xzyw7.github.io/post/real-time-shadows/

一、基于图片的实时阴影

1.1 平面投影阴影

image-20221004195717680

Shadow Volume?

image-20221004195836867

  • Unity-Projector组件

image-20221004195901831

1.2 阴影映射

1.3 屏幕空间阴影映射

  1. 渲染屏幕空间深度图
  2. 从光源渲染shadow map
  3. 屏幕空间做一次阴影收集计算(Shadows Collector),得到一张屏幕空间阴影纹理
  4. 绘制物体的时候,用物体的屏幕UV坐标,采样该屏幕空间阴影纹理

二、Shadow Mapping的优化

2.1 自阴影问题

image-20221004201408133

不建议叫Z-fighting

  • 当比较深度时,为了避免表面自阴影,需要设置容错阈值
    • 深度偏移(Depth Bias)
    • 法线偏移(Normal Bias)
  • 偏移过大会出现阴影悬浮,也叫做Peter Panning

自阴影的优化/偏移优化

image-20221004201710705

由于shadow map采样率,这一片都对应了同一个深度

image-20221004202709240

  • 深度偏移:增加深度偏移使该像素向光源靠近
  • 法线偏移沿法线方向向外偏移
  • 偏移单位是shadow map的纹素
  • 在Shadow Receive计算阶段,逐像素进行
  • 只会在阴影深度测试时使用,不影响场景

Unity中的偏移优化

  • Shadow Caster阶段基于顶点的Normal Bias
  • 在Shadow Caster阶段让遮蔽物进行反向偏移
  • 优点:性能高

image-20221004203141895

2.2 走样问题

  • 初始采样
    • 渲染shadow map
    • 透视走样
  • 重采样
    • 摄像机视角对采样信号(shadow map)重采样

2.2.1 透视走样的原因及解决方案

image-20221004203316892

级联阴影映射
  • 透视走样最有效的解决方案
  • 把视锥体分割为多个子视锥体
  • 为每个子视锥体计算独立的相等大小的Shadow map

image-20221004203530303

2.2.2 重采样的原因及解决方案

  • 阴影映射是一张动态生成的纹理
  • 滤波-纹理采样误差的解决方案
    • 阴影的滤波
      • 使用一部分Shadow map采样点来计算某个指定View采样点的最终阴影结果

image-20221004203705456

  • 采样数
    • 规则滤波,3x3或5x5
    • 采用Poisson Disk等的形式来分布一定数量的采样点
  • 滤波核函数
    • 高斯函数作为滤波核函数

作业

  1. 总结实时阴影的优化方案
  2. 尝试自己实现一套阴影系统

直接放GAMES202的作业在这了

https://xzyw7.github.io/post/guo-cheng-ji-lu-games202-huan-jing-pei-zhi-yu-shi-shi-yin-ying/

image-20221005194550816

参考资料

[1] https://www.bilibili.com/video/BV1Jf4y1P7ch

【技术美术百人计划】图形 4.3 实时阴影介绍