【技术美术百人计划】实时阴影渲染
基于图片的实时阴影
平面投影阴影:
根据光的方向,把物体的每个顶点投影到平面地面上。
数学原理:相似三角形
缺点:只能投射到平面上,物体必须在光与平面之间。

投影阴影
为每个阴影投影体设置一个相机
把阴影投影体渲染到阴影纹理中
渲染阴影接收者,与阴影纹理进行混合

投影阴影——unity实现方法
Projector组件:
可以设置一个参数生成一个视椎体
Projector会使用提供给他的材质,绘制所有在他视椎体内的物体
用RT(RenderTexture)生成阴影映射图,把阴影投影体绘制到阴影纹理
给Projector设置物体和阴影映射图混合的材质

阴影映射:
左侧阴影中的位置,在右侧光照角度一定是不可见的,这就是阴影映射


Unity中的屏幕空间阴影映射:
渲染屏幕空间的深度贴图
从光源方向渲染阴影映射
在屏幕空间做一次阴影收集计算(ShadowCollector),这次计算会得到一张屏幕空间阴影纹理
在绘制物体时,用物体的屏幕坐标uv,采样3中得到的屏幕空间阴影贴图

阴影映射的优化
阴影映射自阴影问题
由于阴影映射分辨率有限,离散的采样点以及数值上的偏差可能造成不正确的自阴影,也被成为Z-Fighting或者阴影粉刺(SurfaceAcne)
解决方法:当比较深度时,为避免表面自阴影,设置一个容错阈值,如:深度偏移(DepthBias)、法线偏移(NormalBias)
但当深度偏移设置过大,会导致漏光现象,即阴影与投影者发生脱节,也叫作PeterPanning问题。
深度偏移:增加深度偏移会使该像素向光源靠近
法线偏移:沿表面法线方向向外偏移
偏移单位是阴影映射的纹素
在ShadowReceive计算阶段,逐像素进行
只会在阴影深度测试时使用,不会影响真实场景


阴影映射走样问题
以信号重建的过程来审视阴影映射
初始采样:渲染阴影映射
重采样:从摄像机视角对采样信号(阴影映射)重采样。

透视走样的原因及其解决方案
阴影映射在世界空间均匀分配
视椎体内物体经过透视投影后,近大远小,近平面和远平面的像素一样
靠近观察点的元素所用到采样点明显减少
这种误差称之为透视走样

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

重采样的原因及其解决方案
阴影映射是一张动态生成的纹理
滤波--纹理采样误差的解决方案
滤波:
图像处理中,通过滤波强调一些特征或者去除图像中一些不需要的部分
滤波是一个邻域操作算子,利用给定像素周围的像素值决定此像素最终输出值。
阴影的滤波:
使用一部分阴影映射采样点来计算某个指定View采样点的最终阴影结果的方法。
PCF滤波
从光的方向生成阴影映射
从view视角渲染场景,用阴影映射进行深度测试
该点通过深度测试,取该像素周围指定大小(滤波核)的范围,计算他们的可见平均值作为输出
