在计算间接光的贡献时,余弦加权半球采样是否仍需要NdotL?


12

从均匀的半球采样转换为余弦加权半球采样时,我在一篇文章中感到困惑。

我目前的间接贡献计算如下:

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之外?

Answers:


12

实际上,您总是需要乘以余弦项(这是渲染方程式的一部分)。虽然使用射线跟踪进行间接漫射并因此进行了蒙特卡罗积分(在这种情况下,这是最常见的技术),但是您必须每个样本的贡献除以PDF。这是很好所示例这里

还要注意,在提到的参考文献中,如果PDF中的术语也可以在渲染方程式中找到,则可以通过取消这些术语来优化代码。

不要忘记,漫反射表面的BRDF为ρ/π,其中ρ代表表面反照率。因此我们需要将结果除以π。尽管在间接漫射分量的情况下,请不要忘记我们应该将castRay的结果除以随机变量的PDF,正如我们在本章前面所显示的那样,它是1 /(2π)。将indirectDiffuse除以1 /(2π)的方式与将该值乘以2π相同。而且由于反照率也被π除,所以我们可以简化代码...

您也有类似情况。如果您查看余弦采样的PDF,那么您将意识到可以取消这些项。但这并不意味着它们不是“绝对”必要的。是的,它们只是互相抵消,从而可以稍微优化代码(并避免一些除法,乘法等)。您在这里更多地是在进行微优化...如果仅通过查看优化的代码(通常未正确注释)来尝试学习理论,可能会造成混淆。

CØsθPdF=CØsθCØsθπ=


1
谢谢!这就说得通了。凭直觉我知道这是必需的,但我不知道这是一种优化。
史蒂文

5
只是为了确保这是明确的。.余弦加权半球不仅是一种优化,因为它需要较少的指令,而且也是一种优化,因为它收敛得更快。它需要更少的样本才能获得更好的结果。这是重要性抽样的一种形式。
艾伦·沃尔夫

的确如此-这是我的愿望,因为我正尝试减少lightmapper中用于间接计算的样本数量。
史蒂文”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.