出于学习目的,我正在研究光线追踪技术。我最近发现了Global Illumation及其变体,通过Kevin Beason阅读了这部神奇的作品。 我确实尝试用另一种语言(Lua)移植smallpt。
到目前为止,我得到了一些正常的工作,但在我看来,它让这个场景变得太慢了。 到目前为止,我在互联网上挖掘,我已经看到很多关于这个主题的技术论文,这是全球照明技术的主要问题,特别是路径追踪。在我看来,有一些方法可以加快这个过程,例如间距填充曲线(例如希尔伯特曲线)。基本上,它们都将视口划分为桶(或块),然后命令渲染以特定顺序处理每个桶上的路径跟踪。从技术上讲,我没有看到如何实现希尔伯特曲线,但我想了解实际上如何使整个过程更快?
我的第一个假设是,考虑到每个存储桶appart,渲染器被调用特定的像素,然后其他的是使用插值技巧的样本,但实际上,似乎渲染器在存储桶上的每个像素上被调用。 / p>
因此,在我的拙见中,渲染器将处理地图的所有像素,这导致与两个嵌套for循环(对于每行,每列)相同的工作量。所以我知道我显然遗漏了一些东西,因此寻找一些干净的解释。
提前致谢。
答案 0 :(得分:1)
Smallpt旨在通过尽可能少的代码行中的路径跟踪来演示全局照明。因此,它没有任何性能优化功能。
对于比简单场景更复杂的事情,大部分渲染时间用于计算光线沿其路径撞击哪个物体,因为每次射线必须多次完成。
对于每次射线反弹,一个天真的实现都需要计算射线与构成场景的每个对象的交集,以确定下一个击中哪个对象。
要改进此加速结构用于减少必须计算的光线/物体交叉点的数量,通常是通过对包围场景的体积进行分区以避免不必要的交叉点测试。
主要有两种方法:
性能方面同样有效,但我相信BVH更容易实现。
答案 1 :(得分:0)
我不知道那种方法,但单独的平铺可以帮助提高性能,因为它可以提高复杂场景的缓存使用率 - 即。而不是从左向右扫描,在场景中徘徊,将所有东西都拉到缓存中,一次做瓦片,比如说,几百条光线都落入场景的大致相同区域而不是快速地穿过它,意思是只有该区域的数据需要在缓存中。当然,二次射线基本上是随机的,所以如果你使用路径追踪,那么第一道射线可能并不重要。但它对光子映射可能更有帮助。
无论如何,也许空间填充曲线正在做类似的事情。除此之外,我不知道它们可能是什么。
[edit]尝试取出它们,看看性能是否有所改变。