2011-01-12 9 views
10

Chciałbym napisać własny wielowątkowy raytracer w czasie rzeczywistym w C++, ale nie chcę implementować całej logiki wektorowej i macierzowej, która przychodzi z tym. Doszedłem do wniosku, że będę szukał w tym celu dobrej biblioteki, ale nie odniosłem wielkiego sukcesu ...Chciałem napisać raytracera, zatrzymanego na jakiej bibliotece algebry użyć (C++)

Ważne jest, aby implementacja była szybka, a najlepiej, gdyby zawierała przyjazne licencje. Przeczytałem, że boost ma podstawową algebrę, ale nie mogłem znaleźć niczego, co byłoby dobre w odniesieniu do prędkości.

Co do reszty, Google dało mi Armadillo, który twierdzi, że jest bardzo szybki i porównuje się z pewnymi innymi bibliotekami, o których nie słyszałem.
Potem dostałem Seldon, który również twierdzi, że jest wydajny i wygodny, chociaż nie mogłem się dowiedzieć, gdzie dokładnie są na skali.
Wreszcie przeczytałem o Eigen, o czym już wspominałem tutaj w StackOverflow podczas wyszukiwania tutaj.

Na wykładzie CG na mojej uczelni używają one HLSL dla algebry (co pozwala uczniom implementować/optymalizować części raytracera), co pozwoliło mi zastanowić się, czy mogę użyć do tego celu GLSL. Ponownie nie mam pojęcia, która opcja jest najskuteczniejsza, ani jaki jest ogólny konsensus dotyczący bibliotek algebry. Miałam nadzieję, więc może mi pomóc tutaj, więc mogę zacząć z jakiegoś rzeczywistego rozwoju :)

PS: próbowałem z linkami do stron, ale nie mam wystarczająco dużo rep jeszcze

+1

bardzo polecam ompf.org (http://ompf.org) ich fora pełne są jedne z najszybszych raytracers w istnieniu. Wiele z nich zawiera szczegółowe informacje o tym, jak działają. –

Odpowiedz

12

ja polecam pisanie własnych rutyn. Kiedy napisałem swój raytracer, odkryłem, że większość algebry używa tej samej małej kolekcji metod. Zasadniczo potrzebujesz tylko klasy wektorowej, która obsługuje dodawanie, odejmowanie itp. A wszystko, czego naprawdę potrzebujesz, to Dot i Cross.

Szczerze mówiąc, używanie GLSL nie przyniesie ci nic więcej poza tym (obsługują tylko kropki, krzyżówki i proste matematyki wektorowe, wszystko inne musi być zakodowane ręcznie). Poleciłbym także prototypowanie w C++, a następnie przejście do CUDA. Trudno jest debugować kod GPU, więc można go uruchomić w CPU, a następnie przekodować nieco, aby działał w CUDA.

W rzeczywistości raytracers są dość proste. Sprawia, że ​​są szybkie, co jest trudne. To struktury przyspieszenia, które zajmą większość czasu i optymalizację. Przynajmniej dla mnie.

+0

Czy napisałeś własną procedurę przecinania obiektów promienia, czy biblioteka może sobie z tym poradzić? –

+0

To jest dokładnie ten rodzaj odpowiedzi, którego szukałem, dzięki! – robrene

+0

Napisałem własne. I nie jest to trudne. Zacząłem od brutalnej siły, trójwymiarowego raytracera. Napisałem eksportera z Blendera, który wyeksportował dowolny obiekt jako listę trójkątów. Następnie v1 raytracera wystarczy zrobić przecięcie promieniowe>> trójkąt. Potem zaimplementowałem drzewo BVH. Zasadniczo bierzesz grupy trójkątów i pakujesz je w kostki. Kostki są zawijane w więcej kostek. Stamtąd wystarczy zrobić test na przecięcie promienia i sześcian i iść dalej, aż uderzysz w trójkąt. –

0

Dla moich projektów użyłem glm, może to również ci odpowiadać.

Uwaga że biblioteki takie jak boost::ublas lub seldon prawdopodobnie nie będzie Ci odpowiadać, ponieważ są one zorientowane BLAS (i ​​zakładam szukasz dobrej 3D napędzane biblioteki algebry liniowej).

Również biblioteka DirectX dxmath jest całkiem niezła, choć czasami trudna w użyciu, ze względu na jej styl kompatybilny z C.

0

Można spojrzeć na kod źródłowy dla POVRAY

+3

PoVRay nie jest dokładnie świetnym przykładem kodu C++, czyż nie? –

2

Należy wziąć spojrzeć na http://ompf.org/forum/

To forum traktuje Realtime raytracingu, głównie w C++. Da ci wskazówki i przykładowe źródło.

Większość czasu, jak co liczyć cyklu, ludzie nie opierać się na wektor zewnętrzny bibliotekami matematycznych: optymalizacje zależy od kompilatora używasz, inline, użycie SSE (lub nie) lub kindof itp

+1

Ten URL nie jest już prawidłowy, użyj tego dla OMPF2: http://ompf2.com/index.php – bjorke

1

polecam „IlmBase”, który jest częścią pakietu OpenEXR. Jest to dobrze napisane C++, opracowane przez ILM i szeroko stosowane przez ludzi, którzy profesjonalnie piszą i używają oprogramowania graficznego.