进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

【文章来源于斯坦福大学课件http://graphics.stanford.edu/courses/cs348b-01/course29.hanrahan.pdf,以下为翻译,如有错误还请指出】

 

一:解决渲染方程

为了得到渲染方程,我们先从反射方程开始。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

反射的辐照光度(radiance) 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) is computed by integrating the incoming radiance overa hemisphere centered at a point of the surface and oriented such that its northpole is aligned with the surface normal.。【译注:这句我不会翻译】。BRDF 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 即入射光线散射到任何一个方向的概率分布函数。一般来说,这BRDF的两个方向向量将会指向表面外。

几何光学的基本法则之一就是radiance在光学传播过程永远不会改变。(假设没有散射或吸收)。在没有物体的空间中,光会沿直线传播,而radiance在光线传播是不会改变。因此,假设有在接收表面上的一点 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) ,看见了源表面的一点 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) ,那么接收表面处的radiance等于发射表面的radiance。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

图1.1:在上半球面计算总和

我们使用方向作为两点的函数:

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

标准方式是将在 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 的入射radiance 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 使用从接收点 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)到发射点 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)的方向参数化。

在两点radiance中引入符号也非常有用。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

以及三点的BRDF

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

注意:此处定义的两点的radiance函数不同于两点在Kajiya的原始论文中定义的强度函数。

点到点的函数非常清晰而且符合直觉,所以非常有用。比如,如果进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 能看见 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇),那么 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)也能看见 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 。这种相互可见性表示为两点可见性函数, 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) ,如果两点之间能够直接用线段连接而不被其他物体阻断,那么值就为1,否则为0。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

图片1.2:两点几何体

反射方程涉及上半球的积分。通过将变量从固体角改为区域面积,可以很容易将积分改为曲面上的积分。只需要把固体角与源到表面积区域相关联就很容易做到。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

投影固体角就会变成

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

其中

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

在这些方程中,我们区分了用于在曲面上指定点 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) ,以及我们所使用的积分,即差分方程 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 。但很多时候不会那么严格,而只用 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 去代表 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 。几何体因子 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 与differential form factor有关,即

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

最后反射方程就会变成如下形式的积分:

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

在这个方程中, 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 是独立变量,而我们使用参数 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 来积分表面区域。因此,入射方向 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 以及 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 的方向是这些位置的函数。

最后一步是保证能量守恒。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

而出射(outgoing)的radiance是发射(emission)和反射(reflection)的radicance之和。在每个表面使用发射函数可以创建区域光源。将反射方程代入能量守恒方程,就得到了渲染方程。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

为了更加清晰明了,我们将出射radiance的下标o去掉了。

渲染方程将接收表面的radiance(即等式右侧第一项)和其他表面的radiance(等式右侧的积分项)结合起来。这个等式适用于环境任何表面的任何点。我们要弄清楚我们知道哪些,不知道哪些。发射函数 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 和BRDF 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 是已知的,因为它们由场景的几何体,材质以及光源决定。我们不知道的是所有表面上的radiance 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 。为了计算出radiance我们必须解开这个等式。因为未知数 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 在积分符号里面,所以相当于积分等式。解开这个等式就是Mante Carlo Path Tracing的主要目标。

渲染方程有时候以算子的形式更加紧凑地写出。算子就是将一个函数映射到另一个函数的方法。在这里,这个函数就是radiance。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

有时候将算子 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 拆分成两个算子 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 非常有用。 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 是transfer算子,用于把一个表面出射光转变到另一个表面。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 是散射或反射算子,可以由入射光分布计算出出射光分布。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

要解开渲染方程可以用迭代法。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

注意到 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) ,而 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 是标识符算子(identity operator)。最终结果就是诺伊曼级数(Neumann Series)的形式解(formal solution),而非计算解(computed solution)。

另一种解决诺伊曼级数的方法是使用类比:

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

渲染方程

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

那么解法就是

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

注意到 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 只是发射函数的一个算子,把发射光传播到所有表面。

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

写成这样的形式解也很有用

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

我们来考虑其中一项:

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

这个积分在几何和物理上都是很容易理解的。这代表了一簇(family)光线路径。每个路径都被反弹数和或长度 n定义。给定长度,有许多可能的路径。而路径被一组顶点所指定。第一个顶点是光源,而接下来的顶点就是反射表面。给定长度的所有路径的总贡献由所有可能的光和表面位置积分而来,也就是在表面上积分 n 次。但我们必须权衡好,特定的路径积分包含了一系列几何体和反射项。等式的最终解决方法就是把所有长度的路径的总和相加,或简单来说,所有可能的光路。

