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

最佳答案

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

  • 创建网格(将此框划分为立方体或其他任何内容)

  • 每个体素/单元
    是相交或在其中的三角形列表,因此在为每个单元格渲染之前处理所有三角形并存储所有三角形内部或交叉的索引
  • 重写光线追踪器以追踪这个体素贴图
    因此,只需通过相邻体素增加光线,它与像素上的线光栅化相同。这样你就完成了部分 Z 排序。因此,取第一个被光线击中的体素并仅测试其中包含的三角形。如果发现任何体素命中,则停止(无需测试其他体素,因为它们更远)。
  • 进一步优化
    如果三角形已被测试,您可以添加标志,因此仅测试那些尚未测试的三角形,否则将多次测试许多三角形

  • [注释]
    每个轴的体素数量会极大地影响性能,因此您需要稍微调整一下以实现最佳性能。如果您有动态对象,那么体素映射列表计算必须不时或什至每帧进行一次。对于静态场景,只需执行一次即可。

    关于ios - 复杂图形的光线追踪器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28853061/

    10-13 02:22