![469419ccf44970f426e7c4941da328ce.png](https://img-blog.csdnimg.cn/img_convert/469419ccf44970f426e7c4941da328ce.png)
【文章来源于斯坦福大学课件http://graphics.stanford.edu/courses/cs348b-01/course29.hanrahan.pdf,以下为翻译,译者水平有限,如有错误还请指出】
一:解决渲染方程
为了得到渲染方程,我们先从反射方程开始。
![ecc90f713aab2aa4a8de6d2c83b8b031.png](https://img-blog.csdnimg.cn/img_convert/ecc90f713aab2aa4a8de6d2c83b8b031.png)
反射的辐照光度(radiance)
几何光学的基本法则之一就是radiance在光学传播过程永远不会改变。(假设没有散射或吸收)。在没有物体的空间中,光会沿直线传播,而radiance在光线传播是不会改变。因此,假设有在接收表面上的一点
![240786cd3baa11a13c8473bd0e164fb2.png](https://img-blog.csdnimg.cn/img_convert/240786cd3baa11a13c8473bd0e164fb2.png)
![abd7f1e257fc7190074126601af10e94.png](https://img-blog.csdnimg.cn/img_convert/abd7f1e257fc7190074126601af10e94.png)
我们使用方向作为两点的函数:
![afc2a9eb158dbe0f571d42ef99c45c23.png](https://img-blog.csdnimg.cn/img_convert/afc2a9eb158dbe0f571d42ef99c45c23.png)
标准方式是将在
在两点radiance中引入符号也非常有用。
![3967421d540e084a2accad13ce16aa86.png](https://img-blog.csdnimg.cn/img_convert/3967421d540e084a2accad13ce16aa86.png)
以及三点的BRDF
![511394e7273a74890da48c932b7ab609.png](https://img-blog.csdnimg.cn/img_convert/511394e7273a74890da48c932b7ab609.png)
注意:此处定义的两点的radiance函数不同于两点在Kajiya的原始论文中定义的强度函数。
点到点的函数非常清晰而且符合直觉,所以非常有用。比如,如果
![00764903f3a6a97a5483d54ac7484402.png](https://img-blog.csdnimg.cn/img_convert/00764903f3a6a97a5483d54ac7484402.png)
反射方程涉及上半球的积分。通过将变量从固体角改为区域面积,可以很容易将积分改为曲面上的积分。只需要把固体角与源到表面积区域相关联就很容易做到。
![c61420762c110caa92820b65bfef1906.png](https://img-blog.csdnimg.cn/img_convert/c61420762c110caa92820b65bfef1906.png)
投影固体角就会变成
![ce3f3478b879d46dd47c4d00d391e3ad.png](https://img-blog.csdnimg.cn/img_convert/ce3f3478b879d46dd47c4d00d391e3ad.png)
其中
![a507779260e23dfd6b3d392decf7c4e1.png](https://img-blog.csdnimg.cn/img_convert/a507779260e23dfd6b3d392decf7c4e1.png)
在这些方程中,我们区分了用于在曲面上指定点
![ff63b3b3ec8137dd12badf5c00b9071b.png](https://img-blog.csdnimg.cn/img_convert/ff63b3b3ec8137dd12badf5c00b9071b.png)
最后反射方程就会变成如下形式的积分:
![d2f4bf7165524c73978eb08b24270a06.png](https://img-blog.csdnimg.cn/img_convert/d2f4bf7165524c73978eb08b24270a06.png)
在这个方程中,
最后一步是保证能量守恒。
![c44c85f9729fa1cddd23096c7dc520fe.png](https://img-blog.csdnimg.cn/img_convert/c44c85f9729fa1cddd23096c7dc520fe.png)
而出射(outgoing)的radiance是发射(emission)和反射(reflection)的radicance之和。在每个表面使用发射函数可以创建区域光源。将反射方程代入能量守恒方程,就得到了渲染方程。
![78e70607eecf534b7fb8cce9ec5f135e.png](https://img-blog.csdnimg.cn/img_convert/78e70607eecf534b7fb8cce9ec5f135e.png)
为了更加清晰明了,我们将出射radiance的下标o去掉了。
渲染方程将接收表面的radiance(即等式右侧第一项)和其他表面的radiance(等式右侧的积分项)结合起来。这个等式适用于环境任何表面的任何点。我们要弄清楚我们知道哪些,不知道哪些。发射函数
渲染方程有时候以算子的形式更加紧凑地写出。算子就是将一个函数映射到另一个函数的方法。在这里,这个函数就是radiance。
![4484ac2d77b52fee64096697be7c13a1.png](https://img-blog.csdnimg.cn/img_convert/4484ac2d77b52fee64096697be7c13a1.png)
有时候将算子
![6fec736568e8fcf85984705963923105.png](https://img-blog.csdnimg.cn/img_convert/6fec736568e8fcf85984705963923105.png)
![6b4095931821b62897881fab4c35b8be.png](https://img-blog.csdnimg.cn/img_convert/6b4095931821b62897881fab4c35b8be.png)
要解开渲染方程可以用迭代法。
![26a0eee530e6d3de4f7e803b48812ee4.png](https://img-blog.csdnimg.cn/img_convert/26a0eee530e6d3de4f7e803b48812ee4.png)
注意到
另一种解决诺伊曼级数的方法是使用类比:
![1dc9b319f08e9ec92da00f5980a8dfc4.png](https://img-blog.csdnimg.cn/img_convert/1dc9b319f08e9ec92da00f5980a8dfc4.png)
和
![e3c43a4a3a2bcd891f8c2e8f985830af.png](https://img-blog.csdnimg.cn/img_convert/e3c43a4a3a2bcd891f8c2e8f985830af.png)
渲染方程
![80a2cb70dae198ada4410c1a972d9fbc.png](https://img-blog.csdnimg.cn/img_convert/80a2cb70dae198ada4410c1a972d9fbc.png)
那么解法就是
![305efd1a1292077496ab0d5d6097be9b.png](https://img-blog.csdnimg.cn/img_convert/305efd1a1292077496ab0d5d6097be9b.png)
注意到
![714172277439e45245c281625f6ea673.png](https://img-blog.csdnimg.cn/img_convert/714172277439e45245c281625f6ea673.png)
写成这样的形式解也很有用
![63c2727e7e9b1ade00f402618c9f7c60.png](https://img-blog.csdnimg.cn/img_convert/63c2727e7e9b1ade00f402618c9f7c60.png)
我们来考虑其中一项:
![78ce1e3691a07792423606fe134cd9f5.png](https://img-blog.csdnimg.cn/img_convert/78ce1e3691a07792423606fe134cd9f5.png)
这个积分在几何和物理上都是很容易理解的。这代表了一簇(family)光线路径。每个路径都被反弹数和或长度
注意到这是非常高维的积分,比如路径长度为n,那么积分就是2n维的空间。积分也同时包含可见项和非常复杂的反射方程,这也就是为什么使用Monte Carlo方法来解决渲染等式。
首先是一个非常易于实践的步骤,与渲染等式的解和到摄像机里的图形变换有关。这个等式就是Measurement Equation
![27a728ef8a64b85b5557afbc614c87ba.png](https://img-blog.csdnimg.cn/img_convert/27a728ef8a64b85b5557afbc614c87ba.png)
响应函数
如上所示,图像的像素值是由与嵌套积分有关的函数决定。这些积分非常复杂,但我们可以采样函数来估算它。
- 在图像(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](https://img-blog.csdnimg.cn/img_convert/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:找到使用很少变量的估算方法。
【这才翻译了一半,原文实在太长,因此剩下的放到另一篇文章里。】