Желая написать 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