cra*_*per 5 c c++ trace raytracing
目前我正在试图理解由凯文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);
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释只投射一条光线而不是两条光线的缺点吗?我从来没有听说过这种技术,我很好奇这种权衡是什么,因为它会导致巨大的复杂性降低.
这是蒙特卡罗射线追踪器。它的优点是您不会产生呈指数增长的光线数量 - 这可能会发生在一些简单的几何形状中。缺点是您需要对大量样本进行平均。通常,您会进行采样,直到与真实值的预期偏差“足够低”。计算出需要多少样本需要一些统计数据 - 或者您只需采集大量样本。