GAMES101笔记(十六)
蒙特卡罗积分
对于一个不规则的图形,我们对其求定积分的过程可以转换为在积分域内对其中每一个xi进行采样(取f(xi)的值和 b-a 的值的乘积),然后将求得的采样值求平均就得到了这一个积分的值。
用数学表示就可以表示如下:

假设每种采样的分布概率一样,我们称其为pdf采样。
下面为一个例子:
在这样一个例子里面,pdf采样下的概率为1/(b-a)

代入积分式可得:

路径追踪
这里于Whited风格的光线追踪进行对比:
问题一:
对于粗糙的物体,每一次反射不一定都是直接的镜面反射,Whited风格则不能准确地描述其他漫反射的情况。

问题二:
Whited不考虑光线弹射多次的情况,而现实中光线打在一个物体上,还会继续弹射到其他物体的表面上。

将渲染方程按照蒙特卡洛积分的形式进行分解,可以得到如下式子:

再把这些分解的项组合起来得到最后的蒙特卡洛形式的渲染方程:

只考虑直接光照时(从反射点出发可以直接打在光源上):

引入间接光照(从反射点出发打在了物体上):

我们这个时候只需要把那个物体经过光源反射来的光线看成一个“光源"就可以了。

上一个式子中,对于一个光源,如果打出了100根光线,经过一个弹射后数据将变成了100的平方,这样经过多次弹射后数据量会发生指数倍增长。

而再蒙特卡洛积分中,我们将这一个光源发出的光线只经过一次采样,也就是N = 1 了,那么我们可以得到如下式子,而这就是路径追踪。

但是这样下去噪声会非常大。
对于这一问题我们可以多追踪几条穿过这一个像素的光线,然后将得到的Radiance求平均。

最后代码过程如下:

对于光线不断弹射的过程,也就是一个无限递归的问题,该怎么判断来结束递归,是一个问题。

怎么结束递归,这里用到了一个 俄罗斯轮盘赌(RR) 算法。
我们假设经过递归后的结果为Lo,然后我们再假设递归的概率为p,结束递归的概率为 1-p 。再递归时,返回值设置为 Lo/p 。这样,无论我们经过了多少次递归,这一个事件的期望都是Lo,也就是说最后的结果都是对的。

总结在代码里面如下:

而这样仍然有一些问题就是当我们采样时,一个像素穿过的光线定义过少,就会出现大片的不清晰的情况,如下图:

而且除了总体的光线数量的问题,我们的光源四散发射出均匀的光线,只有一小部分满足一定角度的会打在物体上,大量的光线打出去不能对物体着色。

在二维的光源平面上均匀采样,用的pdf也就是1/A(A为光源面积),而渲染方程是一个积分,是定义在立体角上的,也就是在那个半球上的。
在蒙特卡洛积分中,我们对定义域采样,然后也是在定义域上进行积分,那么现在蒙特卡洛方法就不能用了?

这时,我们可以把渲染方程转换为对光源的积分就可以了,也就是通过dw和dA的关系进行转换。

最后,我们就可以把渲染方程重写。

现在,我们就可以把之前我们在着色点上往各个方向去采样(打不打地到光源随缘)转换为直接对光源采样。
那么,我们就可以把着色点接收到的光线转为为两部分,一个是光源发出的,一个非光源反射的。

现在,我们就可以把代码改成如下形式:

那么有遮挡的情况呢?
做一条从p点到光源的连线判断有没有打在其他物体上的判断即可。

路径追踪终于完了,哭了快~
而光线追踪现在除了路径追踪方法外还有一些其他方法:
- 单向和双向路径追踪
- 光子映射
- 光线传输
- 结合了双向路径追踪的VCM方法和所有方法的UPBP方法

这节课是真难,又哭了~