Я думаю об использовании 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.
Создавая RTCRay, используйте rtcIntersect, затем скопируйте данные обратно. Накладные расходы незначительны (<0,5%) по сравнению с пересечением лучей и примитивным пересечением.
Я думаю, что рендер Corona использует RTCRay внутри, поэтому они экономят 0,5% накладных расходов.
Я знаю, что V-Ray точно создает RTCRay, использует rtcIntersect, а затем копирует данные обратно.
Общий совет: избегайте преждевременной оптимизации. Реализуйте рабочий код, а затем используйте профилировщик, чтобы направлять ваши оптимизации.
Я использовал API напрямую из готовых двоичных файлов. Недостатком является то, что нет никаких векторных или матричных функций для работы, но с другой стороны это означает, что вы можете использовать любую другую библиотеку, которую вы хотите, это не решено для вас. Я использовал открытый заголовочный файл linalg.h чтобы все было просто.
Вот мой EmbreeTest проект, который имеет один main.cpp файл, с которого вы начали. Просто используйте Установщик Embree и это все, что вам нужно.
Что касается эффективности, если вы начнете с этого проекта, вы сможете определить, есть ли какие-либо узкие места в производительности, поскольку он почти ничего не делает, кроме как вызывает Embree. Метод приведения луча просто копирует ray org и dir, которые я вычислил, в структуру RTCRay в стеке. Я не думаю, что это будет много накладных расходов. Реструктуризация для одновременного применения нескольких лучей будет иметь большее значение для производительности, чем копия.