由于之前实习接触到体积雾相关的东西,想顺带把这一系列相关渲染技术复现一下,于是从这篇文章开始看起RayMarching实时体积云渲染入门(上) - 知乎 [1] 。实现到一半发现自己很多理论不扎实的地方(代码和公式没法联系到一起),遂重新研读了PBRT的Volume Rendering [2]部分。不得不说,这东西不隔一阵子梳理一下真的巨容易忘,也应了闫在课上说的”常看常新“了。

微分形式

以下部分均来自[2]

对于一小段体积微元的出射强度 主要和一下几项有关:

吸收

当入射光线穿过体微元时,其能量损失为

其中, 为当前点吸收能量的多少。该项模拟了光线射入粒子内部造成的能量损失。

自发光

由于光线穿过的微元内粒子的化学,辐射等现象导致的能量出射。其微分形式和吸收类似

其中 为粒子的自发光强度。由于该现象在游戏中不常见,因此很少有和这项相关的技术。

出射/入射

描述了由于光线在粒子之间不断反射的现象。出射描述了由于本该输出的光线反射到其它方向造成的损失(吸收是光线进入到粒子内部 造成的损失,而出射是粒子之间 反射现象造成的损失)。其公式为:

其中 为散射强度项。由于其和吸收项形式基本一致,一般会将其与吸收项合并,称为extinction 项(这个词我一时想不到好的中文翻译)

与出射相对应,入射描述了部分“幸运”光线反射到出射方向上从而额外增加的能量。其公式为:

其中象函数(phase function) , 其描述了任意点p 上, 方向上的光线反射到 方向上的概率有多大。 项为光线反射到 上的数学期望。

入射能量项可以说是实时体积雾渲染最重要的一项。很多有趣的效果(天空体积云,上帝光,手电筒光的丁达尔效应)均来自此项。

合并形式

前文中介绍的诸多现象可以简单分为两类,减少能量(吸收/出射), 增加能量(入射/自发光)。而将这两种效应相加便可得到整个体渲染方程的微分形式。

其中,方程加号左边边对应能量衰减项,加号右边对应能量增加项。其中 为transmittance 项, 为source function,其定义为:

积分形式— Volume Render Equation

transmittance

对于体积雾中的散射/吸收现象,其满足微分方程:

定义边界条件:光线起始于位置 方向上传播的最远距离为,对应点为。 则 ,

由于,该微分方程可解得:

则光线穿过体积介质从 点到 ()点的衰减量(transmittance)可以定义为:

由于 的指数性质, 可以被中间点 拆分成两部分间接计算

这个性质在使用ray marching的求解器中十分常用。可以将整个光线的transmittance拆分成每一小步的transmittance的乘积。

而Tr项的指数部分被称为光学密度(Optical Thickness),其公式为:

当体积雾的密度为常数时,(2.3)可以写成:

其与Beer’s law 对应。

Volume Render Equation

无论是实时渲染还是离线光追,一般都使用积分形式。因此,从(1.6)推导体渲染方程的积分形式是必不可少的。计算过程主要参考[3]

方程的边界条件为: 沿着 方向,从 的距离为 的积分。则

下面推导公式(1.6)的积分形式。由于微分方程不可拆分(对 ,且 满足 满足 ,则 满足 不一定成立),因此不能直接将(2.2)直接用于(1.6)的解。

注意到(1.6)是一阶非齐次线性微分方程 , 该方程存在解析通解。

为表示简便,令 则:

替换为

由于 被替换 被替换为了 因此求导后 前带负号。同时,为了表达简便,这里把 写为

注意,这里 为关于变量 的函数。 也是利用了这点性质实现了简化。

观察得,(2.7)满足一阶非齐次线性微分方程的形式。其中 , 。这类方程有明确的解析解。(尽管Q(t)中包含 等同的 项,但根据[3]的推导,该项的贡献的测度为0,因此可以视作常数)

,由于:

带入(2.7)中得:

代入边界条件,对两边在0~d的范围内积分得:

其中

现在我们使用 分别表示积分区间的起点,积分区间的终点,积分区间的任意中间点,利用公式(2.3) 简化得:

这便是我们在PBRT中看到的经典渲染方程的形式。

这个结论还是很优雅的。简洁,且每一项都有明确的物理意义。如下图所示,每个点输入的辐射度等于其它表面反射并穿体积雾衰减后的辐射度(对应 )以及在中间虚线部分从source function收集的所有额外辐射度(对应方程的 项)

null scattering

这部分和实时渲染没什么关系,只是对PBRT 关于 null scattering公式的补充说明。PBRT中没有给出null scattering相关公式的推导,这里主要参考了[4]

TODO.

Phase Function

Phase Function的物理意义是光线从 方向反射到 方向的概率密度。其满足:

最后简单介绍一下PBRT中出现的Phase Function[2]。

各项同性象函数

各项异性象函数

其中 定义了该象函数各向异性函数lobe的拉伸程度。

[1] https://zhuanlan.zhihu.com/p/248406797

[2] https://pbr-book.org/4ed/Volume_Scattering

[3] http://www0.cs.ucl.ac.uk/research/vr/Projects/VLF/vlfpapers/sampling/Arvo_J__Transfer_Equations_in_Global_Illumination__SIGGRAPH_course_notes_1993.pdf

[4] https://cs.dartmouth.edu/~wjarosz/publications/miller19null.pdf