注意到这是非常高维的积分,比如路径长度为n,那么积分就是2n维的空间。积分也同时包含可见项和非常复杂的反射方程,这也就是为什么使用Monte Carlo方法来解决渲染等式。

首先是一个非常易于实践的步骤,与渲染等式的解和到摄像机里的图形变换有关。这个等式就是Measurement Equation

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

响应函数 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 取决于像素过滤器(由 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 决定)和小孔(aperture,由 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 决定),和快门(shutter,由 t 决定)。其他因子比如光线经过透镜系统的变换和光谱可见性也可添加进来。但简单起见我们将忽略这些东西。

如上所示,图像的像素值是由与嵌套积分有关的函数决定。这些积分非常复杂,但我们可以采样函数来估算它。

  • 在图像(x,y)上采样一个像素点来减少锯齿。

  • 采样一个摄像机aperture(u,v)来产生深度场

  • 在时间t即shutter采样来产生运动模糊

  • 在波长 进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 上采样来模拟光谱效应比如色散(dispersion)

  • 在反射函数上采样来产生模糊反射

  • 在透射函数上采样来产生模糊透射

  • 在光源的固体角上采样来产生penumbras 和 soft shadows

  • 在路径上采样来互反射(interreflection)

在x,y,u,v和t上采样之前已经讨论过了。采样光源并且用半球积分也已经讨论过。最后剩下的就是采样路径。

 

二:蒙特卡洛路径追踪

首先,先来介绍一些符号。每个路径都终止于于眼睛或者光源。

E —— 眼睛。

L —— 光源。

每次光线反弹都意味着于一个表面的互动,即反射或是穿过(transmission)。有许多不同的函数,可以将它们符号化:

D —— 漫反射或是传输

G —— 光泽(glossy)反射或传输

S —— 高光 (specular)反射或传输

漫反射说明光有可能被散射到任何方向。高光意味着只有一个方向,也就是说,给定一个入射方向,那么只有一个特定的出射方向与之对应。最后,glossy就是两者之间。

特定的光线追踪技术使用特定的方法实现:

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

这组路径追踪使用正则表达式来表示,这最早由Shirley提出。所有路径都必须有光L,眼睛E,以及至少一个表面,所有路径最短长度为3。

但这个符号很棒的地方就是当不必追踪某些路径,或不用考虑某种特定的光线传输时非常清晰。例如,Appel的算法只追踪路径长度为3的,而忽略了其他路径,因此,只有直接光照会被考虑。Whitted的算法会追踪所有长度的路径,但忽略了通过镜面的光线,因此没有下面的E(D|G)*L项。分布式光线追踪和路径追踪包括很多次反射以及非高光散射,例如E(D|G)*L,但

现在来介绍基本的蒙特卡洛路径追踪算法

第一步:选择一个光线,给定参数(x,y,u,v,t)

第二步:找到与这个光线最近的一个表面交点处

第三步:随机决定是否计算发射(emitted)或反射(reflected)光。

第三步A:如果计算发射光:返回 weight * Le。

第三步B:如果计算反射光:weight *= reflectance,BRDF pdf随机散射,返回第二步。

这个算法将会在光到达光源时终止。简单起见,我们假设所有光源使用与表面有关的发射项。知乎我们将讨论如何更好地处理光源。

这个算法的一个变种是从反方向追踪光线,从光源到摄像机。我们假设反射表面永远不会吸收光线,而摄像机可以完美地吸收任何光线。

第一步:根据光源强度分布随机选择一个光源,根据自身密度函数产生一束光,weight = 1

第二步:跟踪光线并找到与表面的交点

第三步:随机决定是散射还是吸收光线

第三步A:如果散射,weight *= relfectance,根据BRDF随机散射光,然后返回第二步。

第三步B:如果被摄像机幕吸收,则记录x,y的权重,返回第一步。

第一个算法是前向传播。前向光线追踪里光线从眼睛开始传播到光源。而反向光线传播从光源开始,以眼睛结束,但在物理上来说两者并没有什么区别,因为光线方向的改变不会影响的其他性质。这两个方向各有优缺点,最好能结合起来用。

以上是简单的蒙特卡洛路径追踪算法,但我们现在仍然面临两个挑战:

挑战1:如何不失偏颇地采样无限数量的路径

挑战2:找到使用很少变量的估算方法。

【这才翻译了一半,原文实在太长,因此剩下的放到另一篇文章里。】

进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)进阶图形学(二十二)蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇) 哗啦cl 发布了194 篇原创文章 · 获赞 8 · 访问量 1万+ 私信 关注
上一篇:蒙特卡罗方法(Monte Carlo)


下一篇:Generating Random Numbers