我正在尝试阅读http://www.kevinbeason.com/smallpt/的来源,尤其是我无法理解的一件事。在#55行,它显示f=f*(1/p)
。
这是什么?它有什么作用?更重要的是,它为何如此读取?是否有某种启发式方法可以使图像更快地收敛?
换句话说,在文献中我看到:
function radiance
...
return Le(x) + R(p) * radiance(rn)
重要的是R(p)
- 我真的不明白它的作用,但对于99%,它不是来自上面的f
..
拜托,有人可以对此有所了解吗?
答案 0 :(得分:1)
我认为您的回答是slides,其中包含smallpt
明确照明版本的逐行解释,重新格式化为75%。
简而言之,行#55
位于函数radiance
内,其中估计沿光线的辐射估计。
if (++depth>5)
if (erand48(Xi)<p) f=f*(1/p);
else return obj.e;
radiance
是一个递归函数(调用自身)f
是对象的颜色。 p
是表面颜色的最大分量(r,g,b)。#55
行,如果递归深度大于Russian Roulette
,我们会5
。p
基于表面反射率随机停止递归。f=f*(1/p)
正在使用p
- f
的最大组件来对每个组件进行规范化,这样,
f.x = f.x / (max(f.x, f.y, f.z))
f.y = f.y / (max(f.x, f.y, f.z))
f.z = f.z / (max(f.x, f.y, f.z))
代码定义了*
的运算符重载,而不是/
的运算符重载,这就是f=f*(1/p)
而不是f=f/p
的原因。