【问题标题】:Path tracing: scaling color路径追踪:缩放颜色
【发布时间】:2012-10-23 14:47:00
【问题描述】:

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

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

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

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

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

拜托,有人能解释一下吗?

【问题讨论】:

    标签: algorithm graphics rendering raytracing


    【解决方案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 行,如果递归深度大于5,我们将执行Russian Roulette
    • 我们使用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

    【讨论】:

    • 谢谢。我以前读过滑块。但是,我的问题是,为什么是f=f*(1/p)?为什么不是f=f*(42/p) 或者为什么f 不是 r、g、b 的最小分量?为什么要使用f=f*(1/p) 来停止?为什么深度不够退出递归?顺便说一句,我认为这个折射问题是在第 71 行而不是第 55 行决定的。
    猜你喜欢
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多