2012-03-28 126 views
5

我目前正在尝试了解由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); 

可有人请解释的只是在投放的单一射线,而不是两者的缺点是什么?我从来没有听说过这种技术,并且我很好奇这种交换是什么,因为它会导致复杂度大大降低。

+2

您是否看过[此演示文稿](https://docs.google.com/open?id=0B8g97JkuSSBwUENiWTJXeGtTOHFmSm51UC01YWtCZw)解释所有内容,并明确链接到该网站? – KillianDS 2012-03-28 11:18:11

+0

是的,我已阅读演示文稿,它很棒!我正在寻找的是一个更深入的解释,说明如何只投射单个射线影响算法的效率。为什么他决定对于深度达到2的两个射线应该进行评估,但不要事后(即是否有任何推理背后为什么它恰好是2或者是或多或少是随机的?)。 – crapper 2012-03-30 01:09:50

+0

或多或少是随机的,但这个想法可能是,你会从你的前几次反射和吸收中获得最多的颜色强度。你反映/折射的越深,应该是更微不足道的贡献。 – KillianDS 2012-03-30 11:58:28

回答

3

这是一个蒙特卡罗射线示踪剂。它的优点是不会产生数量呈指数级增长的光线 - 这可能会出现在一些简单的几何图形中。不利的一面是您需要对大量样本进行平均。通常情况下,您要进行抽样,直到与真实值的预期偏差“足够低”。计算需要多少个样本需要一些统计数据 - 或者您只需要抽取大量样本。

2

推测他依赖于超级采样像素,并相信平均颜色将大致正确地工作,虽然不够准确。

即通过一个像素发射4个光线并且平均2个被反射,2个被折射。
将它们组合起来,可以近似反射和折射一条光线。

+0

从查看代码,这看起来正确看到(评论)线83,84。 – 2012-03-28 11:08:48