阴影总结(大纲)
补充:
a). VSM
在PCSS第三步中,想要阴影越软,查询区域就越大,频繁的贴图采样可能造成IO瓶颈。因此,通过切比雪夫不等式求得PCSS第三步PCF中当前着色点深度在周围区域中的位置(深度小于当前着色点的比例)。
b). VSSM
在求Average Block时,也应用切比雪夫不等式;
c). 切比雪夫不等式准确的条件
- filter的平均深度大于着色点的深度(但大部分情况下不用管这个);
- 深度大致符合正态分布,不会有过于高频的变化(如多隔断的窗户就很可能造成阴影的不准确);
d). ESM
具体做法:
- 对Shadow Map应用指数形式进行预滤波($e^{-cz}$ 处于0-1间);
- 计算着色点的在Shadow map space 的深度,应用指数形式,得到 $e^{cd}$;
- $f(t,d)=saturate(e^{c*(d-z)})$;
- 缺点:
- c越大,越准确,但随之也需要更高的精度去存储指数形式的深度值,一般需要32-bit的深度纹理。
- c小的时候有渗光的现象;
- 优点:
- 漏光少,最终渲染时性能开销小(为k。PCF:计算阴影的时间复杂度是k*n,其中k是采样次数,n是片段数量),特别是在Overdraw严重的时候(对比非屏幕空间的PCF);
- ESM对半透明、云影等表现好;
e). EVSM
VSM 中计算阴影值,考虑的是深度值的方差和均值,主要还是考虑深度的分布离散情况,如果将深度进行合理偏移,其仍符合切比雪夫不等式。
EVSM 里面采用了 $exp(cz)$ 和 $−exp(−cz)$ 两个函数进行偏移,然后取两个切比雪夫概率的较小值作为阴影值。()
四张16bit纹理;
f). LVSM
分层;
g). Virtual Shadow Map
这个迟些写个专门讲解的文章,讲讲VSM、VT、RVT之类的(咕咕咕