Animowana grafika 3D Opracowanie: J. Kęsik kesik@cs.pollub.pl
Śledzenie promieni Ray tracing jest techniką renderowania będącą obecnie podstawą wielu algorytmów fotorealistycznych Po raz pierwszy wykorzystana w 1980 przez Turnera Whitteda Dzięki ray tracingowi można uzyskać szereg efektów oświetlenia (dokładne cienie i odbicia, przenikania przez powierzchnie przezroczyste, również ugięte) Znaczący wzrost jakości wizualnej za cenę poważnego zwielokrotnienia obliczeń
Śledzenie promieni Podstawowy pomysł to symulacja przebiegu promienia światła od źródła światła do obserwatora
Śledzenie promieni Dwa możliwe podejścia: Wyznaczanie promieni wychodzących ze źródła światła Nieefektywne obliczeniowo
Śledzenie promieni Dwa możliwe podejścia: Wyznaczanie promieni docierających do obserwatora Właściwy Ray-tracing
Śledzenie promieni Wyznaczanie pojedynczego promienia wymaga określenia czy ten promień przecina się z którymkolwiek z prymitywów (miliony) Podstawowy problem to stworzenie algorytmu, nie tylko umożliwiającego takie obliczenia ale wykonującego je w sposób najbardziej efektywny Śledzenie pojedynczego promienia jest skomplikowanym zadaniem a wykonanie obrazu wymaga prześledzenia ogromnej ilości promieni
Śledzenie promieni Real time? Quake3 : Raytraced (2005) 20 klatek 512x512 na sek. 36 GHz klaster 20 AMD 1800XP http://graphics.cs.unisb.de/~sidapohl/egoshooter/ W chwili obecnej pierwsze karty graficzne z potokami raytrace Gry z raytracingiem do końca roku
Śledzenie promieni Promień jest elementem geometrycznym, posiadającym punkt początkowy i kierunek Zapis promienia w 3D wymaga dwóch wektorów 3 wartościowych (3D) Wektor 3D źródła origin Wektor 3D kierunku direction (znormalizowany) class Ray { Vector3 Origin; Vector3 Direction; };
Śledzenie promieni Algorytm śledzenia rozpoczynamy wypuszczając promienie z kamery w kierunku sceny, każdy promień odpowiada jednemu pikselowi obrazu Kolejność generowania pikseli obrazu nie ma większego znaczenia. Dla każdego piksela obrazu wyznaczany jest promień podstawowy (primary ray)
Śledzenie promieni Źródłem promienia jest pozycja kamery Kierunek wyznaczany jest wg. zasady Wyznaczenie wektorów kierunków dla 4 rogów obrazu Aproksymacja kierunku promienia na podstawie położenia piksela
Śledzenie promieni Promień podstawowy jest następnie testowany na okoliczność przecięć z prymitywami sceny Jeżeli promień nie przecina się z niczym to piksel przyjmuje kolor tła W innym przypadku musimy wyznaczyć pierwszy z prymitywów, w który trafił promień (najbliższy kamerze) W miejscu przecięcia musimy wyznaczyć: pozycję, kolor, normalną, współrzędne tekstury i in. (interpolacja danych werteksów)
Śledzenie promieni Dane punktu przecięcia mogłyby być zapisane następująco: class Intersection { Vector3 Position; Vector3 Normal; Vector2 TexCoord; Material *Mat; float Distance; // odległość od źródła do przecięcia };
Śledzenie promieni Mając pozycję przecięcia możemy w tym miejscu obiektu wyznaczyć oświetlenie według dowolnego modelu (np. Phong) Efektem będzie uzyskanie koloru, jaki przyjmie piksel obrazu (w najprostszym przypadku kolor obiektu w punkcie przecięcia) Zakończenie algorytmu na tym etapie skutkowałoby obrazem nie lepszym (a czasem gorszym) niż uzyskanym tradycyjnymi metodami
Śledzenie promieni Śledzenie promieni zakończone na pierwszym etapie (model oświetlenia ambient)
Śledzenie promieni Wiele algorytmów śledzenia promieni przewiduje kontynuację poprzez wyznaczenie nowych promieni z punktu przecięcia promienia podstawowego Istnieje kilka typów promieni generowanych z miejsca przecięcia. Wszystkie te promienie określane są mianem promieni drugorzędnych (secondary rays)
Shadow rays Shadow rays odpowiadają za określenie, czy miejsce przecięcia jest oświetlone konkretnym światłem. Za ich pomocą można w stosunkowo łatwy sposób wyznaczyć cienie. Chcąc tego dokonać, wyznaczamy z punktu przecięcia promienie do każdego źródła światła znajdującego się po właściwej stronie prymitywu (kąt mniejszy niż 90 stopni do normalnej)
Shadow rays Światło z danego źródła będzie wzięte pod uwagę tylko wtedy, gdy promień do tego źródła nie przecina żadnego innego prymitywu. W takim przypadku w równaniu oświetlenia np. Phonga współczynniki intensywności diffuse i specular światła zacienionego przyjmą wartość = 0
Shadow rays W obliczeniu oświetlenia nie jest brane pod uwagę źródło 5 a źródła 1 i 4 mają wyzerowane współczynniki. 2 4 3 1 5
Shadow rays Shadow rays nie potrzebują znać parametrów punktu przecięcia z prymitywem, wystarczy parametr binarny wystąpienia przecięcia Dzięki temu generowane są nieco szybciej niż standardowe promienie Dobrą praktyką przy generowaniu shadow rays jest przesunięcie źródła promienia o nieznaczną odległość w kierunku normalnej prymitywu. Unika się w ten sposób potencjalnego błędu zaokrągleń mogącego spowodować wykrycie przecięcia własnej powierzchni
Shadow rays Shadow rays
Reflection rays Kolejną możliwością raytracingu jest generowanie dokładnych odbić od skomplikowanych powierzchni. Gdy promień podstawowy trafia w powierzchnię lustrzaną, tworzony jest promień odbicia. Promień ten, podobnie jak promień główny testowany jest na okoliczność przecięcia z obiektami sceny.
Reflection rays Promień odbicia wyznaczany jest na podstawie promienia głównego i wektora normalnego n r d r d 2 d nn
Reflection rays Gdy promień odbicia natrafi na obiekt, możliwe są dwa przypadki: 1. Powierzchnia obiektu nie jest lustrzana. 2. Powierzchnia obiektu jest lustrzana W 1 przypadku obliczany jest kolor w punkcie przecięcia (z uwzględnieniem shadow rays) W przypadku 2 rekursywnie generowany jest następny promień odbicia W przypadku wielu luster istnieje możliwość wystąpienia pętli nieskończonej. Zapobiega się temu przez ograniczenie głębokości rekursji do np. 10 poziomów
Reflection rays Powierzchnia obiektu jest lustrzana
Reflection rays W rzeczywistości rzadko mamy do czynienia z idealnymi lustrami Prawdziwe lustro odbije maksymalnie 95-98% światła padającego. Niektóre powierzchnie mogą powodować odbarwienia odbitego światła Taką sytuację symuluje się przez przemnażanie koloru światła padającego przez kolor lustra przy odbiciu od niego.
Reflection rays Możemy również symulować odbicia rozproszone. W takim przypadku dla punktu przecięcia obliczane jest pełne równanie oświetlenia, zawierające składnik rozproszenia jak i odbicia (należy uwzględnić również shadow rays dla tego punktu) a następnie dodawana wartość pochodząca od promienia odbicia (z wagami odpowiadającymi zachowaniu energii)
Transmission rays Ray tracing pozwala również na dokładne renderowanie ugięcia światła przy przechodzeniu przez przezroczyste powierzchnie. Gdy promień pada na powierzchnię przezroczystą, generowany jest nowy promień przenikania i analizowany dalej podobnie jak promień odbicia
Transmission rays Zgodnie z prawem Snella promień przenikający z jednego środowiska do drugiego, będzie odchylony od normalnej pod kątem wynikającym ze wzoru (n 1 sinθ 1 =n 2 sinθ 2 ), gdzie n 1 i n 2 są współczynnikami przenikania dla obu środowisk r z t d n n z 1 2 2 d d n 1 d n z n 2 n n d n 1 n 2 θ 1 n θ 2 z t r
Transmission rays Gdy światło przemieszczające się w środowisku o wysokim współczynniku przenikania trafia na materiał o niskim współczynniku przenikania pod ostrym kątem, następuje całkowite wewnętrzne odbicie. W takim przypadku nie jest generowany promień przenikania n d n 1 n 2 θ 1 z r
Transmission rays Odbicie całkowite można wykryć sprawdzając czy długość wektora z jest większa od 1. W tym przypadku wektora t nie można obliczyć (ujemna wartość pierwiastka) n z z t n n d d z 2 2 1 1 n n
Transmission rays Gdy światło trafia na powierzchnię przezroczystą, często oprócz przenikania widzimy odbicie. Dlatego natrafienie na taką powierzchnię powoduje wygenerowanie dwóch promieni (odbicia i przenikania), przeanalizowanie ich i połączenie uzyskanych kolorów. Wynikiem każdego z promieni jest kolor jaki widzi dany promień. W przypadku promieni głównych jest to kolor ostateczny piksela. W przypadku promieni pośrednich ich kolor jest połączony w wynikowy kolor piksela
Transmission rays Promień odbicia N Promień główny Promień przenikania
Transmission rays Równania Fresnela określają proporcje między światłem przenikającym (f t ) a odbitym (f r ). Uwzględniają równania dla światła spolaryzowanego horyzontalnie i wertykalnie (najczęściej uśrednione do jednej wartości) r t wert hor r wert hor f f r r f n n n n r n n n n r 1.0 ) ( 2 1 ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( 2 2 2 1 2 1 1 2 1 2 t n d n t n d n t n d n t n d n
Recursive Ray Tracing Klasyczny algorytm raytracingu uwzględnia cienie, odbicia, przenikania i nietypowe materiały Pojedynczy promień główny może wygenerować znaczną ilość promieni pośrednich w zależności od ilości źródeł światła i ułożenia obiektów Promienie te układają się w strukturę drzewiastą
Recursive Ray Tracing Przykład itd.
Recursive Ray Tracing Przykład
Ray Tracing Obrazy wyrenderowane klasyczną metodą raytracingu mogą zawierać cienie, dokładne odbicia pomiędzy obiektami i efekty przezroczystości Wadą jest wrażenie zbytniej ostrości uzyskanego obrazu (aliasing) z powodu ograniczenia do punktowych źródeł światła i idealnego odbicia od powierzchni. Dzieje się tak z powodu wykorzystywania pojedynczych promieni przy określaniu cieni, odbić i przenikań
Stohastic Ray Tracing Pewne wygładzenie krawędzi można uzyskać zaburzając kierunki promieni głównych tak aby kierowały się losowo w ramach obszaru zajmowanego przez piksel
Distribution Ray Tracing Rozproszone śledzenie promieni jest rozszerzeniem klasycznego podejścia zakłada wyprowadzenie w miejsce pojedynczego promienia wiązki kilku(nastu) promieni Jest to technika pozwalająca uzyskać bardzo naturalne efekty za cenę kolejnego, znacznego zwielokrotnienia obliczeń (setki a nawet tysiące promieni dla jednego piksela)
Distribution Ray Tracing Za pomocą takiego podejścia można uzyskać: Antyaliasing przy stosowaniu wiązki dla promieni głównych (dla pojedynczego piksela) Uwzględnienie powierzchni emitującej światło rozproszone cienie Rozmyte odbicia i przenikania Rozmycie zbliżeniowe (focus blur) Motion Blur
Distribution Ray Tracing Przykład itd. itd.
Distribution Ray Tracing
Distribution Ray Tracing
Distribution Ray Tracing
Przecięcia promieni Podstawowym elementem algorytmu raytracingu jest system określający w co trafił promień Typowa scena może zawierać miliony prymitywów Przymitywy te mogą być po prostu trójkątami albo być złożone w takim przypadku następuje teselacja (podzielenie siatki na trojkąty)
Przecięcia promieni Scena jest zbudowana z pewnej liczby obiektów składających się z prymitywów i/lub innych obiektów Aby obiekt był renderowalny, potrzebujemy procedury określającej przecięcie tego obiektu z promieniem. Dla różnych rodzajów obiektów można zdefiniowac inne procedury wyznaczania przecięcia.
Przecięcia promieni Promień - sfera Promień ma źródło w punkcie p i kierunek u a sfera ma środek w punkcie c i promień r p u c r
Przecięcia promieni Promień - sfera Promień jest zbiorem punktów p+αu, dla α 0 Znajdujemy punkt q, który jest punktem na linii promienia leżącym najbliżej środka sfery Linia qc musi być prostopadła do wektora u, czyli (q-c) u=0, lub (p+αu-c) u=0 Z tego możemy obliczyć: α=-(p-c) u, takie że q=p-((p-c) u)u p u q c
Przecięcia promieni Promień - sfera Następnie sprawdzamy czy q znajduje się wewnątrz sfery: q-c r Gdy q jest poza sferą promień jej nie przecina Gdy q jest w środku sfery poszukujemy punktu przecięcia z powierzchnią sfery Promien przebija powierzchnie w 2 punktach q1 i q2: p u q1 q c q 2
Przecięcia promieni Promień - sfera Pozycje przebić: q1=p+(α-a)u) gdzie a=sqrt(r2- q-c 2) q2=p+(α+a)u) Dla α-a 0, promień przebija sferę w punkcie q1, dla α-a<0 q1 znajduje się bliżej niż źródło promienia (jest ono wewnątrz sfery) q q1 2 Wtedy wybieramy q2 p u q c
Przecięcia promieni Promień powierzchnia płaska Powierzchnia taka jest zdefiniowana przez wektor normalny n i odległość d od środka układu wsp. Testując przecięcie obliczamy punkt q przecięcia promienia z płaszczyzną, by q leżało na płaszczyźnie: d=q n=p n+αu n więc α=(d-p n)/(u n) Jeżeli (u n)=0 to promień jest równoległy do płaszczyzny Dla α 0 promień przecina płaszczyznę
Przecięcia promieni Promień trójkąt Sprawdzenie przecięcia polega najpierw na sprawdzeniu przecięcia z płaszczyzną, na której leży trójkąt (można również sprawdzić kierunek trójkąta backface culling). Gdy punkt q przecięcia promienia z płaszczyzną, musimy sprawdzić czy leży on wewnątrz trójkąta
Przecięcia promieni Promień trójkąt p u v 2 v 0 q v 1
Przecięcia promieni Promień trójkąt Jedna z prostrzych obliczeniowo metod uwzględnia wsp. barycentryczne punktu q v 2 q' =q-v 0 e 1 =v 1 -v 0 e 2 =v 2 -v 0 α=(q' e 2) /(e 1 e 2 ) β=(q' e 1) /(e 1 e 2 ) β v 0 α v 1 q Gdy α<0, β<0 lub α+β >1 to punkt q znajduje się poza trójkątem
Przecięcia promieni Promień trójkąt Jedna z prostrzych obliczeniowo metod uwzględnia wsp. barycentryczne punktu q v 2 q' =q-v 0 e 1 =v 1 -v 0 e 2 =v 2 -v 0 α=(q' e 2) /(e 1 e 2 ) β=(q' e 1) /(e 1 e 2 ) β v 0 α v 1 q Gdy α<0, β<0 lub α+β >1 to punkt q znajduje się poza trójkątem
Metody akceleracji Przykład Obraz 1280x1024 - przeciętnie 10 promieni/piksel 1000 obiektów różnych typów 3 poziomy rekurencji ~39321600000 testów przecięć Dla prędkości 100 000 testów/s rendering potrwa ponad 100 dni! Akceleracja jest konieczna
Metody akceleracji Struktury akceleracji Są to zestawy danych grupujące obiekty w taki sposób, że można wydzielić z nich podgrupę obiektów, dla której będziemy sprawdzać przecięcie z promieniem Większość tego typu struktur bazuje na hierarchicznym podziale przestrzeni otaczającej grupę obiektów
Metody akceleracji Hierarchie przestrzeni otaczającej (omawiane częściowo wcześniej) Generalnie tworzymy otoczenie sceny (sfera, sześcian itp) a następnie dzielimy go na obszary tego samego typu (mniejsze sfery ) Testując promień sprawdzamy jego zderzenie z poszczególnymi poziomami otoczeń dochodząc do obszarów zawierających rzeczywiste prymitywy Taka metoda redukuje ilość testów z O(n) do O(log n), gdzie n jest ilością prymitywów
Metody akceleracji Wykorzystywane hierarchie to: Drzewa ósemkowe Drzewa KD Drzewa BSP Siatki jednolite Hierarchie sferowe Drzewa hierarchiczne
Metody akceleracji Wykorzystywane hierarchie to: Drzewa ósemkowe Podział wg. Zasady: Jeżeli sześcian zawiera więcej niż graniczna liczbę prymitywów jest dzielony na 8 jednakowych sześcianów Jest to struktura regularna, łatwa do automatycznego wyznaczenia tworzy jednak dużo niepotrzebnie rozdrobnionych przedziałów
Metody akceleracji Wykorzystywane hierarchie to: Drzewa KD Podział wg. Zasady: Jeżeli równoległobok zawiera więcej niż graniczna liczbę prymitywów jest dzielony na 2 niejednakowe równoległoboki. Podział następuje w arbitralnie wybranym punkcie Nieco lepiej dopasowuje się do nieregularnych kształtów dobrze spisuje się w raytracingu
Metody akceleracji Wykorzystywane hierarchie to: Drzewa BSP (binary space partitioning) Podział wg. Zasady: Jeżeli obszar zawiera więcej niż graniczną liczbę prymitywów jest dzielony na 2 niejednakowe części za pomocą płaszczyzny nie koniecznie równoległej do osi wsp. Lepsze wyniki niż drzewa KD bardziej skomplikowany algorytm doboru miejsca cięcia
Metody akceleracji Wykorzystywane hierarchie to: Siatki Jednolite Podział na jednolite obszary (np. sześciany) Zysk na szybkości metody, strata na zajętości pamięci dla skomplikowanych scen. Niewygodne przy dużym zróżnicowaniu wielkości obiektów rzadko stosowane w raytracingu (tylko szczególne przypadki)
Metody akceleracji Wykorzystywane hierarchie to: Hierarchie sferowe Sfera jest dzielona na podsfery obejmujące jej obszar sfery się nakładają. Łatwość wyznaczenia przecięcia za cenę redundancji Nie są zbyt popularne ze względu na trudności z automatycznym określeniem podziału
Metody akceleracji Wykorzystywane hierarchie to: Drzewa hierarchiczne Działają na podobnej zasadzie jak drzewa ósemkowe ale dopuszczają podział poszczególnych bloków na dowolnie dobrana ilość części Bardzo dobrze sprawdzają się w raytracingu
Metody akceleracji Rozwinięciem tych struktur jest wprowadzenie możliwości zagnieżdżania struktur różnego typu Np. jeden z sześcianów drzewa ósemkowego może zawierać wewnątrz strukturę drzewa BSP