Должен ли я использовать Intel Embree через API или через исходный код проекта?

Я думаю об использовании Intel Embree в моем рендере и в настоящее время играю с учебниками по Embree.

Итак, вопрос в том, возможно ли эффективно использовать Intel Embree через API?

Я имею в виду, я вижу, что функции от <embree2/rtcore.h>, <embree2/rtcore_ray.h>, e.t.c использовать некоторые внутренние структуры данных, такие как RTCRay, И, очевидно, поскольку я не могу перегрузить никакие операторы, мне всегда приходится приводить свои структуры данных к структурам данных Embree и наоборот. И это даже не просто приведение типов, это конструкция нового объекта.

Например, перед звонком rtcIntersect(RTCScene scene, RTCRay ray); Я строю RTCRay луч от моего Ray Класс объекта, а затем, когда функция возвращает некоторые данные, я копирую некоторые значения обратно.

Это не похоже на хороший способ использовать Intel Embree.

2 ответа

Я использовал API напрямую из готовых двоичных файлов. Недостатком является то, что нет никаких векторных или матричных функций для работы, но с другой стороны это означает, что вы можете использовать любую другую библиотеку, которую вы хотите, это не решено для вас. Для простоты я использовал файл заголовка с открытым исходным кодом linalg.h.

Вот мой проект EmbreeTest с единственным файлом Main.cpp, с которого можно начать. Просто используйте установщик Embree, и это все, что вам нужно.

Что касается эффективности, если вы начнете с этим проектом, вы сможете определить, есть ли какие-либо узкие места в производительности, поскольку он почти ничего не делает, кроме как вызывает Embree. Метод приведения луча просто копирует ray org и dir, которые я вычислил, в структуру RTCRay в стеке. Я не думаю, что это будет много накладных расходов. Реструктуризация для одновременного применения нескольких лучей будет иметь большее значение для производительности, чем копия.

Создавая RTCRay, используйте rtcIntersect, затем скопируйте данные обратно. Накладные расходы незначительны (<0,5%) по сравнению с пересечением лучей и примитивным пересечением.

Я думаю, что рендер Corona использует RTCRay внутри, поэтому они экономят 0,5% накладных расходов.

Я знаю, что V-Ray точно создает RTCRay, использует rtcIntersect, а затем копирует данные обратно.

Общий совет: избегайте преждевременной оптимизации. Реализуйте рабочий код, а затем используйте профилировщик, чтобы направлять ваши оптимизации.

Другие вопросы по тегам