路径追踪
本章介绍路径追踪 (Path Tracing) 和纹理烘焙 (Texture Baking), 并讨论光线追踪与路径追踪所可以营造的视觉效果.
路径追踪
我们首先讨论一项为了解决传统光线追踪和辐射着色的内生问题而设计出的新渲染方法: 路径追踪 (Path Tracing
).
路径追踪的基本思想和光线追踪类似, 都是在现有的给定场景中, 从观察视平面的某个像素开始发射光线并基于光线在场景中和不同物体与光源之间的交互, 决定视平面上的像素颜色, 实现对场景的渲染.
由此, 路径追踪也是 Simple Recursive
的:
- 首先从视平面的某个像素处射出一束光线到场景中 (也就是和光线追踪相同的
Sample Per Pixel, SPP
方法), 当这束光线和场景中的某一个平面交互 (Intersect
) 时, 在这个交互点上需要计算从光源到它的 直接光照 (Direct Illumination
). - 然后, 在该点上我们将 基于表面材质的特性, 向随机方向 射出一条新的光线以计算该点的 间接光照 (
Indirect Illumination
). - 用于计算间接光照的新光线又会在场景中和其他平面交互, 而在新的交互点上, 还会计算该点的直接光照和间接光照, 因此若不加限制, 生成的光线将会越来越多.
- 在实际情况中, 一般在: 1) 光线射出场景, 不再和场景中的任何平面交互; 2) 随机决定不再追踪这条光线; 3) 达到预定的递归深度 时停止对光线的路径追踪, 以控制计算复杂度.
我们用简单的例子描述路径追踪的基本流程:
上图在带有两个茶壶和两个光源的经典康奈尔盒子的变体中说明了这个过程。
一条从视平面发出的路径到达了镀铬茶壶。铬表现出镜面反射,因此会产生一条反射光线(在镜面方向),随后反射到漫反射的红色墙壁上。
然后在该点 随机选择 光源上的一个位置. 然后, 从光源上的这个位置向交互点射出阴影探测光线(以红色虚线显示)以确定该点的可见性, 并计算来自该光源点的直接光照.
随后, 从该路径继续选择新的随机扩散反射射线, 可见这次新的光线撞击了天花板. 假设在该点上光线的继续传递被随机终止, 此时考虑该点的直接喝间接光照. 同样, 从光源的随机位置射出一条新的阴影探测光线, 计算该点的直接光照.
来自视平面的另一条路径首先到达漫射后壁, 在此处用同样的方法使用阴影探测光线计算光源关于该点的直接光照, 以确定该点的可见性.
然后选择新的反射方向: 此时光线射到玻璃茶壶上, 随机选择进一步追踪折射的光线路径, 而非镜面反射. 在光线射出玻璃茶壶后, 其路径到达粗糙的地面, 发生漫反射. 同样, 跟踪阴影光线并随机选择新的光线方向. 随机生成的新光线撞击蓝色的后壁, 同样在该点追踪另一条阴影射线. 为简化流程, 我们假定对这条光线路径的追踪在此处终止.
在路径追踪的每一步中, 光线路径的选择都是随机的, 而且不同于光线追踪, 我们每次只会选择 一条 新的路径进行进一步追踪, 因此往往需要较大的模拟次数才能得到令人满意的效果. 较少的模拟次数可以极快地渲染, 但得到的结果通常充满噪声且不准确, 而提升模拟次数得到的结果就会好很多.
路径追踪和光线追踪一样, 除了对 观察视平面的位置具有依赖性 外, 还需要在渲染前将整个场景的格局 预先固定, 从而确保 ALl Geometry are accessible during the entirety of rendering
. 路径追踪会一次性地渲染出 Shadows, Reflections, Refractions
和 indirect Diffuse
.
原生的路径追踪 无法渲染出景深效果 (Depth of Fiend
) 和动态模糊 (Motion Blur
), 但经过非常简单的改动就可以使路径追踪具有渲染这两种视觉效果的能力.
要使路径追踪能够渲染出景深效果, 只需在渲染时 从多个位置和方向有细微偏差的视点 处射出探测光线即可.
而动态模糊可以通过为每一条从视点射出的光线都赋予模拟相机快门时间的 随机时间戳 来实现: 每一条射出的光线都记录了一个特定的时间戳, 当光线和场景相交互, 需要执行直接光照和间接光照的检测 (Ray Intersection Test
) 时, 对场景基于这条光线继承的时间戳进行相应的移动和变换, 然后计算结果即可. 这样, 就模拟出了场景 “在极短的快门时间内发生移动” 的动态模糊效果.
因此, 我们可以说, 路径追踪 具有渲染景深效果和动态模糊的能力. 此外还有以下的结论:
”Path tracing naturally simulates many effects that have to be specifically added to other methods (conventional ray tracing or scanline rendering), such as soft shadows
, depth of field
, motion blur
, caustics
, ambient occlusion
, and indirect lighting
. “
路径追踪还可以渲染出 带有柔和边缘 的阴影, 这和传统的光线追踪不同: 传统的光线追踪认为光源为 点状 的, 由此某个物体通过遮挡光源在平面上投射的阴影范围是 完全确定 (Deterministic
) 的, 因此传统的光线追踪只能生成边缘粗糙锋利的阴影: Hard Shadow
, 或称 全影 (Umbra
)
而路径追踪由于认为再小的光源也具有一定的面积, 结合此前讨论的, 路径追踪在计算光源和物体之间的直接光照时 随机从光源表面的某个位置取点 的特性, 通过引入 随机性, 就使贴近现实的 “半阴影” (Penumbral Effect
) 与具备柔和边缘的阴影可被渲染.
如上图: $A$ 就是 Umbra
, 全影, 而 $B$ 部分则为 Penumbra
, 半影.
纹理烘焙
“纹理烘焙” (Baking
) 指将通过计算得到的, 往往是关于光照, 材质, 阴影等结果, 直接映射到三维物体的纹理贴图上, 从而在实际渲染时, 只需将预先 “烘焙” 得到的纹理贴图渲染出来, 就可以在特定的观察角度下得到与实际执行渲染毫无区别的视觉效果.
经过纹理烘焙得到的, 嵌入了特征信息的纹理贴图本身的渲染和观察视点的位置是 无关 的: 纹理贴图本质是静态的, 无论观察点在什么位置, 都不会影响对纹理贴图的渲染, 但纹理烘焙的最佳效果只有在从与嵌入烘焙得来的纹理贴图中的信息对应的位置观察才能得到最合适的效果.
光线追踪与路径追踪的视觉效果
路径追踪可以被视为随机化, 精简化的光线追踪, 因此光线追踪的视觉效果被路径追踪共享.
首先在对阴影的渲染上, 基于之前的知识我们了解, 传统的光线追踪只能渲染出 Hard Shadows
, 而路径追踪允许我们渲染半阴影和柔和的阴影.
其次, 路径追踪可渲染出 全局光照: 随着光线在整个场景中不断反射和传播, 就可以得到称为 Color Bleeding
, Indirect Lighting
或 Interreflection
的效果, 但传统光线追踪由于 只考虑镜面反射的相互作用, 因此无法渲染出 Color Bleeding
效果.
进一步地, 传统的光线追踪技术无法渲染出 模糊反射 (Glossy Reflection
). 为了渲染出模糊反射, 我们需要在反射面上 随机向多个方向射出多条光线, 这也就是 路径追踪 中的蒙特卡洛方法之一. 因此, 模糊反射属于可被路径追踪渲染, 而传统光线追踪无法渲染的效果. (?)
光线追踪和路径追踪技术还可实现 环境光遮蔽 (Ambient Occlusion
): 一种用于计算 场景中的每个点如何接受环境光 的技术.
此外, 光线追踪和路径追踪还可以实现 景深, 大气效果 (Participating Media
) 和 腐蚀效果.
问题:
模糊反射和环境光遮蔽的实现中都包含 “从某一点随机射出多条光线并对它们的路径进行追踪” 这一过程, 这是否意味着传统光线追踪技术无法实现这两种效果?