Julia 4D - raytracing i przykładowa implementacja w asemblerze
Tomasz bla Fortuna Politechnika Śląska Instytut Informatyki
27 sierpnia 2009
Tomasz bla Fortuna
Julia 4D - raytracing
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
Tomasz bla Fortuna
Julia 4D - raytracing
2D — Kolor na podstawie szybkości ucieczki
Tomasz bla Fortuna
Julia 4D - raytracing
4D — Algorytm: maszerujące sześciany
Tomasz bla Fortuna
Julia 4D - raytracing
4D — Algorytm: śledzenie promieni
Tomasz bla Fortuna
Julia 4D - raytracing
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
Tomasz bla Fortuna
Julia 4D - raytracing
Julia dwuwymiarowa
Zbiór Julii tworzą punkty P(x, y) ∈ Z Takie, że ciąg: z0 = x + yi zn+1 = z2n + c nie dąży do nieskończoności. Parametr fraktala c = c1 + c2 i
Tomasz bla Fortuna
Julia 4D - raytracing
(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 zn+1 = z2n + c
(2)
nie dąży do nieskończoności. Parametr fraktala c = c1 + c2 i + c3 j + c4 k Więcej różnic można się spodziewać w definicji działań — mnożenia i dodawania. Tomasz bla Fortuna
Julia 4D - raytracing
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.
Tomasz bla Fortuna
Julia 4D - raytracing
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.
Tomasz bla Fortuna
Julia 4D - raytracing
Problem złożoności obliczeniowej
Mnożenie liczb zespolonych s = z ∗ d: sx = zx dx − zy dy sy = zy dx + zx dy Mnożenie kwaternionów s = z ∗ d: sx = zx dx − zy dy − zz dz − zw dw sy = zx dy + zy dx + zz dw − zw dz sz = zx dz − zy dw + zz dx + zw dy sw = zx dw + zy dz − zz dy + zw dx Jak widać ilość obliczeń potrzebnych dla Julii kwaternionów jest o wiele większa.
Tomasz bla Fortuna
Julia 4D - raytracing
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.
Tomasz bla Fortuna
Julia 4D - raytracing
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
Tomasz bla Fortuna
Julia 4D - raytracing
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
Tomasz bla Fortuna
Julia 4D - raytracing
Ulepszenie algorytmu „Unbounding volumes”, czyli estymacja odległości promienia od Julii.
Tomasz bla Fortuna
Julia 4D - raytracing
Jeszcze trochę matematyki
W celu estymacji dolnej granicy odległości punktu do Julii, prócz obliczania granicy ciągu zn musimy również oszacować granicę funkcji pochodnej. d0 = 1 + 0i + 0j + 0k (3) dn+1 = 2zn dn I ostatecznie obliczyć odległość ze wzoru: l=
Tomasz bla Fortuna
|z| log|z| 2|d|
Julia 4D - raytracing
(4)
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
Tomasz bla Fortuna
Julia 4D - raytracing
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
Tomasz bla Fortuna
Julia 4D - raytracing
Co warto zoptymalizować
Tomasz bla Fortuna
Julia 4D - raytracing
Czyli konkretnie co? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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 ) { Q d = {1.0 , 0. , 0. , 0.} , z = ∗ point ; T z l; int i ; f o r ( i =0; i < j u l i a i t e r ; i ++) { mul(&z , &d ) ; mul c(&d , 2 . 0 ) ; s q r (&z ) ; add(&z , &j u l i a c ) ; z l = l e n 2 (&z ) ; if ( z l > julia inf ) break ; } z l = sqrtT ( z l ) ; r e t u r n 0 . 5 ∗ z l ∗ logT ( z l ) / l e n (&d ) ; } Tomasz bla Fortuna
Julia 4D - raytracing
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.
Tomasz bla Fortuna
Julia 4D - raytracing
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.
Tomasz bla Fortuna
Julia 4D - raytracing
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
Tomasz bla Fortuna
Julia 4D - raytracing
1 klatka, 1 wątek, 6 próbek
Stanowisko: CPU: 2 x Intel Xeon X5365, 3GHz; Quad core GPU: nVidia Corporation Quadro NVS 290 Tomasz bla Fortuna
Julia 4D - raytracing
Czas pracy w zależności od podziału na wątki
Tomasz bla Fortuna
Julia 4D - raytracing
Renderowanie 200 klatek animacji 640x480
Tomasz bla Fortuna
Julia 4D - raytracing
Różnice w implementacji IEEE754
Tomasz bla Fortuna
Julia 4D - raytracing
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
Tomasz bla Fortuna
Julia 4D - raytracing
Podsumowanie
Demonstracja programu. Analiza kodu źródłowego. Pytania?
Tomasz bla Fortuna
Julia 4D - raytracing