路径跟踪:缩放颜色

时间:2012-11-02 22:15:51

标签: algorithm graphics rendering raytracing

我正在尝试阅读http://www.kevinbeason.com/smallpt/的来源,尤其是我无法理解的一件事。在#55行,它显示f=f*(1/p)

这是什么?它有什么作用?更重要的是,它为何如此读取?是否有某种启发式方法可以使图像更快地收敛?

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

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

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

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

1 个答案:

答案 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的原因。