1

所以我正在学习光线追踪教程,试图伸展我的 F# 腿。由于本教程是用 C++ 编写的,因此弄清楚如何以函数方式应用这些概念是一个相当有趣的挑战。我想以尽可能实用的方式编写所有内容,因为我打算最终并行运行光线追踪器。但这让我陷入了以下情况,我确信它的核心出现在光线追踪以外的主题中。

我们有一个Engine对象(除其他外)存储一个Scene对象(对象的集合Primitive)。目前,其中的 theScenePrimitives 是完全不可变的。

为了尝试改进渲染时间,我们正在实现一个常规的 3D 网格。为了以有效的方式遍历网格,本教程在遍历算法和减少跨越网格边界的图元的交叉测试数量方面都参考了这篇论文。以下是后一部分的工作原理:

  • 每个都Ray被分配一个唯一的rayID
  • 每个Primitive都有一个lastRayID字段。
  • 当 aRay检查与 a 的交集时Primitive
    1. 如果 的rayID等于RaylastRayIDPrimitive则跳过相交测试。
    2. 否则,将执行测试,并将 的rayID存储Ray在 的lastRayID字段中Primitive

这是一种缓存相交测试的巧妙方法,但它是为顺序光线追踪器设置的,即使是两条并发光线也根本不起作用。因此,尽管我可以使用mutable场,因此能够实现该算法,但它并不能满足我固有的可并行化光线追踪器的最终目标。

我确实有一个想法。使用每个图元存储可变状态的问题在于,就渲染算法而言,场景是一个全局实体——每条光线都可能撞击任何图元。另一方面,每条光线都是完全独立的。所以在每条光线中,我想我可以建立一组已经过测试的原语(这个集合相当于lastRayID上面描述的字段)。这样做的问题是每条光线的生命周期非常短,并且在任何给定时间都可能存在许多光线,因此在每条光线中设置这样的数据结构可能会很昂贵((取消)分配时间和内存消费成本可能会迅速增加)

有人对处理这些情况有什么建议吗?即使这是关于将共享可变状态转换为本地可变状态或类似的一般想法,我相信这会对我有很大帮助。如有必要,我很乐意澄清任何事情。

4

0 回答 0