Желая написать raytracer, застрял на том, какую библиотеку алгебры использовать (С++)

Я хотел написать свой собственный многопоточный raytracer в реальном времени на С++, но я не хочу реализовывать всю векторную и матричную логику, которая поставляется вместе с ним. Я решил, что сделаю некоторые исследования, чтобы найти хорошую библиотеку для этого, но у меня не было большого успеха...

Важно, чтобы реализация была быстрой, и желательно, чтобы она включала некоторые дружественные лицензии. Я читал, что boost имеет базовую алгебру, но я не мог найти ничего о том, насколько хорошо это касалось его скорости.

В остальном Google дал мне Armadillo, который утверждает, что он очень быстрый, и сравнивает себя с некоторыми другими библиотеками, о которых я не слышал.
Затем я получил Seldon, который также утверждает, что он эффективен и удобен, хотя я не мог узнать, где именно они находятся на шкале.
Наконец, я прочитал о Eigen, о котором я также упоминал здесь в StackOverflow при поиске здесь.

В лекции CG в моем университете они используют HLSL для алгебры (что позволяет студентам реализовать/оптимизировать части raytracer), и это заставило меня подумать, могу ли я использовать GLSL для этого. Опять же, я понятия не имею, какой вариант наиболее эффективен, или общий совет по библиотекам алгебр. Я надеялся, что SO может помочь мне здесь, поэтому я могу начать с некоторой реальной разработки:)

PS: Я пытался подключиться к сайтам, но мне еще не хватает репутации

Ответ 1

Я бы рекомендовал писать свои собственные подпрограммы. Когда я написал свой raytracer, я обнаружил, что большая часть алгебры использует ту же небольшую коллекцию методов. В основном все, что вам нужно, это векторный класс, который поддерживает сложение, вычитание и т.д. И оттуда все, что вам действительно нужно, это Dot and Cross.

И, честно говоря, использование GLSL не даст вам гораздо больше, чем в любом случае (они поддерживают только точку, кросс и простую векторную математику, все остальное должно быть закодировано вручную). Я также рекомендую прототипирование на С++, а затем перейду на CUDA. Довольно сложно отладить код графического процессора, поэтому вы можете заставить его работать в ЦПУ, а затем немного перекодировать его для работы в CUDA.

В действительности raytracers довольно просты. Это делает их быстрыми, что сложно. Это структуры ускорения, которые занимают большую часть вашего времени и оптимизации. По крайней мере, это было для меня.

Ответ 2

Вы должны взглянуть на http://ompf.org/forum/

Этот форум относится к raytracing реального времени, в основном на С++. Он даст вам указатели и образец источника.

В большинстве случаев, как и каждый цикл, люди не полагаются на внешние векторные математические библиотеки: оптимизация зависит от используемого вами компилятора, вложения, использования SSE (или вида) или нет и т.д.

Ответ 3

Я рекомендую "IlmBase", который является частью пакета OpenEXR. Это хорошо написанный С++, разработанный ILM и широко используемый людьми, которые профессионально пишут и используют графическое программное обеспечение.

Ответ 4

Для моих проектов я использовал glm, может быть, это вам тоже понравится.

Обратите внимание, что библиотеки, такие как boost::ublas или seldon, вероятно, вас не устраивают, потому что они ориентированы на BLAS (и я предполагаю, что вы ищете хорошую линейную алгебру линейных алгебр с 3D-движением).

Кроме того, библиотека dxmath DirectX довольно хороша, хотя иногда ее трудно использовать, потому что она совместима с C.

Ответ 5

Вы можете посмотреть исходный код POVRAY