Pod koniec zeszłego roku postanowiłem zrobić eksperyment. Wywaliłem Windowsa ze swojego kompa stacjonarnego i zainstalowałem Debiana w wersji testing (czyli Lenny). Dzisiaj mogę z czystym sumieniem powiedzieć, że była to bardzo dobra decyzja, a dystrybucja spisuje się wyśmienicie. Poniżej zrzutka z mojego aktualnego pulpitu:

Debian, którego aktualnie mam zainstalowanego to wersja 64-bitowa. Z tego też powodu ma kilka przypadłości. Przykładowo nie udało mi się znaleźć Flash Playera pod mój system (używam swfdec do YT). Poza tym zaraz po zainstalowaniu potrzebny był mały tunning systemu. Trzeba było uaktywnić obsługę dodatkowych przycisków myszki (np. back), zainstalować sterownik Nvidii i kilka innych pakietów (np. klienta samby czy madwifi do mojej karty bezprzewodowej). Poza tymi kilkoma rzeczami system działał bez zarzutu. Na dzień dzisiejszy mogę stwierdzić, że nie szykuje się prędko zmiana systemu na moim kompie. Dobrze się dogaduję z Debianem.
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:

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.
Przez parę dni używałem NetBeansów do programowania projektu H-RT. Nie były to może sesje bardzo obfite w nowy kod czy długie, ale pozwoliły mi nieco bliżej przyjrzeć się funkcjonowaniu tego środowiska. Mam zatem kilka nowych przemyśleń - tym razem gorzkich. 
Podpowiadacz
Pierwsza sprawa to wspominany już w poprzednim poście “intellisense”, czyli auto-podpowiedzi. Okazuje się, że jest on mniej użyteczny niż sądziłem. Owszem, tuż po przebudowaniu projektu i odczekaniu paru sekund działa, ale… no właśnie. Z dotąd nieznanych mi powodów mechanizm ten potrafi się w danym pliku po prostu zdezaktywować. Wyświetla wtedy w podpowiedzi smutny napis: “no suggestions”. Druga sprawa to wykorzystanie szablonów. Podpowiadacz najwyraźniej nie radzi sobie np. z szablonami dotyczącymi inteligentych wskaźników (ang. smart pointer). Owszem, potrafi podpowiedzieć to co jest w samym szablonie, ale już operator -> ukazuje nam jego bezradność (”no suggestions”). Trochę to smutne, gdyż w nowoczesnym programie w C++ dość często używa się jakiejś formy smart-pointerów. Kolejna sprawa to prędkość działania podpowiedzi. Zazwyczaj, niestety, trzeba chwilkę odczekać zanim cokolwiek się pojawi (powiedzmy koło 1 sek) po naciśnięciu Ctl+spacja. Nie doszedłem również do końca kiedy podpowiedź się pojawia automatycznie, a kiedy trzeba podpowiadacza przywołać ręcznie. Wszystkie te cechy wpływają na wydajność programowania oraz na stopień irytacji programującego. Oczywiście negatywnie.
Edytor kodu
Druga sprawa to dość dziwne czasem zachowanie samego edytora kodu. Ustawienia ilości spacji reprezentujących znak tabulacji po prostu nie działa. Co bym nie ustawił to IDE zawsze wetnie mi taby na 8 znaków. Próbowałem wszystkich możliwych dostępnych opcji w konfiguracji - bez skutku. Owszem, od czasu do czasu szanowny edytor dobrze sformatuje kod, ale takie momenty zdarzają się niezwykle rzadko. Jedynym wyjściem z tej sytuacji jest zamiana tabów na spacje.

