【问题标题】:Ray Tracing: Only use single ray instead of both reflection & refraction rays光线追踪:只使用单一光线,而不是同时使用反射和折射光线
【发布时间】:2012-04-11 23:04:42
【问题描述】:

我目前正在尝试了解 Kevin Beason 开发的光线追踪器(smallpt:http://www.kevinbeason.com/smallpt/),如果我正确理解代码,他会随机选择反射或折射光线(如果表面既反射又折射) .

第 71-73 行:

return obj.e + f.mult(depth>2 ? (erand48(Xi)<P ?   // Russian roulette
radiance(reflRay,depth,Xi)*RP:radiance(Ray(x,tdir),depth,Xi)*TP) :
radiance(reflRay,depth,Xi)*Re+radiance(Ray(x,tdir),depth,Xi)*Tr);

谁能解释一下只投射一条光线而不是同时投射两种光线的缺点?我从来没有听说过这种技术,我很好奇它的取舍是什么,因为它可以大大降低复杂性。

【问题讨论】:

  • 您是否看过 this presentation,它解释了所有内容并明确链接到该网站?
  • 是的,我已经阅读了演示文稿,非常棒!我正在寻找的是关于仅投射单条射线如何影响算法效率的更深入的解释。为什么他决定对于不超过 2 的深度,两条射线都应该被评估,而不是事后评估(即,为什么它恰好是 2 或者它或多或少是随机的,有什么理由吗?)。
  • 或多或少是随机的,但这个想法可能是您将从最初的几次反射和吸收中获得最大的颜色强度。你反射/折射得越远,贡献就越微不足道。

标签: c++ c trace raytracing


【解决方案1】:

大概他依赖于超级采样像素,并相信平均颜色会大致正确,尽管没有那么准确。

即通过一个像素发射 4 条光线,平均 2 条被反射,2 条被折射。
将它们组合起来得到一条反射和折射光线的近似值。

【讨论】:

  • 从代码来看,这看起来是正确的,请参见(cmets on)第 83、84 行。
【解决方案2】:

这是一个蒙特卡罗射线追踪器。它的优点是你不会产生呈指数增长的射线数量——这可能发生在一些简单的几何图形中。缺点是你需要对大量样本进行平均。通常,您采样直到与真实值的预期偏差“足够低”。计算需要多少样本需要一些统计数据 - 或者您只需采集大量样本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 2013-11-02
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多