【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-6 直接光源采样

今天我们来讲这个还算牛逼的技术——直接光源采样

之前我们提到过,在2-7

【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-6 直接光源采样

 

前两篇我们也提到要减少噪点,就是图片上的黑点点,所以,所有的矛头都指向了这一篇。

简单说一下为什么会有那么多小点点,就是因为光线路径中没有触碰到光源,路径计算之后就会是黑色的点,可以通过发射大量的光线,比如计算每个像素点的时候发射8k~1w条采样光线进行路径计算;也可以路径计算方面做文章,比如加深路径计算递归深度;等等诸如此类。但是上述方法都是暴力解决法,相当耗时,我们可以运用数学对其进行优化,从而实现画质和效率的双面提升,这就是我们今天要讲的——直接光源采样!

 

 Ready

可能您需要以下基础:

1.微分

2.立体角 (蒙特卡罗(三))

没了,剩下全靠想象

 

 content

简明扼要。

我们朝光源方向发送光线或者生成朝向光源的随机方向都是很容易实现的,但是我们需要知道的是,pdf(direction)是什么呢?

引用书上一张图:

【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-6 直接光源采样

对于一个光源区域A,如果我们均匀采样该区域,那么这个pdf就等于1/A,意思就是每个点的概率均等

但是和我们的单位球体结合在一起的话,就比较麻烦了,见上图

?为什么老是提到单位球体呢??

因为我们的光线和物体表面的交点,会作为下一个eye,然后新的视线方向是表面单位球随机产生的方向,具体见1-5中的diagram7-3

【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-6 直接光源采样

 

 

好了,渊源就是酱紫,我们继续

如果那个小的微分区域dA的采样概率为

  p_q(q)*dA(采样比例乘以微分区域),也就是dA/A

而对应到单位球体表面的很小的区域,即我们所述的方位角。方位角微分dΩ对应的采样概率为

  p(direction)*dΩ

这里有一个用来描述dΩ 和 dA 的表达式:

dΩ = dA cosα / (distance(p,q)^2)

即:方位角微分区域:光源微分区域分成(球心到A中心距离平方)份,取其中的cosα代表的份额数

因为这个dA 和 dΩ的概率是相同的,所以就有如下等式

p(direction) * cosα * dA / (distance(p,q)^2) = p_q(q) * dA = dA / A

所以

p(direction) = distance(p,q)^2 / (cosα * A)

 

我们接下来就检验一下这个数学公式是否正确

但是代码可能非常丑

我们需要之前的光源的区域参数

 

list[cnt++] = new xz_rect(200, 350, 220, 340, 550, light);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzxpp.html