积分路径上有奇点的积分_蒙特卡洛路径追踪(Monte Carlo Pathing Tracing)(上篇)

469419ccf44970f426e7c4941da328ce.png

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

一:解决渲染方程

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

ecc90f713aab2aa4a8de6d2c83b8b031.png

反射的辐照光度(radiance)

可以用半球表面积分计算出来。BRDF
即入射光线散射到任何一个方向的概率分布函数。一般来说,这BRDF的两个方向向量将会指向表面外。

几何光学的基本法则之一就是radiance在光学传播过程永远不会改变。(假设没有散射或吸收)。在没有物体的空间中,光会沿直线传播,而radiance在光线传播是不会改变。因此,假设有在接收表面上的一点

,看见了源表面的一点
,那么接收表面处的radiance等于发射表面的radiance。

240786cd3baa11a13c8473bd0e164fb2.png

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

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

afc2a9eb158dbe0f571d42ef99c45c23.png

标准方式是将在

的入射radiance
使用从接收点
到发射点
的方向参数化。

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

3967421d540e084a2accad13ce16aa86.png

以及三点的BRDF

511394e7273a74890da48c932b7ab609.png

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

点到点的函数非常清晰而且符合直觉,所以非常有用。比如,如果

能看见
,那么
也能看见
。这种相互可见性表示为两点可见性函数,
,如果两点之间能够直接用线段连接而不被其他物体阻断,那么值就为1,否则为0。

00764903f3a6a97a5483d54ac7484402.png
图片1.2:两点几何体

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

c61420762c110caa92820b65bfef1906.png

投影固体角就会变成

ce3f3478b879d46dd47c4d00d391e3ad.png

其中

a507779260e23dfd6b3d392decf7c4e1.png

在这些方程中,我们区分了用于在曲面上指定点

,以及我们所使用的积分,即差分方程
。但很多时候不会那么严格,而只用
去代表
。几何体因子
与differential form factor有关,即

ff63b3b3ec8137dd12badf5c00b9071b.png

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

d2f4bf7165524c73978eb08b24270a06.png

在这个方程中,

是独立变量,而我们使用参数
来积分表面区域。因此,入射方向
以及
的方向是这些位置的函数。

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

c44c85f9729fa1cddd23096c7dc520fe.png

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

78e70607eecf534b7fb8cce9ec5f135e.png

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

渲染方程将接收表面的radiance(即等式右侧第一项)和其他表面的radiance(等式右侧的积分项)结合起来。这个等式适用于环境任何表面的任何点。我们要弄清楚我们知道哪些,不知道哪些。发射函数

和BRDF
是已知的,因为它们由场景的几何体,材质以及光源决定。我们不知道的是所有表面上的radiance
。为了计算出radiance我们必须解开这个等式。因为未知数
在积分符号里面,所以相当于积分等式。解开这个等式就是Mante Carlo Path Tracing的主要目标。

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

4484ac2d77b52fee64096697be7c13a1.png

有时候将算子

拆分成两个算子
非常有用。
是transfer算子,用于把一个表面出射光转变到另一个表面。

6fec736568e8fcf85984705963923105.png

是散射或反射算子,可以由入射光分布计算出出射光分布。

6b4095931821b62897881fab4c35b8be.png

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

26a0eee530e6d3de4f7e803b48812ee4.png

注意到

,而
是标识符算子(identity operator)。最终结果就是诺伊曼级数(Neumann Series)的形式解(formal solution),而非计算解(computed solution)。

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

1dc9b319f08e9ec92da00f5980a8dfc4.png

e3c43a4a3a2bcd891f8c2e8f985830af.png

渲染方程

80a2cb70dae198ada4410c1a972d9fbc.png

那么解法就是

305efd1a1292077496ab0d5d6097be9b.png

注意到

只是发射函数的一个算子,把发射光传播到所有表面。

714172277439e45245c281625f6ea673.png

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

63c2727e7e9b1ade00f402618c9f7c60.png

我们来考虑其中一项:

78ce1e3691a07792423606fe134cd9f5.png

这个积分在几何和物理上都是很容易理解的。这代表了一簇(family)光线路径。每个路径都被反弹数和或长度

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

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

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

27a728ef8a64b85b5557afbc614c87ba.png

响应函数

取决于像素过滤器(由
决定)和小孔(aperture,由
决定),和快门(shutter,由
决定)。其他因子比如光线经过透镜系统的变换和光谱可见性也可添加进来。但简单起见我们将忽略这些东西。

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

  • 在图像(x,y)上采样一个像素点来减少锯齿。
  • 采样一个摄像机aperture(u,v)来产生深度场
  • 在时间t即shutter采样来产生运动模糊
  • 在波长
    上采样来模拟光谱效应比如色散(dispersion)
  • 在反射函数上采样来产生模糊反射
  • 在透射函数上采样来产生模糊透射
  • 在光源的固体角上采样来产生penumbras 和 soft shadows
  • 在路径上采样来互反射(interreflection)

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

二:蒙特卡洛路径追踪

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

E —— 眼睛。

L —— 光源。

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

D —— 漫反射或是传输

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

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

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

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

028fc86a7eb9911dfb7d0e444eef06ca.png

这组路径追踪使用正则表达式来表示,这最早由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:找到使用很少变量的估算方法。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
柯西主值积分是对于点为端点的无穷区间的积分进行的一种处理方式,由于无穷区间的积分常常不存在,或者存在但不收敛,因此需要采用柯西主值的方法进行处理,将积分区间分为两个有限区间,分别计算积分后再取其主值。 对于带有点的无穷区间的柯西主值积分,可以使用Matlab的contourc函数进行计算。具体步骤如下: 1. 定义积分函数及积分路径路径需要避开点,一般采用半圆弧路径或者自由选定路径。 2. 将路径分为有限部分和无限部分,有限部分可以采用Matlab的integral函数进行计算,无限部分需要采用contourc函数进行计算。 3. 对于无限部分,使用contourc函数将其转化为有限部分,然后采用Matlab的integral函数进行计算。 4. 将有限部分和无限部分的积分结果相加,即可得到带有点的无穷区间的柯西主值积分。 下面是一个简单的Matlab代码实现: ```matlab % 定义积分函数 f = @(x) exp(-x) ./ (1 + x); % 定义积分路径 R = 10; % 半径 theta = linspace(0, pi, 100); gamma = R * exp(1i * theta); % 将路径分为有限部分和无限部分 gamma_inf = R * exp(1i * pi) * linspace(-1, 1, 1001); gamma_finite = gamma(1:end-1); % 计算有限部分积分 I_finite = integral(f, gamma_finite(1), gamma_finite(end)); % 计算无限部分积分 z = gamma_inf; c = 0; w = f(z) .* (z-c).^(-1/2); contour = contourc(real(z), imag(z), real(w), [0 0]); I_inf = 0; for k=1:length(contour) if contour(1,k) == 0 x = contour(1,k+1:k+contour(2,k)); y = contour(2,k+1:k+contour(2,k)); I_inf = I_inf + integral(@(x) interp1(x, y, xq), x(1), x(end)); % xq 是需要计算的点 end end % 计算主值积分 I = I_finite + I_inf; ``` 其中,interp1函数是用来对contourc函数计算结果进行插值的函数,xq是需要计算的点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值