1 Shadow Mapping 阴影映射
1.1 概览
1.1.1 Shadow Mapping 是一个 2-Pass Algorithm(需要渲染两趟)
- 第一遍从光源的位置渲染,得到Shadow Map。
- 第二遍从相机的位置渲染场景,结合上一步得到的Shadow Map就可以知道渲染的哪一部分位于阴影之中。
1.1.2 Shadow Mapping is an image-space algorithm 图像空间的算法
- 优点:不需要场景的几何知识
- 缺点:容易发生自遮挡现象和走样现象
Shadow Mapping最开始还是离线渲染的基础。
1.2 Shadow Mapping 实现过程
1.2.1 Render from Light
从光源输出深度图。
1.2.2 Render From Eye
从眼睛渲染图像,判断所在的点是否能被光源照到。
1.3 Shadow Mapping存在的问题
1.3.1 Self occlusion 自遮挡
- 由于是使用像素记录的离散的深度,所以对于上图的地板而言,深度的分布是一段一段的。
- 从camera渲染时,如图中的蓝红交点位置,这个时候,这个点在shadowmap对应的深度与位置橙色相同。导致橙色区域的地板遮住这个交点。
从上向下照,自遮挡问题最小。light与地面越平行,自遮挡问题最严重。
解决自遮挡问题
增加一个bias来减少自遮挡。
但是会让一些本来应该遮挡的物体没有被计算(detached shadow issue)。
Second-depth shadow mapping
- 记录最近的和此近点的深度。
- 求两个深度的中点然后记录到Shadow Map中。
存在的问题
- 需要物体是watertight的。所有的模型都需要正反面,比如地板就不行。
- 由于要记录次小的深度,会产生时间上的额外开销。
1.3.2 Aliasing 走样
阴影图分辨率不够大会走样(shadowmap每一个像素代表constant depth的小片)。
2 Shadow Mapping背后的数学
- 在实时渲染中,关心“约等于”。
- 实时渲染(RTR)中的一个重要的约等式。
把乘积的积分分成了积分的乘积,分母的作用是为了归一化。
在以下情况下,近似更加准确:
- 积分域很小。
- g函数足够的光滑,在积分域的范围变化不是很大。
渲染方程的近似
由以上,渲染方程可以写成
shading部分和Visiblity部分,可以先做shading,最后乘上visibility。
当积分函数足够平滑(光照 L不变,面光源比较光滑/BRDF diffuse是光滑 glossy时不光滑)
3 Percentage closer soft shadows(PCSS)
3.1 Percentage Closer Filtering(PCF)
PCF不是PCSS,最开始是抗锯齿用的,后来人们发现PCF还可以用来生成软阴影。
- 在阴影的边界提供 anti-aliasing(filtering the results of shadow comparisons)。
- 不是对已有锯齿的阴影进行Filter。
- 不是对Shadow Map进行Filter。
3.1.1 PCF Solution
- 对每一个fragment进行多次深度比较(比如7x7)。
- 平均比较的结果。
- e.g. 对地板上的P点:比较方框3x3范围内的所有像素,然后获得比较结果(9个非0即1的值),最后做平均得到visibility。
3.1.2 PCF的阴影抗锯齿效果
最后得到结果,可以看到阴影边缘已经没有锯齿。
filtering size 的影响:
- size小,阴影更sharper
- size大,阴影更soft
3.1.3 PCF给PCSS的启示
- 如果filter非常大,那么就可以得到软阴影。
- 所以可以先生成硬阴影,然后在不同的位置使用不同大小的Filter就可以达成软阴影的效果。
阴影的接收物到阴影投射物的距离(笔和影子)越大,阴影越软。
关键结论
- Filter size与blocker distance相关。
- 更准确的说,Filter size与相对的平均的投射的遮挡物的深度有关。
3.2 Percentage Closer Soft Shadows
3.2.1 概览
根据相似三角形,得出以下的式子(w越大,阴影越软)。
d
B
l
o
c
k
e
r
d_{Blocker}
dBlocker实际上是average blocker depth,因为blocker本身具有深度。
3.2.2 PCSS算法的完整流程
- Blocker search(获得某一区域的平均blocker深度)
- Penumbra estimation(使用平均blocker depth决定filter size)
- Percentage Closer Filtering
3.3.3 blocker search的范围
方案一:取固定大小的范围(比如5x5)
方案二:
blocker search的大小取决于light size和receiver distance from light。