Skip to content

Stochastic Light Culling

Monica的小甜甜 edited this page Jul 25, 2020 · 2 revisions

随机光源裁剪

随机光源采样这篇文章是在虚拟点光源的基础上对光源进行裁剪,思路和实现都非常简单,但是效果却很好。

在这里插入图片描述

大家可以看到上面这张图,这张图上部分在没有直接光照射的地方明显非常暗,而下半部分没有光直接照射的地方会有一个渐变的效果,这样看起来就非常逼真,因为光的衰减不可能是突变的。

在这里插入图片描述

计算所有虚拟点光源对着色点X的光照强度的公式如上,其中Ii是虚拟点光源i在-wi方向上的光照强度,f(||xi-x||)虚拟点光源xi到着色点x的衰减函数,V为可见性函数,p(x,w,wi)为BRDF函数。一般而言,我们的衰减函数为与距离平方成反比。

在这里插入图片描述

这样能实现上面的渐变效果,不过有个问题是这个平方衰减是永远不会等于0的,所以对于着色点和虚拟点光源距离非常远,这是这个虚拟点光源对着色点的贡献已经非常小了,但是我们还是的进行计算。这样就会导致效率非常低。有人可能会想,我们可以加一个判断,如果距离太大了,就直接不计算了。问题是这个距离是我们无法预设的,如果某个虚拟点光源强度很强,但是我们突然把光截断了,就会有个很明显的圆环,效果就会很差。

在这里插入图片描述

因此,本文给出了一个思路,即每个光源设定一个随机数,然后对光源进行一个随机裁剪即可。思路很简单,不过如果真的是每个光源被裁剪的概率相等的话,那么还是会有可能对光照贡献大的光源被裁剪了。因此作者给出了一个裁剪的公式如下。

在这里插入图片描述在这里插入图片描述

ai为虚拟点光源i的参数,l为半径,ξi为第i个虚拟点光源的随机数。这个公式就是如果pi(l)比这个随机数大的话就为max(ai,f(l)),如果小的话就截断为0即可。同时每个光源的半径为

在这里插入图片描述

而根据作者误差分析计算出ai的取值应该为:

在这里插入图片描述

emax我们可以取一个比较小的数即可,我一般用的是0.0005f,E为相机的曝光度。 以上就是随机裁剪的所有公式,我们只需要代入代码中就可以实现本文的效果,大家还是可以看到,虽然随机裁剪的思路是非常简单的,不过真的要在数学上证明,还是要做大量研究。

在这里插入图片描述

代码链接 Stochastic Light Culling