目录
光线追踪(Whitted光线追踪,最简单的光追形式):
路径追踪(当前主流的光线追踪形式,以前叫路径追踪):
双向路径追踪:
Metropolis光传输:
光线追踪(Whitted光线追踪,最简单的光追形式):
对每个像素:
从eye位置穿过该像素发射Ray
像素颜色 = trace(Ray)
trace(Ray)
找场景最近的交点p,计算其法向量n
color = shade(p,n)
return color
shade(p,n)
color = 0
对每个光源:
跟踪阴影光线,如果没有被遮挡:
color += 光照量
如果是镜面反射:
color += trace(reflected/refracted Ray)
return color
路径追踪(当前主流的光线追踪形式,以前叫路径追踪):
对每个像素:
从eye位置穿过该像素发射Ray
像素颜色 = trace(Ray)
trace(Ray)
找场景最近的交点p,计算其法向量n
color = shade(p,n)
return color
shade(p,n)
color = 0
对每个光源:
测试光源可见性,如果没有被遮挡:
color += 光照量
color += trace(根据该点BRDF随机反射的Ray)
return color
双向路径追踪:
注意与两个路径之间的距离有关,如果距离过小则会值特别大(可以用幂启发式抵消过大值,因为幂启发式平衡了BRDF和对光采样的概率,这里的对光采样概率会远大于对BRDF采样,所以就抵消了过大的影响)。
对于室外大场景而言双向路径追踪不太管用(把太阳光线射到地面上再与视线连接的意义不是很大),对于镜面反射而言效果也不好。
当光很容易到眼睛的时候,路径追踪比较好,当光不太容易到眼睛的时候,双向路径追踪比较好。
对每个像素:
像素颜色 = trace(像素位置pos)
trace(pos)
从eye位置穿过该像素发射Ray,不断反射,得到Ray路径RayPath
从光源位置发射Light,不断反射,得到光路径LightPath
combine(RayPath,LightPath)
combine(RayPath,LightPath)
color = 0
遍历LightPath的每个点LP
遍历RayPath的每个点RP
如果他们之间的可见性==1
计算LP-RP的权重w
color += w * 光照量
return color
Metropolis光传输:
与一般的MC方法不太一样,MC方法是根据重要性采样来生成随机样本,估计被积函数(未知函数)的积分值,而Metropolis方法是产生正比于被积函数值(未知函数)的分布的样本。
首先采样从随机点开始,采样一次路径以后,该路径被随机复制或修改(变异),如果新路径不合理(比如穿墙了),就丢掉,然后继续使用当前路径来进行变异,如果新路径合理,则接受为候选路径,接受概率为:
其中,f 是 radiance,T是从给定路径中变异到另一个路径的概率,比如
是从路径 x 变异到路径 y 的概率。通过使用该接受概率,变异的路径将会根据 radiance 来分布。变异的策略:
- 双向变异,用新的路径线段取代旧的路径线段
- 扰动,如果任何随机路径相遇,则使用随机扰动,扰动用来采样局部随机效果
Metropolis方法在康奈尔盒的效果并不是很好,因为整个空间的间接光都很重要。但是对于场景中仅有微小的光源(例如凿壁偷光小孔)时,该方法还是非常好的,但是对于墙壁一堆小孔时,就不太好了。
对每个像素:
产生N个随机路径,对每个随机路径x:
MLT(x)
MLT(path x):
color = 0
把x的光照贡献加到color上
选择变异策略
y = x路径的变异
如果y合理:
计算T(x|y)和T(y|x)
计算L(x)和L(y)
计算接受概率a(y|x)
如果随机数[0-1]<a(y|x):
MTL(y)
否则:
MLT(x)
如果y不合理:
MLT(x)