i przykładowa implementacja w asemblerze Politechnika Śląska Instytut Informatyki 27 sierpnia 2009
A teraz... 1 Fraktale Julia Przykłady Wstęp teoretyczny Rendering za pomocą śledzenia promieni 2 Implementacja Profiling i testy Porównanie osiągnięć Demonstracja, kod i pytania
2D Kolor na podstawie szybkości ucieczki
4D Algorytm: maszerujące sześciany
4D Algorytm: śledzenie promieni
A teraz... 1 Fraktale Julia Przykłady Wstęp teoretyczny Rendering za pomocą śledzenia promieni 2 Implementacja Profiling i testy Porównanie osiągnięć Demonstracja, kod i pytania
Julia dwuwymiarowa Zbiór Julii tworzą punkty P(x, y) Z Takie, że ciąg: { z0 = x + yi = z 2 n + c z n+1 nie dąży do nieskończoności. Parametr fraktala c = c 1 + c 2 i (1)
Julia czterowymiarowa Rozszerzenie polegające na zamianie liczb zespolonych na kwaterniony. Analogicznie: Zbiór Julii tworzą punkty P(x, y, z, w) Z Takie, że ciąg: { z0 = x + yi + zj + wk = z 2 n + c z n+1 nie dąży do nieskończoności. Parametr fraktala c = c 1 + c 2 i + c 3 j + c 4 k Więcej różnic można się spodziewać w definicji działań mnożenia i dodawania. (2)
Wstęp do renderowania Iteracja po pikselach obrazu. Przeliczanie współrzędnych obrazu na współrzędne zespolone. Heurystyczne określanie zbieżności ciągu. Przypisanie koloru do piksela. Zastosowanie analogicznego próbkowania w renderingu 3D Próbkowanie przestrzeni Julii celem określenia zbioru punktów przestrzeni należących do fraktala. Tworzenie siatek trójkątów za pomocą algorytmu maszerujących sześcianów i rendering np. za pomocą OpenGL.
Wstęp do renderowania Iteracja po pikselach obrazu. Przeliczanie współrzędnych obrazu na współrzędne zespolone. Heurystyczne określanie zbieżności ciągu. Przypisanie koloru do piksela. Zastosowanie analogicznego próbkowania w renderingu 3D Próbkowanie przestrzeni Julii celem określenia zbioru punktów przestrzeni należących do fraktala. Tworzenie siatek trójkątów za pomocą algorytmu maszerujących sześcianów i rendering np. za pomocą OpenGL.
Problem złożoności obliczeniowej Mnożenie liczb zespolonych s = z d: { sx = z x d x z y d y s y = z y d x + z x d y Mnożenie kwaternionów s = z d: s x = z x d x z y d y z z d z z w d w s y = z x d y + z y d x + z z d w z w d z s z = z x d z z y d w + z z d x + z w d y s w = z x d w + z y d z z z d y + z w d x Jak widać ilość obliczeń potrzebnych dla Julii kwaternionów jest o wiele większa.
Ilość operacji Ile operacji mnożenia trzeba wykonać żeby wygenerować wizualizację dwuwymiarową zbioru Julii bez antyaliasingu? Obrazek 640x480 to 307200 pikseli. Każdy piksel wymaga około 10 iteracji równania?? celem określenia czy granica jest właściwa. W sumie około 307200 * 10 * 3 = 9 216 000 mnożeń i 61 44 000 dodawań. To dużo.
A teraz... 1 Fraktale Julia Przykłady Wstęp teoretyczny Rendering za pomocą śledzenia promieni 2 Implementacja Profiling i testy Porównanie osiągnięć Demonstracja, kod i pytania
Podstawy algorytmu Tworzenie promieni kamera i jej opis. Wykrywanie kolizji promieni z fraktalem. Metoda krokowa: Obliczanie wektora normalnego do fraktala Określenie koloru wynikowego piksela
Ulepszenie algorytmu Unbounding volumes, czyli estymacja odległości promienia od Julii.
Jeszcze trochę matematyki W celu estymacji dolnej granicy odległości punktu do Julii, prócz obliczania granicy ciągu z n musimy również oszacować granicę funkcji pochodnej. { d0 = 1 + 0i + 0j + 0k d n+1 = 2z n d n (3) I ostatecznie obliczyć odległość ze wzoru: l = z log z (4) 2 d
Co zrobić ze znalezioną kolizją promień Julia? Obliczenie wektora normalnego. Wykorzystanie bufora głębokości (Z-Buffer) Z gradientu pola skalarnego Model oświetlenia Phong: Ambient, diffuse, specular
A teraz... 1 Fraktale Julia Przykłady Wstęp teoretyczny Rendering za pomocą śledzenia promieni 2 Implementacja Profiling i testy Porównanie osiągnięć Demonstracja, kod i pytania
Co warto zoptymalizować
Czyli konkretnie co? 1 s t a t i c i n l i n e T j u l i a l i m i t c ( const Q point ) 2 { 3 Q d = { 1. 0, 0., 0., 0. }, z = point ; 4 T z l ; 5 i n t i ; 6 f o r ( i =0; i<j u l i a i t e r ; i ++) { 7 mul(&z, &d ) ; mul c(&d, 2. 0 ) ; 8 9 sqr(&z ) ; add(&z, &j u l i a c ) ; 10 11 z l = len2(&z ) ; 12 i f ( z l > j u l i a i n f ) 13 break ; 14 } 15 z l = sqrtt ( z l ) ; 16 return 0. 5 z l logt ( z l ) / l e n (&d ) ; 17 }
Jak warto zoptymalizować Przepisując często wywoływane funkcje do assemblera. Ograniczając dokładność renderowanego obrazu. Wykorzystując procesor macierzowy umożliwiającym wielopotokowe przetwarzanie danych (np. graficzny). Wykorzystanie przetwarzania SIMD dostępnego na architekturze x86 SSE. Umożliwiając przetwarzanie danych na wielu procesorach jednocześnie.
Podział pracy na wątki Niezależność renderowania poszczególnych pikseli. Dzielenie ekranu na pionowe lub poziome paski, które są renderowane niezależnie przez wątki. Optymalizacja podziału ekranu + pozostałe dane.
A teraz... 1 Fraktale Julia Przykłady Wstęp teoretyczny Rendering za pomocą śledzenia promieni 2 Implementacja Profiling i testy Porównanie osiągnięć Demonstracja, kod i pytania
1 klatka, 1 wątek, 6 próbek Stanowisko: CPU: 2 x Intel Xeon X5365, 3GHz; Quad core GPU: nvidia Corporation Quadro NVS 290
Czas pracy w zależności od podziału na wątki
Renderowanie 200 klatek animacji 640x480
Różnice w implementacji IEEE754
A teraz... 1 Fraktale Julia Przykłady Wstęp teoretyczny Rendering za pomocą śledzenia promieni 2 Implementacja Profiling i testy Porównanie osiągnięć Demonstracja, kod i pytania
Podsumowanie Demonstracja programu. Analiza kodu źródłowego. Pytania?