SPPM

Date: 2018-10-19 03:01
Categories: 渲染

Importance函数与Measurement方程

我们知道Path Tracing是从相机出发,希望得到来自光源的光线。如果换一个方向来思考,从光源出发,希望得到来自相机的一个量。

GI解决的问题可以描述为解算每一个像素可见的能量。每一个像素都相当于一个传感器,决定如何应答入射的能量。这个应答函数所带来的量叫做importance,他可以像L一样传递,从而作为上面所说的来自相机的一个“量”。

W ( x − > Θ ) = W e ( x − > Θ ) + ∫ Ω x f r ( x , Φ < − Θ ) W ( x < − Φ ) c o s ( N x , Φ ) d ω Φ W(x->\Theta)=W_e(x->\Theta)+\int_{\Omega_x}f_r(x,\Phi<-\Theta)W(x<-\Phi)cos(N_x,\Phi)d\omega_{\Phi} W(x>Θ)=We(x>Θ)+Ωxfr(x,Φ<Θ)W(x<Φ)cos(Nx,Φ)dωΦ

Importance flows的方向和radiance的方向是相反的。假设有两个表面i和j,如果表面i通过像素平面可见,那么 W e ( i ) W_e(i) We(i)代表表面对于像素平面的重要程度。如果j也可见,且i反射光到j,那么j将会反射重要性给i,于是i间接地就比j更重要。

Measurement方程形式化了GI问题,他将两个重要的量集中到了一起—————Importance和Radiance.

对于每一个像素j, M j M_j Mj表示通过像素的Radiance

M j = ∫ A ∫ Ω W ( x < − Φ ) L ( x < − Φ ) c o s ( N x , Φ ) d A x d ω Φ M_j = \int_A \int_\Omega W(x<-\Phi)L(x<-\Phi)cos(N_x,\Phi)dA_xd\omega_{\Phi} Mj=AΩW(x<Φ)L(x<Φ)cos(Nx,Φ)dAxdωΦ

如果将场景表面对应于像素,那么场景表面也能作为像素使用measurement方程。

散射不对称性*

在Particle Tracing的时候,使用Importance和measurement方程来进行计算,这个时候必须要注意散射的不对称性,也就是入射和出射对换引起的变化。这一部分主要是折射和着色法线。具体内容可参考PBRT P960.

SPPM

SDS传输问题

考虑这样一个光路,从光源出发,通过一个specular折射,然后在通过一个diffuse散射,最后在通过一个specular反射。
这样的光路几乎无法击中摄像机,从摄像机来看,出发的光线通过一个diffuse表面,在通过一个specular反射或者折射表面也几乎无法再击中光源。

如果光源被一个specular表面遮罩,那么每一条光路都将会始于S,问题将会更加明显。

解决这个问题有很多方法,PM,PPM,SPPM,VCM,PSR,ME等等。

这里主要说一下相对比较古老的SPPM。

原理

PM

PM主要是从光源Trace一系列的photon,将这些photon的记录在光子图上(越亮的地方光子越多),通过插值来得到最终图像。

PM的优点:

  • 焦散和间接光照都能快速收敛
  • 高频噪声能够很快地被清除

缺点是:

  • 内存消耗巨大
  • 无法人为估量应该发射多少光子
  • 插值具有亮块和走样

模糊平均和插值为PM带来正确的结果,但是最终却能达到视觉正确,所以是一个有偏一致(如果有无数光子发射的话数学上可证明一致)的算法。

PPM

PPM主要解决了无限光子的问题。

第一个pass,从像素执行PT,到了某一个场景点,使用rr停止PT,将光照分为发射光,直接光和间接光,前二者可以使用PT来计算,间接光照可以这样解决:一种是采样bsdf,找到path 的下一个顶点,接下来就要开始计算这个点的 L o L_o Lo,递归下去,这就依然是PT。另外就是将这个 L o L_o Lo计算需要的信息(位置,需要的出射方向(也即等价le的方向),bsdf,path throughput)保留到一个VP中,通过之后的photon tracing来解决它。

对于一个specular或者glossy表面,前者只能采用前一种方法,后者最好采用第一种方法。因为对于specular表面来说,brdf采样方向只有一个,几乎不可能有随机发射的光子从这个方向过来,于是大多数时候这个地方使用光子方向计算的brdf都是0,造成相当高的方差;而对于glossy表面,想要光子从一个很狭窄的方向过来必须发射巨量的光子才能较为精确地计算,所以在这两种表面上都直接采用PT方法直接Tracing下去,而不用pm方法。值得注意的是,如果你不在表面上(无论是s还是near s)保留VP,那么SPPM的结果表面上就没有直接光照,仅仅只有间接光照。所以渲染出来的glossy将没有高光,但是对于纯镜面来说也一样(注意使用mitusba可能可以看见高光,但那是光源表面的间接光照,当把光源调到很小之后就没有了,因为此时光源表面难以采样VP,但此时恰好渲染镜面看起来像是正常【但一旦把光源表面换成不可见bsdf的时候,这个现象就会消失】,但glossy表面没这个乌龙,因为光泽表面的反射VP分布不均匀,不一定能击中光源),于是所有贡献都由间接光照提供,所以sppm在渲染镜子的时候看起来一切正常,但是渲染glossy表面将会因为缺乏直接光照导致颜色暗淡。如果你把光源换成点光源,那么这个现象将会更加明显。

