我目前的间接贡献的计算公式为:
Vec3 RayDir = UniformGenerator.Next()
Color3 indirectDiffuse = Normal.dot(RayDir) * castRay(Origin, RayDir)
点积为cos(θ)的地方
但是本文中关于更好的采样(http://www.rorydriscoll.com/2009/01/07/better-sampling/)作者建议PDF为(cos(θ)/ pi),并且没有N点L计算的证据。
我的问题是-就是说,我不再需要执行正常点rayDirection是因为它包含在PDF中,还是它是pdf的补充?
#1 楼
实际上,您总是需要乘以余弦项(这是渲染方程式的一部分)。尽管使用射线跟踪进行间接漫射并因此进行了蒙特卡罗积分(在这种情况下,这是最常见的技术),但是您必须将每个样本的贡献除以PDF。在这里很好地举例说明。不要忘记,漫反射表面的BRDF为ρ/π,其中ρ代表表面反照率。因此,我们需要将结果除以π。尽管在间接漫射分量的情况下,请不要忘记我们应该将castRay的结果除以随机变量的PDF,正如我们在本章前面显示的那样,它是1 /(2π)。将indirectDiffuse除以1 /(2π)的方式与将该值乘以2π相同。而且由于反照率也被π除以,所以我们可以简化代码...如果您查看余弦采样的PDF,那么您将意识到可以取消这些项。这并不意味着它们不是“绝对”必要的。是的,它们只是互相抵消,从而可以稍微优化代码(并避免一些除法,乘法等)。您在这里有更多的微优化...如果仅通过查看优化的代码(通常没有正确注释)来尝试学习理论,可能会造成混淆。
$ \ dfrac { (cos(\ theta)...)} {PDF} = \ dfrac {(cos(\ theta)...)} {\ dfrac {cos(\ theta)} {\ pi}} = ... $
评论
$ \ begingroup $
谢谢!这就说得通了。凭直觉我知道这是必需的,但我不知道这是一种优化。
$ \ endgroup $
–史蒂文
17年2月5日在16:38
$ \ begingroup $
为了确保这一点是明确的。余弦加权半球不仅是一种优化,因为它需要较少的指令,它也是一种优化,因为它收敛得更快。它需要更少的样本才能获得更好的结果。这是重要性抽样的一种形式。
$ \ endgroup $
–艾伦·沃尔夫(Alan Wolfe)
17年2月5日在21:06
$ \ begingroup $
确实-这是我的愿望,因为我正尝试减少lightmapper中用于间接计算的样本数量。
$ \ endgroup $
–史蒂文
17年2月5日在22:30