Q127:PBRT-V3,理解“体渲染”积分器的关键竟然是这张图

来源:互联网 发布:手机如何设置网络共享 编辑:程序博客网 时间:2024/05/16 15:51

“体渲染”积分器是在“路径追踪”积分器的基础上考虑了场景中的介质,相当于是对“路径追踪”积分器的拓展。
所以,在学习“体渲染”积分器之前,得有“路径追踪”积分器的基础。参考:
Q124:PBRT-V3,“路径追踪”积分器(14.5章节)

一、那张关键的图

在学习“体渲染”时,一直感觉云里雾里。突然发现,理解“体渲染”积分器的关键竟然是这张图:
这里写图片描述
对应的方程:
这里写图片描述

上图和方程描述的是:
一条光线从p点出发,在某Medium中向前延伸,经过一段距离t和场景中的某Surface相交于p0点。

方程中参数解释如下:

p可以是Camera上的点,也可以是Medium或者Surface上的点。
若光线没有和场景中的任何Surface相交,则t=infinity()(无穷大)。
Lo(p0, -w)是交点p0处反射光线的辐射率。若没有交点,Lo(p0, -w)=0。
Tr(p0->p)表示能量从p0传播到p的传播率(即,衰减之后剩余的比例)。
Tr(p0->p)Lo(p0, -w)则表示:p0点反射的能量经过介质的衰减后,最终到达p点的能量。
p’表示光线上p点和p0点之间的任意位置,p’到p0的距离为t’(0 < t’ < t)。明显p’是在介质中。
Ls(p’, -w)表示在p’处的-w方向进入介质的能量(这个能量可能来自“自身发射的能量”和“直接光照”)。
Tr(p’->p)表示能量从p’传播到p的传播率(即,从p’点进入介质的能量经过介质的衰减后传到p点时剩余的比例)。
这里写图片描述。光线上p’点到p点之间的任意位置都有能量从-w方向进入介质的,然后衰减,然后传到p点。所以,这个积分式子表示,p’点到p点之间所有位置从-w方向进入介质的能量经过衰减后到达p点的能量的总和。
Li(p,w)表示返回到p点能量。这个能量有两个来源:来自介质中进入的能量、来自交点p0反射的能量。

怎么求解Li(p, w)呢?
当然是用Monte Carlo方法来解这个积分方程。
这里写图片描述

设:f(s)表示光线上[p,p0]之间任意位置进入的经过衰减后返回到p点的能量。那么,
这里写图片描述

Monte Carlo方法当然是“采样、累加、求平均”啦!即:
这里写图片描述

现在需要求采样点sj对应的f(sj)和p(sj)。
分两种情况:

1,采样点在Medium中,0 < sj < t。
设该介质在w方向上是均匀的,设在介质中离p点单位距离被采样到的概率为p_medium(t’),那么:
这里写图片描述
另外,
这里写图片描述

2,采样点在Surface上,sj = t(或者说sj >= t。因为是沿着光线采样,先判断采样点是否在Medium中。若不在Medium中,则在Surface上)。
这里写图片描述

这里写图片描述

这个采样具体怎么执行呢?
一般是对图片上单像素点进行N采样,每次采样对应一条光线(即,会有N条光线从p点出来),然后产生一个[0,1]之间的随机数sui,那么sj=sui*t,然后判断sj的位置是在Medium中还是Surface上,然后计算相应的p(sj)和f(sj)。
至于“累加,求平均”,单像素点的采样计算会cover到。

另外:

程序实现上,会根据sj的位置计算出一个衰减系数beta(beta_medium或者beta_surface)。
由于f(sj)的不同,计算beta_medium和beta_surface的方式也是有差异的。

特别注意:

beta_medium表示直接光照进入介质后的衰减情况。

beta_surface表示Surface反射的光线进入介质后的衰减情况。所以,这种情况下总的衰减系数要在beta_surface的基础上再乘以直接光照和Surface相互作用时产生的衰减系数。

二、构建“体渲染”积分器的路径

1,光线从相机p0(为了便于描述路径,此处标记为p0,相当于“一、那张关键的图”中的p)出发,这条光线可能和场景中的几何物体发生撞击,也可能不发生撞击。考虑这两种情况:情况1,有交点,对应一个ray.tmax(即撞击点到光线起点的距离t);情况2,没有交点,ray.tmax还是初始值infinity()。
2,在含Medium的场景中沿着这条光线进行采样,采样点对应着一个t=sj。若sj小于ray.tmax,则采样点在Medium中;反之,采样点在Surface上。(注意到,如果“步骤1”中是“没有交点”的情况,则采样点必定在Medium中)。这个采样点就是p1(相当于“一、那张关键的图”中的p)。
3,若p1在surface上,情况则和“路径追踪”积分器是一样的,即:对p1点的BSDF1进行采样,得到一个方向wi1。若p1在medium中,则对p1点的Phase1进行采样,得到一个方向wi1。
4,新的光线从p1点沿着wi1出发……(重复“步骤1”,然后得到采样点p2、…、pn)

和“路径追踪”积分器一样,最终会得到这么一张路径图:
这里写图片描述
或者:
这里写图片描述
“体渲染”积分器和“路径追踪”积分器差异的地方:
“路径追踪”积分器中的p1、p2、……p(n-1)都是光线撞击Surface得到的,p1、p2、……p(n-1)在Surface上;
“体渲染”积分器中的p1、p2、……p(n-1)都是沿着光线采样得到的,p1、p2、……p(n-1)可能是在Medium中,也可能是在Surface上。

三、单一路径上返回到相机的光的计算

“路径追踪”积分器的做法是:
长度为i的路径上返回到相机的光的计算式子:
这里写图片描述

对于“体渲染”积分器,长度为i的路径上返回到相机的光的计算是类似的。
即:长度为i-1的路径上累积的衰减系数*第i-1个顶点上的直接光照的贡献。

差异的地方在于:
1,直接光照从光源到第i-1个顶点的过程也会因为Medium的存在而产生衰减(这个在EstimateDirect()是考虑);
2,系数累积:若第i-1个顶点在Medium中,无需对直接光照和该顶点的相互作用的衰减进行累积,因为beta_medium包含这个衰减;若第i-1个顶点在Surface上,需要累积直接光照和该顶点相互作用产生的衰减。

四、“体渲染”积分器的细节部分

通过前面的内容,对“体渲染”积分器有了大体的理解。
但是,并未涉及具体细节。比如:

1,光线在Medium中的散射过程、散射类型。
2,光线在不同Medium传播时,衰减系数Tr的具体计算。
3,直接光照进入Medium时在某个方向上的衰减情况,对应Phase函数的计算。
4,怎么对Medium进行采样(获得采样点之后,再能进一步判断采样点是在Medium中还是在Surface上)?不同的类型的Medium采样方式是不一样的。(Homogeneous Medium(均匀介质), Grid Medium(非均匀介质))
5,怎么对Phase函数进行采样(即,当某个顶点在Medium时,接下来光线应该往哪个方向传呢?这个方向有Phase函数决定)
……

还有各种细节需要学习。

但是,重点,
如果对“体渲染”积分器没有整体的理解,一开始就学习各种细节的话,那么非常容易、特别有可能直接陷入各种细节中。
然后,迷迷糊糊,云里雾里:不知道讲的是什么;不知道讲这个有什么用;只认识字(还多单词还不认识),不知道具体讲什么;……

阅读全文
2 0
原创粉丝点击