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方法
    在这里插入图片描述
    这节课是真难,又哭了~