Monte Carlo Integration
一种近似求积分的数值方法,可在无法确定函数的解析式时使用。
随机采样,根据概率密度函数(PDF)求出积分的近似值。
路径追踪
Motivation
Whitted-Style Ray Tracing:
- 总在进行镜面反射/折射
- 忽略了光线在漫反射表面的反射
- 简化过度,最终效果是错误的
而渲染方程是正确的,需要找到一个解该方程的方法。以下不考虑物体本身发光的情况,因此本质上是解反射方程。
解渲染方程
只考虑直接光照
![](https://i-blog.csdnimg.cn/blog_migrate/c4ff872357312f035a92ee9036577a3c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/7801cb9ebf473ceb6554b294a6537a73.png)
考虑间接光照
![](https://i-blog.csdnimg.cn/blog_migrate/cd53b9b24bd0ef3063753897ae1e2a2e.png)
若要考虑间接光照,则应该递归计算:
然而,这样的解法有两个问题。
指数爆炸问题
若每次随机采样N=100个方向,随者光线反射次数
m
m
m的增加,会产生指数爆炸,最终要计算
N
m
N^m
Nm次光线
只要当
N
=
1
N=1
N=1时,才不会出现指数爆炸问题,因此每次随机选择一条光线。
但是这种情况会有很多噪声。解决方案:每个像素取多个不同的路径并平均。
伪代码:
![](https://i-blog.csdnimg.cn/blog_migrate/f8525d0790e612d1960eb91b95f753e7.png)
递归无出口问题
上面的shade函数递归没有出口,计算不会停止。如果指定特定数量的反射次数,则会损失部分能量。
使用俄罗斯轮盘赌(Russian Roulette, RR)来解决。
设定一个概率P,以P为概率发出光线并将返回的shading结果除以P,即
L
o
/
P
L_o/P
Lo/P,以1-P为概率不发出光线,得到0。以这种方式可以计算出
L
o
L_o
Lo。
这样得到的结果是正确的。
对光进行采样
若这样随机采样,则可能无法采样到与光源的方向,这样就造成了采样的浪费。因此对光源进行采样可以避免浪费。
蒙特卡罗允许任何方式的采样,只要采用对应的x和p即可。
对光源进行均匀采样的话,
p
d
f
=
1
/
A
pdf=1/A
pdf=1/A,但是渲染方程是在立体角上进行积分的。
因此需要将两者进行转换。
寻找
d
ω
dω
dω和
d
A
dA
dA的关系,如下:
因此,可以将渲染方程写为
总结
radiance由两个部分组成
- 光源(直接光照,不需要使用RR)
- 其他反射(不直接的,使用RR)
最终,需要注意点与光源之间被物体遮挡的情况。
Ray Tracing概念
- Previous: Ray tracing == Whitted-style ray tracing
- Modern: The general solution of light transport, including
- (Unidirectional & bidirectional) path tracing
- Photon mapping
- Metropolis light transport
- VCM / UPBP…