我应该通过 API 还是通过项目的源代码本身使用 Intel Embree?

Should I use Intel Embree via API or via the project's source code itself?

我正在考虑在我的渲染器中使用英特尔 Embree,目前正在研究 Embree 教程。

所以,问题是,是否可以通过 API 高效地使用 Intel Embree?

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

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

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

构造RTCRay,使用rtcIntersect,然后将数据拷贝回来。与光线遍历和图元相交相比,开销可以忽略不计 (<0.5%)。

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

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

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

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

这是我的EmbreeTest project that has a single Main.cpp file which gets you started. Just use the Embree installer,这就是你所需要的。

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