Желая написать raytracer, остановился на том, какую библиотеку алгебры использовать (C ++) - PullRequest
10 голосов
/ 13 января 2011

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

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

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

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

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

Ответы [ 5 ]

12 голосов
/ 13 января 2011

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

И если честно, использование GLSL в любом случае не даст вам гораздо большего (они поддерживают только точечную, перекрестную и простую векторную математику, все остальное должно быть написано вручную).Я также рекомендовал бы создавать прототипы в C ++, а затем переходить в CUDA.Отладка кода GPU довольно сложна, поэтому вы можете заставить его работать в ЦП, а затем немного перекодировать его для работы в CUDA.

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

2 голосов
/ 13 января 2011

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

Этот форум рассматривает трассировку лучей в реальном времени, в основном на C ++.Он даст вам указатели и пример источника.

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

1 голос
/ 13 января 2011

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

0 голосов
/ 13 января 2011

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

0 голосов
/ 13 января 2011

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

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

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

...