Path Tracing
PT主要是为了解决RT中无法处理漫反射的问题。
下图分别为直接光照(无漫反射)和全局光照的结果区别。(color bleeding)
solution 1 simple Monte Carlo
使用Monte Carlo公式求解渲染方程,得到以下解决方案:
随机地选择N条光线,向外射出,查看其是否可以打到光源上。
solution 2 Global Illumination
上述表达式有一个问题,当射出的光线没有打到光源,而是打到了另一个物体上时,应该怎么做?
回答是使用递归,在第二次打到的地方再次进行shade。
solution 3 Path Tracing
上述方案依旧有问题——如果每一次打出N根光线,第二次就会打出N*N根光线…光线的数量呈指数级增加,这是不可以接受的。为了解决这个问题,我们只能令N=1,也就是说,在每一个shading point,我们只随机选择一根光线打出。
solution 4 Russian Roulette(RR)
上述方案依旧有问题——对于递归而言,何时才是递归的终止条件?
这里我们采用RR的思想,我们先自己决定一个概率p,那么,在一个shading point内,有p的概率光线将会被打出,有(1-p)的概率光线将不会被打出。
由简单的概率论知识我们就可以得到:E = p*(Lo/p)+(1-p)*0 = Lo
所以可以由此得到以下伪代码:
solution 5 sampling the light
由以上四个方案组成了一个正确的PT的解决方案。
但是PT还有一些问题,比如在low spp的情况下,噪声非常大。
注:spp(sample per pixel)指的是一个像素内打出的光线数。
如下图,绿色像素的spp为3。
上述问题主要在于,我们从shading point打出的很多光线并没有和光源相交,都被浪费掉了,所以效率很低。
为了解决这个问题,我们可以选择直接从光源采样,而不是从shading point采样。我们需要做一些积分变换。
因此,我们最后得到的radiance主要是由两个部分组成:
-
light source(直接从光源采样,不需要RR)
-
other reflectors(间接的,需要RR)
最后得到伪代码: