使用空间填充曲线加速全局照明 - 它是如何工作的?

Posted

技术标签:

【中文标题】使用空间填充曲线加速全局照明 - 它是如何工作的?【英文标题】:Speeding up global illumination using space filling curves - How does it works? 【发布时间】:2012-11-27 04:55:43 【问题描述】:

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

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

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

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

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

提前致谢。

【问题讨论】:

没人?这是项目存储库的链接,实际上是Smallpt-Lua。谢谢。 【参考方案1】:

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

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

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

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

主要有两种方法:

KD Trees - 与二进制空间分区树有关。 Bounding volume hierarchy - 包含对象和其他框的(通常)轴对齐框的层次结构。

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

【讨论】:

感谢 Jon,这绝对是我一直在寻找的空间分区技术。我会调查的。 酷。我首先推荐BVH。我尝试了 KD-Trees,虽然我最终让它们工作了,但调试起来并不有趣。【参考方案2】:

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

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

[edit] 尝试将它们取出,看看性能是否有变化。

【讨论】:

以上是关于使用空间填充曲线加速全局照明 - 它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中生成 3D 希尔伯特空间填充曲线的算法

光能传递全局照明阴影的边缘抖动,不直

使用 NEON 指令加速级联双二阶 - 它是如何工作的?

matlab怎么用函数填充三维曲线

在 PyX(python)中填充闭合曲线失败

Hilbert曲线简介及生成算法