对于漫反射表面,这个所需要的等价 L e L_e Le就是某个点的 L o L_o Lo,使用Photon tracing来计算这个 L o L_o Lo(注意这是一个反向过程,在计算途中要注意散射对称性。).

第一pass使用PT累计了VP解算了高光表面之后,进行Photon tracing。第二pass对于漫反射表面(注意此pass也要trace,也就是phono要random walk),要解算 L o L_o Lo有如下方程:

L o = ∫ Ω L i ( p , ω i ) f ( p , ω o , ω i ) c o s θ i d ω i L_o = \int_{\Omega}L_i(p,\omega_i)f(p,\omega_o,\omega_i)cos\theta_id\omega_i Lo=ΩLi(p,ωi)f(p,ωo,ωi)cosθidωi

将此方程写为等价的基于整个场景表面的measurement方程得到(也就是将整个场景看做像素平面):

∫ A ∫ Ω δ ( p − p ′ ) f ( p ′ , ω o , ω i ) L i ( p ′ , ω i ) c o s θ i d ω i d A ( p ′ ) \int_A \int_{\Omega} \delta(p-p')f(p',\omega_o,\omega_i)L_i(p',\omega_i)cos\theta_i d\omega_i dA(p') AΩδ(pp)f(p,ωo,ωi)Li(p,ωi)cosθidωidA(p)

此时可以得到Importance:

W e ( p ′ , ω ) = δ ( p ′ − p ) f ( p , ω o , ω ) W_e(p',\omega) = \delta(p'-p)f(p,\omega_o,\omega) We(p,ω)=δ(pp)f(p,ωo,ω)

注意这个Importance是无法采样的,因为类似于正向方法中,想要采样一个点光源一样,某一个表面点也是无法采样的。所以此时引入bias,使用一个范围内的vp,Importance中的狄拉克函数变为了一个过滤函数,此时可以使用这个Importance描述一个表面点的重要性,周围的光子越多,重要性越高,入射的radiance越多。

解算这个measurement方程使用mc方法,采用下列公式:

1 N ∑ j = 1 N β j W e ( p j , ω j ) \frac{1}{N}\sum_{j=1}^N \beta_j W_e(p_j,\omega_j) N1j=1NβjWe(pj,ωj)

采用photon tracing使用公式:

β i , j = L e ( p i , n i − > p i , n i − 1 ) p ( p i , n i ∏ j = 1 n i − 1 1 1 − q i , j f ( p i , j + 1 − > p i , j − > p i , j − 1 ) G p ( p i , j ) \beta_{i,j}=\frac{L_e(p_{i,n_i}->p_{i,n_{i-1}})}{p(p_{i,n_i}}\prod_{j=1}^{n_i-1}\frac{1}{1-q_{i,j}}\frac{f(p_{i,j+1}->p_{i,j}->p_{i,j-1})G}{p(p_{i,j})} βi,j=p(pi,niLe(pi,ni>pi,ni1)j=1ni11qi,j1p(pi,j)f(pi,j+1>pi,j>pi,j1)G

q i , j q_{i,j} qi,j是rr概率.

类似PT地迭代计算 β j \beta_j βj,得出最终交点后,在范围内搜索VP,每个VP的Importance使用插值方法后直接写为brdf,也就是得到了这个公式,此时这个measurement方程近似为下列方程:

L o ( p , ω o ) ≈ 1 N p π r 2 ∑ j N p β j f ( p , ω o , ω j ) L_o(p,\omega_o) \approx \frac{1}{N_p \pi r^2}\sum_{j}^{N_p}\beta_j f(p,\omega_o,\omega_j) Lo(p,ωo)Npπr21jNpβjf(p,ωo,ωj)

N p N_p Np是光源发射的光子总数, π r 2 \pi r^2 πr2是圆盘核函数的表面积。

现在得到了 L o L_o Lo,将其带回PT中缺少的那个 L e L_e Le中去,就能得出PT的结果。

SPPM

PPM只使用一遍pass 1,虽然不储存光子,但是需要得到非常多的vp来保证结果不走样,对于高分辨率图像,依然会消耗大量内存。SPPM将使用多次迭代,每次都采样不一样的vp,重复PPM的过程,并不断累积结果,最终解决了内存问题。

实现对比

第一、第二张为120 spp和1200spp的path tracing,第三、四张是使用每次迭代2000光子迭代1000和1800次以后的SPPM:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JqpzVqVp-1605237178784)(https://github.com/wubugui/FXXKTracer/raw/master/pic/120pt.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EC7NEsbv-1605237178786)(https://github.com/wubugui/FXXKTracer/raw/master/pic/1200spppt.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qfqz7Unn-1605237178789)(https://github.com/wubugui/FXXKTracer/raw/master/pic/sppm_1823.png)]

其他一些截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y3idR3bT-1605237178790)(https://github.com/wubugui/FXXKTracer/raw/master/pic/newpic/sppm_3709.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值