H-RT - podsumowanie

H-RayTracer został z grubsza przedstawiony przeze mnie w jednym z zeszłorocznych wpisów. Dzisiaj chcę przedstawić projekt bardziej szczegółowo i przy okazji podsumować moje - póki co skromne - osiągnięcia na jego polu. H-RT to silnik renderujący sceny 3D metodą śledzenia promieni. Docelowo ma on wspierać rendering oparty na algorytmach mających podstawy fizyczne. Droga do tego jest jeszcze dość długa, ale już dzisiaj H-RT potrafi generować proste obrazy. Przykład takiego renderingu jest poniżej:

hrt-sample1.png

Modele odbicia światła
Głównym zadaniem, jakie sobie postawiłem rozpoczynając pracę nad raytracerem było zbadanie możliwości współczesnych modeli lokalnego odbicia światła. Nie jest to jeszcze zadanie skończone, gdyż w kolejce jest jeszcze parę modeli. Do dzisiaj udało mi się jednak zaimplementować następujące:

  • Phong
  • Ashikhmin-Shirley
  • Cook-Torrance
  • Ward
  • He-Torrance-Sillion-Greenberg

Warto zwrócić uwagę zwłaszcza na ten ostatni model. Jest on chyba jednym z najbardziej skomplikowanych obliczeniowo, a przy okazji uwzględnia wiele efektów fizycznych związanych z odbiciem światła. Model ten jest około 90 razy wolniejszy od modelu AS (i to z prekalkulacją danych). Daje też dość ciekawe efekty (zakładając że go poprawnie zaimplementowałem :) ), o których nie omieszkam napisać kiedy indziej.

Inne możliwości
Póki co silnik potrafi renderować dość proste bryły/kształty, czyli: kule, walce, dyski, płaszczyzny i trójkąty. Do badań modeli odbicia to w zupełności wystarczy, natomiast w przyszłości zostaną dodane kolejne (np. możliwość renderowania siatki trójkątów). Zaimplementowany jest także system filtrów (gaussowski, box, trójkątny, sinc), które w końcowej fazie “składają” obraz z promieni. Ponadto zostały zaimplementowane światła punktowe i powierzchniowe. Obraz wyjściowy może zostać zapisany bądź w formacie PNG bądź w formacie HDR (High-Dynamic-Range). Engine także może wewnętrznie operować na danych spektralnych (światło można zdefiniować wtedy w postaci spektralnej), a nie tylko RGB. Aktualnie jestem w fazie dodawania wsparcia dla polaryzacji światła, więc i ten “aspekt optyczny” będzie brany pod uwagę w czasie generowania obrazu.

Słabością aktualnej wersji H-RT (co wyklucza jego szersze zastosowanie) jest brak wsparcia dla raytracingu stochastycznego. Zmieni się to w jednej z kolejnych wersji (gdzie planuję zaimplementować path-tracing). Na dzień dzisiejszy, po dopracowaniu wsparcia dla polaryzacji światła, mam zamiar zamrozić kod raytracera i skupić się na usuwaniu błędów i przyspieszaniu renderingu. Poza tym czeka mnie napisanie pracy magisterskiej, w czasie którego będą bardzo intensywnie używał H-RayTracera. Dopiero po - mam nadzieję udanej - obronie praca nad nowymi możliwościami ruszy na nowo.

Projekt: H-RayTracer

H-RTByć może ktoś przeglądając mojego bloga zauważył w odsyłaczach link do strony domowej projektu H-RayTracer. Chciałbym w dzisiejszym wpisie przedstawić H-RT, gdyż jestem jego autorem. Wszystko zaczęło się w zeszłym roku, gdy musiałem sobie wybrać temat pracy magisterskiej. Jako promotora swojej pracy wybrałem dra Dariusza Sawickiego, który jest entuzjastą grafiki komputerowej (pozdrawiam!). Odkąd pamiętam grafika zawsze była mi bliska i już jakiś czas temu podjąłem decyzję, że chciałbym napisać magisterkę na ten temat. I tak oto zdobyłem temat pracy. Nie wdając się zbytnio w szczegóły praca polega na przeanalizowaniu pod kątem użyteczności i wydajności kilku modeli lokalnego odbicia światła (w tym jeden szczególny oparty na fizyce). Ponieważ do moich badań potrzebuję narzędzi powstał niejako produkt poboczny (nie związany bezpośrednio z samą pracą) czyli właśnie H-RayTracer.

H-RayTracer jest narzędziem do generowania grafiki 3D algorytmem ray tracingu. Póki co jest we wczesnej fazie rozwojowej, ale z dnia na dzień staje się coraz bardziej funkcjonalny. Jedyna jak dotąd wydana oficjalnie wersja (0.1) potrafi używać tylko bardzo prostego algorytmu śledzenia promieni (opisanego przez Whitteda ponad 20 lat temu). Obecnie pracuję nad ray tracingiem stochastycznym, który bierze pod uwagę także odbicia światła od obiektów, a nie tylko światło pochodzące bezpośrednio ze źródeł.
Program jest napisany w języku C++ w pełni obiektowo. Wydaje mi się, że jest na tyle elastyczny, że można będzie w nim zawrzeć większość algorytmów renderingu opartych na śledzeniu promieni. Kwestia jedynie ich poznania i zaimplementowania, co nie jest zazwyczaj proste, ale jest za to bardzo ciekawe. Zdecydowałem się także na pełną otwartość kodu mojego rozwiązania - H-RayTracer jest oprogramowaniem open source.
Tyle informacji na temat H-RayTracer w dniu dzisiejszym. Jednakże od czasu do czasu będę zamieszczał na blogu wpis tyczący się H-RT.

Do obejrzenia:
przykładowy rendering z wersji 0.1