1

仅出于学习目的,我正在研究光线追踪技术。我最近发现了 Global Illumation 及其变体,阅读了Kevin Beason的这部惊人的作品。我确实尝试过用另一种语言(Lua)移植 smallpt。

到目前为止,我的工作正常,但在我看来它渲染场景太慢了。到目前为止,我在互联网上进行了挖掘,并且我在很多涵盖该主题的技术论文中看到这是全局照明技术的主要问题,尤其是路径跟踪。

在我看来,有一些方法可以加快这一过程,例如间距填充曲线(例如希尔伯特曲线)。基本上,它们都将视口划分为桶(或图块),然后命令渲染器以特定顺序在每个桶上处理路径跟踪。从技术上讲,我没有研究如何实现希尔伯特曲线,但我想了解,实际上,这如何能让整个过程更快?

我的第一个假设是,考虑到每个桶 appart,渲染器是在特定像素上调用的,然后其他的是使用插值技巧的样本,但实际上,渲染器似乎是在桶上的每个单个像素上调用的。

因此,在我看来,渲染器将处理地图的所有像素,这与两个嵌套的 for 循环(每行、每列)的工作量相同。所以我知道我显然遗漏了一些东西,因此期待一些清晰的解释。

提前致谢。

4

2 回答 2

1

Smallpt 旨在以尽可能少的代码行来演示具有路径跟踪的全局照明。因此,它没有任何性能优化。

对于比简单场景更复杂的任何场景,大部分渲染时间都花在计算光线沿着其路径下一个命中的对象上,因为这必须为每条光线执行多次。

一个简单的实现将需要,对于每一次光线反弹,计算光线与场景中每个对象的交集,以确定下一个被击中的对象。

为了改进这一点,加速结构用于减少必须计算的光线/对象交叉点的数量,通常通过分割包围场景的体积来避免不必要的交叉点测试。

主要有两种方法:

性能方面两者都同样出色,但我相信 BVH 更易于实施。

于 2013-01-04T19:37:17.450 回答
0

我不知道那种方法,但单独平铺可以提高性能,因为它可以提高复杂场景的缓存使用率 - 即。不是从左到右扫描,而是在场景中游荡,将所有内容都放入缓存中,通过一次做图块,比如说,几百条光线全部落入场景的大致相同区域,而不是愉快地穿过它,这意味着只有该区域的数据需要在缓存中。当然,二次光线基本上是随机的,所以如果你使用路径追踪,第一条光线可能不会那么重要。不过,它可能对光子映射更有帮助。

无论如何,也许空间填充曲线在那里做类似的事情。除此之外,我不知道它们可以用来做什么。

[编辑] 试着把它们拿出来看看性能是否有变化。

于 2012-12-20T17:48:23.787 回答