我正在尝试阅读http://www.kevinbeason.com/smallpt/的源代码,特别是有一件事我不能理解。在55行,它说的是f=f*(1/p)。
那是什么?是干什么的呢?更重要的是,为什么它读起来是这样的?是不是某种启发式方法可以让图像更快地收敛?
换句话说,在文学作品中,我看到:
function radiance
...
return Le(x) + R(p) * radiance(rn)重要的是R(p) -我真的不知道它是做什么的,但对于99%的人来说,它不是上面的那个f。
有人能帮我解释一下吗?
发布于 2012-11-03 08:48:09
我想你的答案就在这个slides中,它包含了对smallpt的显式照明版本的逐行解释,并将其重新格式化为75%的长度。
简而言之,行#55在函数radiance中,在该函数中估计沿光线的辐射度估计。
if (++depth>5)
if (erand48(Xi)<p) f=f*(1/p);
else return obj.e;首先,此函数ray.
f是一个递归函数(调用自身)
f是对象的颜色。
p是表面颜色的最大分量(r,g,b)。如果递归深度大于5.
#55线上执行Russian Roulette根据表面反射率随机停止递归使用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的原因。
https://stackoverflow.com/questions/13203767
复制相似问题