首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >路径跟踪:缩放颜色

路径跟踪:缩放颜色
EN

Stack Overflow用户
提问于 2012-11-03 06:15:51
回答 1查看 345关注 0票数 1

我正在尝试阅读http://www.kevinbeason.com/smallpt/的源代码,特别是有一件事我不能理解。在55行,它说的是f=f*(1/p)

那是什么?是干什么的呢?更重要的是,为什么它读起来是这样的?是不是某种启发式方法可以让图像更快地收敛?

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

代码语言:javascript
复制
function radiance
     ...
    return Le(x) + R(p) * radiance(rn)

重要的是R(p) -我真的不知道它是做什么的,但对于99%的人来说,它不是上面的那个f

有人能帮我解释一下吗?

EN

回答 1

Stack Overflow用户

发布于 2012-11-03 08:48:09

我想你的答案就在这个slides中,它包含了对smallpt的显式照明版本的逐行解释,并将其重新格式化为75%的长度。

简而言之,行#55在函数radiance中,在该函数中估计沿光线的辐射度估计。

代码语言:javascript
复制
if (++depth>5) 
    if (erand48(Xi)<p) f=f*(1/p); 
    else return obj.e;

首先,此函数ray.

  • f是一个递归函数(调用自身)

  • 当光线照射到玻璃表面时,光线跟踪器必须确定它是进入还是离开玻璃以计算折射ray.

  • f是对象的颜色。

  • p是表面颜色的最大分量(r,g,b)。如果递归深度大于5.

  • we,我们在#55线上执行Russian Roulette根据表面反射率随机停止递归使用p - f的最大分量对每个分量进行归一化,

所以,

代码语言:javascript
复制
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的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13203767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档