Będąc jeszcze przy edytorze warto wspomnieć o jeszcze jednym błędzie. Jeśli cokolwiek zmienimy w konfiguracji kolorów podświetlania składni edytor po zamknięciu okna konfiguracyjnego powinien odświeżyć aktualny widok. No więc… czasem o tym zapomina. Mały błąd, a może wprowadzić zamęt (’Przecież to przed momentem zmieniałem!’).
Prędkość działania
W pierwszym poście na temat NB6 pochwaliłem je za większą prędkość działania niż jego konkurent - Eclipse CDT. Prawdę mówiąc nie jestem teraz o tym tak do końca przekonany. Czasem środowisko ma chwile słabości i potrafi się zablokować na 2-3 sekundy. W ogóle czasem mam wrażenie, że wszystko działa ociężale. A nie mam słabego procesora, bo trudno słabym nazwać Core 2 Duo 2.4GHz.
Rozwój
Ostatnią sprawą, która mnie martwi jest fakt, że rozwój wsparcia dla C++ w projekcie NetBeans chyba zamarł. I to dobre 3 miesiące temu. Przynajmniej tak wygląda to z punktu widzenia CVS’a. Nie wiem co o tym wszystkim myśleć. Czy warto nadal pracować w tym środowisku, skoro może ono pozostać w aktualnym punkcie rozwoju (mówię oczywiście o C++). Czas pewnie pokaże. Mam jednak nadzieję, że rozwój części C++ NetBeansów pójdzie do przodu, bo środowisko jest całkiem sympatyczne.

Jako że wreszcie zeszła mi grypowa temperatura postanowiłem nieco czasu poświęcić na poszukiwanie darmowej, wieloplatformowej alternatywy dla Visual C++ 2005. Miałem już zabierać się za Eclipse CDT, gdy przypomniałem sobie o tym, że parę tygodni temu zainstalowałem nową wersję NetBeansów (czyli wersja 6) specjalnie przeznaczoną dla C++. Był to krótki epizod. Nie testowałem tego środowiska pod kątem czegoś więcej niż standardowe HelloWorld. Tak czy inaczej same NetBeansy wywarły na mnie pozytywne wrażenie. Dlatego też postanowiłem do nich wrócić.
Środowisko wydaje mi się nieco bardziej spójne od Eclipsa. Działa również nieco od swojego konkurenta szybciej. Zaskakujące jest to, że IDE pierwotnie przeznaczone dla języka Java okazało się dobrze przystosowane do C++. Podświetlanie składni działa poprawnie, choć jest nieco uboższe od tego z tandemu VC++2005/VisualAssist. Idzie się jednak do niego przyzwyczaić. Dość pozytywnie zaskoczył mnie mechanizm podpowiedzi, czyli odpowiednik microsoftowego Intellisensa. Działa on dość sprawnie. Znowu, nie jest to aż tak zaawansowane narzędzie jak podpowiedzi VisualAssista, ale jest wystarczające do większości zastosowań. Szkoda tylko, że podpowiedzi nie działają jeszcze zbyt dobrze dla szablonów. Kolejną rzeczą jest integracja w pakiecie obsługi CVS oraz, co dla mnie ważniejsze, Subversion. Tutaj należy się wielki plus dla developerów NetBeansów. Wreszcie jakieś IDE ma w podstawowej wersji zainstalowaną wtyczkę do Subversion, która działa out-of-the-box. Jeśli chodzi o obsługę projektów C++ to programiści NetBeans postawili na kompatybilność z narzędziem make. Innymi słowy, nasz projekt możemy zbudować poza środowiskiem używając po prostu starego dobrego make’a.
Do testów NetBeansów posłużył mi projekt H-RayTracer. H-RT jest raytracerem napisanym w C++, który w chwili obecnej służy mi do badań przy mojej pracy magisterskiej. Do tej pory rozwijałem go w Visual Studio 2005 z wtyczką VisualAssist. Ponieważ chciałem, aby sam projekt był wieloplatformowy postanowiłem go przeportować na Linuksa. I udało się, właśnie dzięki NetBeansom. Po paru godzinach zmagań i nauki nowego środowiska udało mi się zbudować w pełni działający raytracer pod Debianem.
Tak więc nie pozostaje mi nic innego jak zachęcić wszystkich programistów C++ do spróbowania NetBeansów 6 dla C++. Wydaje mi się, że warto.
NetBeans 6.0 for C/C++
Tak oto w pierwszy dzień roku 2008 blog znowu zaczyna funkcjonować. Udało mi się po ciężkich bojach zmusić apache’a do ponownego serwowania bloga. Niestety, z powodu nękającej mnie grypy operacja ta trwała kilka godzin. Nawet nie wiedziałem jakie głupoty człowiek potrafi wymyślić gdy ma gorączkę.
Całe szczęście skończyło się to pozytywnie i blog znowu działa. Już niedługo napiszę o modelach odbicia światła, gdyż akurat teraz się tym zajmuję…