GAMES 202 - 学习笔记(03)
Lecture 3: Real-Time Shadows 1
原课程视频链接以及官网
b站视频链接: https://www.bilibili.com/video/av887241709/.
课程官网链接: https://sites.cs.ucsb.edu/~lingqi/teaching/games202.html.
上节课遗留的微积分部分课程不会再单独进行复习了,转而在每一节涉及到微积分的地方再进行解释,课程接下来会先主要介绍 Real-Time Shadows 这个话题
Real-Time Shadows
Recap: Shadow Mapping
课程首先回顾了 Shadow Mapping 的原理以及存在的问题和解决方案。
Shadow Mapping 是针对点光源制作阴影的技术。它是两趟(2-pass) 的算法:
-
第一趟从光源出发,记录从光源看向场景的深度 D l D_l Dl
-
第二趟从实际相机位置出发,看向场景,在着色过程中查看每个点能否被光源照亮,即比较 D v < D l D_v < D_l Dv<Dl,注意此时 D v , D l D_v,D_l Dv,Dl 应处于同一空间
它是图像空间算法,因为需要知道的是光源到场景的深度就可以做 Shadow Mapping,它也存在一些问题,比如自遮挡和走样问题
通过在 Shadow Mapping 的两趟中,对光源处所获得的深度进行可视化,可以得到如下结果:
Shadow Mapping 存在的问题:
自遮挡(Self occlusion): 是由于深度精度问题导致的。由于从光源处看向场景,会把场景的一块区域(图中红色线段区域)离散成光源处成像平面的像素,这时再与之比较,很有可能发生自遮挡问题:
解决办法是,两趟的比较结果在一定范围内不计算阴影,添加一定的 bias,但是这同样会引来其他问题,即阴影出现断裂:
学术界也提出方法来解决这个问题,但是由于实现多了一些复杂计算和存储,所以没有得到广泛的应用:
走样问题:由于深度缓冲分辨率导致的,可以采用 Cascaded Shadow Maps (该方法提供了不同分辨率的深度纹理)等方法来解决
The math behind shadow mapping
课程接下来讲了一下 Shadow Mapping 背后的数学原理:
首先在实时渲染(RTR)中,我们都考虑不等式为近似相等。在实时渲染中,有一个重要的近似为:
∫ Ω f ( x ) g ( x ) d x ≈ ∫ Ω f ( x ) d x ∫ Ω d x ⋅ ∫ Ω g ( x ) d x \int_{\Omega} f(x) g(x) \mathrm{d} x \approx \frac{\int_{\Omega} f(x) \mathrm{d} x}{\int_{\Omega} \mathrm{d} x} \cdot \int_{\Omega} g(x) \mathrm{d} x