1

我正在尝试阅读http://www.kevinbeason.com/smallpt/的来源,尤其是我无法掌握的一件事。在第 55 行,上面写着f=f*(1/p).

它是什么?它有什么作用?更重要的是,为什么它读起来完全一样?是某种启发式方法使图像收敛得更快吗?

换句话说,我在文学中看到:

function radiance
     ...
    return Le(x) + R(p) * radiance(rn)

重要的是R(p)- 我真的不明白它的作用,但对于 99% 来说,它不是f从上面那个..

拜托,有人可以对此有所了解吗?

4

1 回答 1

1

我认为您的答案在这张幻灯片中,其中包含对 的显式照明版本的逐行解释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)。
  • 在行#55Russian 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))

该代码定义了一个运算符重载 for*但不是 for /,这就是为什么f=f*(1/p)而不是f=f/p.

于 2012-11-03T00:48:08.523 回答