GAMES 202 - 学习笔记(05)
Lecture 5: Real-Time Environment Mapping
原课程视频链接以及官网
b站视频链接: https://www.bilibili.com/video/av887241709/.
课程官网链接: https://sites.cs.ucsb.edu/~lingqi/teaching/games202.html.
这是课程今天的内容
Real-Time Environment Mapping
Finishing up on shadows
在这一节课程介绍了 Distance Field Soft Shadows 软阴影算法,它是最近比较热门的一种制作软阴影的方法。它的计算时间相当快,阴影质量也比较好,但是存储存在一定问题
在介绍 Distance Field Soft Shadows 之前,课程先介绍了 Distance Functions
Distance Functions
Distance functions 表示:在任何一个点处,都定义了它离物体的最小距离,这个最小距离是有符号的,比如这个点在物体内部定义为负号,在物体外部定义为正号(SDF)
通过 SDF 可以很好的做 blending
在两种不同形状的物体间,通过混合两者的 SDF,能够很好的模拟两者的形变
Distance functions 应用 1:Ray marching
可以用于做 Ray marching。通过定义场景中每个位置到物体的最小距离,定义出三维场景的 SDF。那么当我们做光线追踪的时候,只需要查看每束光线对应的三维位置在 SDF 中能否打到周围物体即可。因为 SDF 中存储了该位置到物体的最小距离,所以距离的范围表现在三维中就是一个圆球体。
对于场景中的不同物体来说,我们只需要分别存储不同物体的 SDF ,然后在 Ray marching 的过程中取不同物体中最小的 SDF 即可
由于是在三维中 ,所以 SDF 的存储量是相当大的,因为需要对三维场景细分成不同的细小格子,然后存储对应的最小距离。同样,SDF 也不适用于场景中存在能够发生形变的物体,因为发生了形变就需要重新计算一次 SDF
这里有一篇文章讲 Ray Marching and Signed Distance Functions,可以参考了解:
http://jamie-wong.com/2016/07/15/ray-marching-signed-distance-functions/.
Distance functions 应用 2:软阴影
之前在算软阴影时,是通过 v i s i b i l i t y ⋅ s h a d i n g visibility⋅shading visibility⋅shading 计算某个着色点在阴影下的着色, SDF 正是通过近似估计 v i s i b i l i t y visibility visibility 项来实现的软阴影
SDF 在前面表示为场景中的点到物体的最小距离,在这里则表示的是光线与最小距离所呈的夹角,当夹角越小时, v i s i b i l i t y visibility visibility 就越小
该夹角定义为 arcsin SDF ( p ) p − o \arcsin \frac{\operatorname{SDF}(p)}{p-o} arcsinp−oSDF(p)
所以,有不同物体时我们只需要取最小的夹角即可:
如何计算角度呢?
直观来说是通过 arcsin SDF ( p ) p − o \arcsin \frac{\operatorname{SDF}(p)}{p-o} arcsinp−oSDF(p) 来计算,但是通常来说夹角不会大于 90°,所以此时 arcsin SDF ( p ) p − o \arcsin \frac{\operatorname{SDF}(p)}{p-o} arcsinp−oSDF(p) 可以直接用 k ⋅ SDF ( p ) p − o \frac{k \cdot \operatorname{SDF}(p)}{p-o} p−ok⋅SD