【问题标题】:Ray tracer for complicated figures复杂图形的光线追踪器
【发布时间】:2015-05-05 08:36:59
【问题描述】:

我已经用 MetalFramework for iOS 实现了实时光线追踪器,它是为跟随光学棱镜而实现的,如十二面体、二十面体、八面体、立方体等。我所有的图形都是由三角形组成的,例如立方体 - 12 个三角形,八面体 - 4三角形。我追踪光线并搜索与图形的交点,然后搜索光线在棱镜中的移动方式。然后射线离开身影,我搜索与天空盒的交点。问题在于复杂的数字。当我测试立方体 fps 为 60 时,但当我测试十二面体 fps 为 6 时。在我的算法中,与图形的交集与与任何三角形的交集相同。这意味着当我检查与射线和图形的交点时,我必须检查与所有三角形的交点。我需要一些想法如何不检查所有三角形的交点。谢谢。

【问题讨论】:

  • 您需要划分场景部分并仅测试与射线相交的部分内的对象/三角形......有很多基于树的方法,但我更喜欢从场景中制作一个像网格一样的体素,将三角形分组到voxel cubes,然后只跟踪穿过这些立方体的光线,并仅测试为命中体素立方体列出的三角形。这应该会大大加快速度
  • 谢谢。我不明白如何划分场景。你能举一些例子吗?
  • 添加了答案,试图澄清我的意思......

标签: ios algorithm geometry raytracing metal


【解决方案1】:

假设你的世界被某个边界框包围

  1. 创建网格(将此框划分为立方体或其他)

  2. 每个体素/细胞

    是相交或位于其中的三角形列表,因此在为每个单元格渲染之前处理所有三角形并存储内部或交叉的所有三角形的索引

  3. 重写光线追踪器以追踪此体素贴图

    因此,只需通过相邻体素增加光线,这与像素上的线光栅化相同。这样你就完成了部分 Z 排序。因此,获取第一个被射线击中的体素并仅测试其中包含的三角形。如果发现任何体素命中,则停止(无需测试其他体素,因为它们更远)。

  4. 进一步优化

    如果三角形已经过测试,您可以添加标志,因此只测试那些尚未测试的三角形,否则许多三角形将被多次测试

[注释]

每个轴的体素数量会极大地影响性能,因此您需要稍微调整一下才能获得最佳性能。如果您有动态对象,则体素映射列表计算必须不时进行一次,甚至每帧进行一次。对于静态场景,只需执行一次即可。

【讨论】:

    【解决方案2】:

    为了有效地跟踪,您需要使用加速结构,例如 KD 树或包围体层次结构 (BVH)。这类似于使用二叉搜索树来查找匹配元素。

    我建议使用 BVH,因为它比 KD-tree 更容易构建和遍历。我建议不要使用统一的体素网格结构。当三角形在场景中分布不均匀或高度集中在几个体素中时,体素网格的性能很容易变得很差。

    BVH 只是一个边界体积树,例如一个轴对齐边界框 (AABB),它包含其中的图元。这样,如果您的 a 射线错过了包围体,您就知道它不会击中包含在其中的任何图元。

    构建 BVH:

    1. 将所有三角形放在一个包围盒中。这将是树的根。

    2. 将三角形分成两组,其中每组三角形的边界体积最小化。更恰当地说,您希望遵循表面积启发式 (SAH),您希望在其中创建一组三角形,在其中最小化两组三角形的(BVH 的表面积)/(# 个三角形)的总和。

    3. 递归地对每个节点重复第 2 步,直到剩下的三角形数量达到某个阈值(4 是一个很好的尝试)。

    遍历

    1. 检查光线是否击中根边界框,如果击中则继续步骤 2,否则未击中。

    2. 检查它是否命中子边界框。如果确实如此,则对其子边界框重复此步骤。否则没有命中。

    3. 当你得到一个只包含三角形的边界框时,你需要测试每个三角形,看看它是否像正常一样被击中。

    这是 BVH 的基本概念。还有更多关于 BVH 的详细信息我没有介绍,您必须搜索,因为细节有很多变化。

    简而言之实现一个包围体层次结构来追踪。

    【讨论】:

    • 感谢您的回复。但我不确定它是否会有所帮助。据我所知,它仅适用于静态场景。如果我旋转我的场景,它将无效。我只有一个由三角形组成的图形。如果我创建 BVH 并旋转我的图形,它将无效。
    • 旋转场景是什么意思?你的意思是你在场景中移动你的物体还是移动你的相机?因为如果您正在移动相机,那么如果您在通常的世界空间坐标中定义了 BVH,那么它仍然有效。如果您实际上是在世界上移动对象,那么即使是体素网格也无济于事,因为无论如何您都要在每一帧中重新处理它们。如果场景中只有一个对象,那么您只需在对象坐标空间中创建 BVH,那么是否移动对象都没关系。
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    相关资源
    最近更新 更多