在光线传输中,光子的碰撞导致了光线能量的变化,这主要有两种情况,情况a:传输过程中光子和粒子的碰撞;情况b:光子和物体表面的碰撞。前一篇我们讲了如何通过radiance描述一条光线携带的能量,本篇主要解释这些碰撞引起的光线状态变化,以及如何计算radiance在这个过程中的变化。
BRDF
我们假设真空环境,因此只需要考虑情况b。光线和物体表面碰撞时,会有漫反射,镜面反射(不考虑折射),同时一部分能量也会转换为热能。如上图,在这个过程中,我们可以理解为来自方向
的光线(radiance),打到物体表面的某一个微表面
,能量被该表面吸收后又以方向
发射出一条光线(radiance)。这里,这个微表面
接收到来自
方向的光线的能量,对应radiance和irradiance的转换:
而从该微表面
以
方向射出的光线的能量,则记为
(相对于
)。
这里会引入一个函数BRDF,用来定义微表面
接收到的来自
的irradiance和发射到
的radiance之间的比例:
RE
BRDF决定了物体和光之间的相互作用,最终对应的就是我们常说的材质模型BRDFs。通过BRDF,既然我们能够计算从一个角度
的入射光对反射光的贡献
,我们也可以计算从任意角度的入射光对反射光的贡献,如上图,对
做一个半球积分:
这里,
是入射光的radiance,红色为其相对于
点微表面的irradiance,经过
转为反射光的radiance,对这个过程做一个半球积分,则可以得到反射光
的radiance。假如该点可以自发光,我们考虑其emission在
方向的贡献
,这就是大名鼎鼎的rendering equation(RE):
需要额外考虑两点:第一点,
和
没有本质区别,都是空间中的一条射线,相对于p点的反射光就是下一光路的入射光,区别仅仅是方向。因此,从线性代数上,如上的积分存在这样的线性关系:
这里,揭示了光路贡献的来源:红色的自发光(从光源直接打到相机,光路长度1),绿色是直接光照(光源打到物体表面然后直接打到相机,光路长度2),橙色则是间接光照(经过2 反弹后打到相机,光路长度3 )。
通常,rasterization渲染管线能够高效且简单的考虑前两部分的贡献,而光线追踪可以做到考虑所有光路的贡献:global illumination = direct illumination indirect illumination。下图可以看到direct和indirect各自的贡献(从光源出发或从相机出发的光路贡献的不同)。
VRE
接着,我们在考虑情况a,非真空下,光线传输过程中的碰撞。在这个过程中,主要有四种情况:
- Absorption:光子和粒子碰撞后能量转化为粒子的内部能量,能量减少,我们定义
,描述该光子被吸收的概率
- Scattering:光子碰撞后方向发生变化,分为out和in两种情况,前者导致能量的减少,后者导致能量增强,我们定义
,描述该光子发生scattering的概率
- Emission:遇到会发光的粒子,能量增强
因此,最终radiance的变化等于上述三种情况之和,我们称其为radiative transfer equation(RTE):
这里,
,是absorption和out-scattering之和,称为extinction。
这个是积分微分方程,如上图,在
到
的光路中,每一个点都有一定概率发生如上的碰撞,我们取
,公式1左边是指radiance在
方向的变化,对两边求积分。这里,我们记Transmittance:
令
,
,
,
表示
之间的变化距离,等式1两边乘以
:
已知:
(2)式代入(3)式:
对于红色部分,我们可得:
这样,红色和蓝色部分抵消后,我们计算
,也就是从
到
的距离:
当
是,
,这样,我们通过RTE获取了volume rendering equation(VRE),公式(5)可得:
这里,
表示来自物体表面
的radiance,我们将其用rendering equation来表示,得到渲染方程的一般形式:
至此,我们推导出了渲染方程的一般解,基于这个公式,我们就可以获取任意场景下物理正确的渲染解。我愿称其为我心中的最美方程。但我想我还是不会纹在身上,我怕疼,公式太长了,忍不了。不清楚为何word的公式上传到微信公众号为何压缩的这么模糊,记得第一次时没有这个问题的。
参考资料
P14~P15 Games101
Path tracing in Production Siggraph 2019
light transport, Advanced Graphics, GMT, Utrecht University
PBR book
Production Volume Rendering SIGGRAPH 2017