我最初写了一个pathtracer,它仅由BRDF反弹,每个样本都添加到一个缓冲区中,该缓冲区除以当前帧数。

现在,我想在每次反弹时进行下一个事件估计直接沿路径采样光。我如何“加权”通过常规路径跟踪采集的样本以及直接光照样本?即使我用光线的立体角对直射光进行加权,但如果我采样了1个以上的样本,就不能再除以帧数了吗?

评论

这与您的问题没有任何关系,但是您似乎很想听听它。如果您未听说过余弦加权采样,则应进行检查。无需乘以cos theta,而是使光线基于cos theta进行分布。最简单的方法是选择磁盘上的随机点(x / z),然后使y成为归一化向量。您最终将获得更多有意义的方向样本,并获得更快的收敛速度。

很难理解您要说的话。你能澄清你的问题吗?您是在谈论渐进式路径跟踪和重要性采样吗?

#1 楼

通过“ BRDF的弹跳”,我假设您的意思是在半球中随机选择方向并由BRDF加权,然后对这些样本求平均。我猜您正在每帧累积一个样本,因此将您除以当前的帧数。

要从理论上讲是“正确的”,还应将这些样本加权$ 2 \ pi $因为那是您要积分的半球的立体角。当您只有一个采样方法时,这并不是太重要,但是当您要合并多个采样方法时,如果您正确地考虑了这些因素,则可以更轻松地确保所有内容都是一致的。直接光采样,您必须将光采样概率密度转换为接收点的立体角概率密度。如果光样本在光源区域内是均匀的,则代替简单的$ 2 \ pi $权重,可以使用以下权重因子:
$$ \ frac {A} {r ^ 2}( N_ \ text {light} \ cdot -L)$$
其中$ A $是光源的面积,$ r $是接收器点(当前路径点)与所选光源点之间的距离,$ N_ \ text {light} $是亮点的法线,$ L $是从路径点到亮点的单位向量。

此因子说明了采样的光源点将与接收器点成直角,并且随距离和光源表面上的角度而变化(这些点会在光源表面远离接收器倾斜的区域(例如边缘附近)聚集在一起

加权后,直接光样本与BRDF样本在相同的立体角域中,因此您可以将它们相加并除以总数个样本-如果您要每帧进行一个BRDF样本和一个光照样本,则现在将是帧数的两倍。

同样,正确的重要事情不是重复计算灯光的照度。由于您现在正在明确采样灯光,因此,如果在进行BRDF采样时确实碰到了灯光,则必须确保不包括发光颜色!否则,您最终将使灯光出现两倍于其应有的亮度。镜面部分。可以通过对BRDF进行重要性采样来更好地处理狭窄的镜面反射高光。这意味着在进行显式光采样时,您将只评估BRDF的漫反射分量,然后,如果您通过镜面反射射线照射光源,则会在其中包含其发光颜色。