Q124:PBRT-V3,“路径追踪”积分器(14.5章节)

〇、概述

路径形式的LTE:

Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第1张图片

由这个方程得知,要求解从撞击点p1返回到相机p0的辐射率,需要解决两个问题:

问题1,怎么对无穷条路径返回的辐射率进行求和?

问题2,怎么求某一条路径返回的辐射率?

一、怎么求和?

可以使用Russian roulette方法。

参考: Q122:PBRT-V3,提高Monte Carlo积分计算效率的方法——Russian Roulette和Splitting(13.7章节)

那么,求和的式子等价于:

Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第2张图片
这里的qn即为“Q122”中提到的beta(n)。

二、怎么求某一条路径返回的辐射率?

2.1 构建递增的路径

光线从相机p0出发,撞击到场景中最近距离的某表面上的p1;
对p1点的BSDF1进行采样,得到一个方向wi1;
光线从p1出发,沿着wi向外撞击场景中最近距离的某表面上的p2;
对p2点的BSDF2进行采样,得到一个方向wi2;
光线从p2出发,沿着wi2向外撞击场景中最近距离的某表面上的p3;
……

当光线到达p1是得到长度为1的路径;
当光线到达p2是得到长度为2的路径;
当光线到达p3是得到长度为3的路径;
……

发现:
1-长度为n的路径是在长度为n-1的路径的基础上构建得到的。
2-当完成长度为n的路径的构建时,其实在这过程中已经完成了n条长度一次递增的路径的构建。
3-相邻两个撞击点p(n-1)、p(n)是彼此可见的,所以路径形式的LTE中的几何因子G中的可见因子V是等于1的。

考虑到,在构建长度为n的路径的过程中在前面(n-1)个撞击点(p1、p2、……、p(n-1))处都是基于立体角对BSDF进行采样的(最后一个点是打在光源上,对光源还是基于面积的采样)。

所以,需要将长度为n的路径上返回的光的表达式中的前(n-1)个积分换成立体角形式:
Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第3张图片

Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第4张图片

所以,
Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第5张图片

三、C++代码实现

特别注意的是:
单条路径的最后一个顶点p(n)是在光源上,所以p(n-1)处的渲染即为“直接光照”。
直接调用 Q120:PBRT-V3,“直接光照”积分器(14.3章节)中实现的UniformSampleOneLight()

另外,对for()循环整体的理解截图如下:
Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第6张图片

接下来直接看PathIntegrator::Li()

Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第7张图片
Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第8张图片
Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第9张图片
(缺失的这段代码是subsurface相关,略去先)
Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第10张图片

四、总结

PathIntegrator的大概步骤总结如下:

1,构建递增的路径

当完成长度为n的路径的构建时,其实在这过程中已经完成了n条长度一次递增的路径的构建。

2,求长度为n的路径的贡献

用式子14.19求出长度为n-1的路径对应的β,然后用“直接光照”的方式求得长度为n的路径的贡献。

3,所有长度的路径的贡献的累加

PBRT-V3提供的程序中巧妙的地方在于:一边构建路径,一边进行相应路径贡献的累加;构建完成时,累加也完成了。

4,Russian Roulette终止继续构建路径


内容概要的另一个版本:

Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第11张图片


另外,

Q124:PBRT-V3,“路径追踪”积分器(14.5章节)_第12张图片

你可能感兴趣的:(PBRT,computer,graphics,ray,trace,C++)