本文章是关于GAMES101课程的笔记。
一、影子映射(Shadow Mapping)
算法核心: 光源估计深度与相机重映射的深度是否相等?
存在问题:
- 硬阴影(仅限点光源)
- 质量取决于阴影图分辨率(基于图像的技术的一般问题)
- 涉及浮点深度值的相等比较意味着规模、偏差、容差问题
硬阴影与软阴影:
二、光线投射(Ray Casting)
提出:
- 通过每个像素投射一条光线来生成图像
- 通过向光源发射光线来检查阴影
针孔模型:
三、光线-表面相交(Ray-Surface Intersection)
射线等式:
射线与平面相交:
Moller Trumbore 算法: 加速射线与平面相交的计算。
四、加速射线-平面相交计算
Bounding Volumes:
- 物体完全包含在体积中;
- 若没有击中体积,则没有击中物体;
- 先测试是否击中体积,再测试物体是否击中
AABB: Axis-Aligned Bounding Box:
- 射线仅在进入所有板对时才进入盒子
- 只要光线离开任意板对,则它就是离开了盒子
- 对于三维盒子,则 $t_{enter}=\max\{\mathrm{t_{min}}\},\mathrm{t_{exit}}=\min\{\mathrm{t_{max}}\}$ ;
- 当且仅当 $t_{\mathrm{enter}}
=0$ 时,AABB成立
AABB 的优势: 加速计算
五、AABB加速光线追踪
Grids:统一空间分割:
Grids 存在的问题:
- Grids 适用于大小和空间均匀分布的大型对象集合
- 大量空白区域使用 Grids 会造成资源浪费
空间分割:
KD-Tree:
- 内部节点存储
- 分割轴:x、y 或 z 轴
- 分割位置:分割平面沿轴的坐标
- 子节点:指向子节点的指针
- 内部节点中不存储任何对象
- 叶子节点存储
- 对象列表
- 内部节点存储
物体分割——Bounding Volume Hierarchy(BVH):
- 查找边界框
- 递归地将对象集拆分成两个子集
- 重新计算子集的边界框
- 必要时停止
- 在每个叶子节点存储对象
空间划分 vs 物体划分:
- 空间:
- 将空间划分为不重叠的区域
- 一个对象可以包含在多个区域中
- 物体:
- 将对象集划分为不相交的子集
- 每组的边界框可能在空间上重叠
- 空间:
六、辐射度量学(Radiometry)
基本名词解释:
Radiant flux:光度量的功率
Radiant Intensity:单位立体角(Solid angle)上的功率
Solid Angle:立体角,球体所对面积与半径平方之比,积分和为 $4\pi$
Irradiance:入射到表面点上的每单位面积的功率
Radiance:每单位立体角、每单位投影面积发射、反射、传播或接收的功率
联系:
Incident Radiance:到达表面的每单位立体角的 Irradiance
Exiting Radiance:离开表面的每单位投影面积的 Intensity
Irradiance vs. Radiance
七、双向反射率分布函数(Bidirectional Reflectance Distribution Function )
定义: 表示有多少光从每个入射方向反射到每个出射方向 $w_r$
渲染方程:
通过渲染方程得到全局光照:
光线追踪与折射: 光线追踪最终可以拆解为光源发射和多次折射光的累加
八、蒙特卡洛积分(Monte Carlo Integration)
意义: 对于一个复杂函数较难得到其积分,故采用蒙特卡洛的随机性近似得到复杂函数的积分。
求解: 取随机采样的积分的平均值。
九、路径追踪(Path Tracing)
Ray Tracing 的局限性:
- 始终执行镜面反射或折射;
- 在漫反射表面停止。
路径追综于蒙特卡洛积分 : 路径追踪可以看成某个半球内的所有光线对某一出射方向的积分和,但该积分较难求得解析解,故此时可以使用蒙特卡洛积分进行近似求解。
直接光照的路径追踪:
引入全局光照: 对于经过一次或多次折射的光线,可以以入射点反向观测,直至形成新的直接光照。
全局光照的指数爆炸问题: 到达入射点的光线可以是无限多,若每一条光线进行反向传播则会导致指数爆炸,计算量过大。
俄罗斯轮盘赌(Russian Roulette,RR):
RR 解决指数爆炸问题:
对光源采样: 某一被观测点,其“打中”光源所需的射线会由于光源大小而产生不同,此时如果对光源位置进行采样,则可以避免资源的浪费。
光源采样模型: 将对半球的积分转移到对光源到半球某一面积上的积分。
最终采样模型:
- 光源(无需使用RR)
- 间接反射(需要RR)
直接光源是否被遮挡: 对光线进行采样积分时先检测光源与入射点之间是否存在遮挡关系。