Julia 4D - raytracing

Julia 4D - raytracing i przykładowa implementacja w asemblerze Tomasz bla Fortuna Politechnika Śląska Instytut Informatyki 27 sierpnia 2009 Tomasz ...
36 downloads 2 Views 1MB Size
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