直接光照的渲染方程:
其中,Ld(直接光照)可以写成:
其中t(p, ωi)是The ray-casting function gives the point p' on the first surface that the ray (p, ωi) intersects.
如下图所示:
由于
渲染方程可以先写成:
我们把向量的积分换成按面积的积分,如下图,到达p点的radiance是L(p' -> p)
原来的光照方程:
因为根据dω和dA的关系,有:
代入上面的dω'得到:
因为p''对p'只有可见和不可见两种情况,我们定义一个函数V(p', p'')代表可见性,V = 0不可见,V = 1可见。
上面式子中,定义一个G函数如下:
把G(p', p'')代入渲染方程中可得:
下面看路径是3条或以上的情况:
假如我只考虑P3是光源的情况,那么P1到P0的radiance的计算如下:
一条一条路径拆分:
由p3光源贡献的p2到p1的radiance是:
由p3光源贡献的p1到p0的radiance:
按上面的写法会有问题,因为L(p3->p2)已经是固定的,那么dA(p2)的积分就变得无效。
因为一条路径是所有点都确定下来,正确的写法如下:
其中积分域中的A是整个场景的几何体的面积。
如果p1,p2在采样到光源的情况下,那么p1到p0的radiance是:
每一项的光照贡献定义成,表示从经过n + 1个顶点的一整条路径的radiance。
p1到p0的贡献写成:
上式每个输出可以理解成第n次弹射的输出,每次弹射路径经过的顶点都加1。
其中
被称为该路径的吞吐量(throughput),描述的是路径承载的radiance的大小。
把路径吞吐量用T来表示:
最后路径P(n)输出的radiance可写成如下:
最后看的蒙特卡洛估计
如果把写成如下:
light estimate的部分写成蒙特卡洛估计:
注意:如果每次弹射,都采样N个方向来估计,下次弹射还是N个,那经过3次弹射,计算量达到N³。
所以路径追踪一次弹射的蒙特卡卡洛估计,只取N = 1。
假设两点在相互可见的情况下:
上式的估计可以写成:
按pbrbook的描述,最终可写成:
参考: