【问题标题】:Should I use Intel Embree via API or via the project's source code itself?我应该通过 API 还是通过项目的源代码本身来使用 Intel Embree?
【发布时间】:2017-10-12 08:43:46
【问题描述】:

我正在考虑在我的渲染器中使用 Intel Embree,目前正在使用 Embree 教程。

那么,问题是,是否可以通过 API 有效地使用 Intel Embree?

我的意思是,我可以看到来自<embree2/rtcore.h>, <embree2/rtcore_ray.h>, e.t.c 的函数使用了一些内部数据结构,例如RTCRay。 显然,由于我不能重载任何运算符,我总是必须将我的数据结构转换为 Embree 数据结构,反之亦然。 这甚至不仅仅是一个类型转换,它是一个新对象的构造。

例如,在调用rtcIntersect(RTCScene scene, RTCRay ray); 之前,我从我的Ray 类对象构造RTCRay 射线,然后当函数返回一些数据时,我将一些值复制回来。

这看起来不是使用 Intel Embree 的好方法。

【问题讨论】:

  • 为什么不让你的类包含或继承自 RTCRay?

标签: c++ raytracing pbr embree


【解决方案1】:

我直接从预构建的二进制文件中使用了 API。缺点是没有向量或矩阵功能可以使用,但从好的方面来说,这意味着您可以使用任何其他您想要的库,这不是为您决定的。我使用了开源单头文件linalg.h 来保持简单。

这是我的 EmbreeTest 项目,它有一个 Main.cpp 文件,可以帮助您入门。只需使用Embree installer 即可。

至于效率,如果您从这个项目开始,您应该能够确定是否存在任何性能瓶颈,因为它除了调用 Embree 几乎什么都不做。光线投射方法只是将我计算的光线组织和目录复制到堆栈上的 RTCRay 结构中。我不认为这将是一个很大的开销。重组以同时投射多条光线肯定会比副本对性能产生更大的影响。

【讨论】:

    【解决方案2】:

    构造RTCRay,使用rtcIntersect,然后将数据复制回来。与光线遍历和原始相交相比,开销可以忽略不计(

    我认为 Corona 渲染器在内部使用 RTCRay,因此它们节省了 0.5% 的开销。

    我知道 V-Ray 确实在构建 RTCRay,使用 rtcIntersect,然后将数据复制回来。

    一般建议:避免过早优化。实现工作代码,然后使用分析器来指导您的优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      相关资源
      最近更新 更多