【文章来源于斯坦福大学课件http://graphics.stanford.edu/courses/cs348b-01/course29.hanrahan.pdf,以下为翻译,如有错误还请指出】
一:解决渲染方程
为了得到渲染方程,我们先从反射方程开始。
反射的辐照光度(radiance) 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 即入射光线散射到任何一个方向的概率分布函数。一般来说,这BRDF的两个方向向量将会指向表面外。
几何光学的基本法则之一就是radiance在光学传播过程永远不会改变。(假设没有散射或吸收)。在没有物体的空间中,光会沿直线传播,而radiance在光线传播是不会改变。因此,假设有在接收表面上的一点 ,看见了源表面的一点 ,那么接收表面处的radiance等于发射表面的radiance。
图1.1:在上半球面计算总和
我们使用方向作为两点的函数:
标准方式是将在 的入射radiance 使用从接收点 到发射点 的方向参数化。
在两点radiance中引入符号也非常有用。
以及三点的BRDF
注意:此处定义的两点的radiance函数不同于两点在Kajiya的原始论文中定义的强度函数。
点到点的函数非常清晰而且符合直觉,所以非常有用。比如,如果 能看见 ,那么 也能看见 。这种相互可见性表示为两点可见性函数, ,如果两点之间能够直接用线段连接而不被其他物体阻断,那么值就为1,否则为0。
图片1.2:两点几何体
反射方程涉及上半球的积分。通过将变量从固体角改为区域面积,可以很容易将积分改为曲面上的积分。只需要把固体角与源到表面积区域相关联就很容易做到。
投影固体角就会变成
其中
在这些方程中,我们区分了用于在曲面上指定点 ,以及我们所使用的积分,即差分方程 。但很多时候不会那么严格,而只用 或 去代表 或 。几何体因子 与differential form factor有关,即
最后反射方程就会变成如下形式的积分:
在这个方程中, 和 是独立变量,而我们使用参数 来积分表面区域。因此,入射方向 以及 的方向是这些位置的函数。
最后一步是保证能量守恒。
而出射(outgoing)的radiance是发射(emission)和反射(reflection)的radicance之和。在每个表面使用发射函数可以创建区域光源。将反射方程代入能量守恒方程,就得到了渲染方程。
为了更加清晰明了,我们将出射radiance的下标o去掉了。
渲染方程将接收表面的radiance(即等式右侧第一项)和其他表面的radiance(等式右侧的积分项)结合起来。这个等式适用于环境任何表面的任何点。我们要弄清楚我们知道哪些,不知道哪些。发射函数 和BRDF 是已知的,因为它们由场景的几何体,材质以及光源决定。我们不知道的是所有表面上的radiance 。为了计算出radiance我们必须解开这个等式。因为未知数 在积分符号里面,所以相当于积分等式。解开这个等式就是Mante Carlo Path Tracing的主要目标。
渲染方程有时候以算子的形式更加紧凑地写出。算子就是将一个函数映射到另一个函数的方法。在这里,这个函数就是radiance。
有时候将算子 拆分成两个算子 和 非常有用。 是transfer算子,用于把一个表面出射光转变到另一个表面。
是散射或反射算子,可以由入射光分布计算出出射光分布。
要解开渲染方程可以用迭代法。
注意到 ,而 是标识符算子(identity operator)。最终结果就是诺伊曼级数(Neumann Series)的形式解(formal solution),而非计算解(computed solution)。
另一种解决诺伊曼级数的方法是使用类比:
和
渲染方程
那么解法就是
注意到 只是发射函数的一个算子,把发射光传播到所有表面。
写成这样的形式解也很有用
我们来考虑其中一项:
这个积分在几何和物理上都是很容易理解的。这代表了一簇(family)光线路径。每个路径都被反弹数和或长度 n定义。给定长度,有许多可能的路径。而路径被一组顶点所指定。第一个顶点是光源,而接下来的顶点就是反射表面。给定长度的所有路径的总贡献由所有可能的光和表面位置积分而来,也就是在表面上积分 n 次。但我们必须权衡好,特定的路径积分包含了一系列几何体和反射项。等式的最终解决方法就是把所有长度的路径的总和相加,或简单来说,所有可能的光路。
注意到这是非常高维的积分,比如路径长度为n,那么积分就是2n维的空间。积分也同时包含可见项和非常复杂的反射方程,这也就是为什么使用Monte Carlo方法来解决渲染等式。
首先是一个非常易于实践的步骤,与渲染等式的解和到摄像机里的图形变换有关。这个等式就是Measurement Equation
响应函数 取决于像素过滤器(由 决定)和小孔(aperture,由 决定),和快门(shutter,由 t 决定)。其他因子比如光线经过透镜系统的变换和光谱可见性也可添加进来。但简单起见我们将忽略这些东西。
如上所示,图像的像素值是由与嵌套积分有关的函数决定。这些积分非常复杂,但我们可以采样函数来估算它。
-
在图像(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就是两者之间。
特定的光线追踪技术使用特定的方法实现:
这组路径追踪使用正则表达式来表示,这最早由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:找到使用很少变量的估算方法。
【这才翻译了一半,原文实在太长,因此剩下的放到另一篇文章里。】
哗啦cl 发布了194 篇原创文章 · 获赞 8 · 访问量 1万+ 私信 关注