8. Oświetlenie globalne

8.2. Ray tracing, czyli śledzenie promieni

Metoda śledzenia promieni jest uogólnieniem metody rzucania promieni. Również i tu promienie prowadzone są od obserwatora przez każdy piksel ekranu, ale śledzenie ich biegu nie kończy się w momencie przebicia pierwszego napotkanego po drodze obiektu, tylko trwa nadal, bo promień odbity od danego obiektu może trafić w kolejny obiekt, odbić się znowu itd. Dzięki odwrotnemu śledzeniu promieni, od oka do źródła światła, a nie ze źródła światła do oka, rozpatrywane są tylko te promienie światła, które docierają do oka odbiorcy i tworzą obraz na ekranie komputera. Unika się w ten sposób niemożliwej do zrealizowania w praktyce analizy wszystkich promieni wychodzących ze źródła światła, z których tylko bardzo nieliczne docierają do obserwatora.

Rozpatrzmy działanie algorytmu po kolei.

Pierwszym etapem w algorytmie śledzenia promieni jest generacja promieni w punkcie obserwacji i poprowadzenie ich przez każdy piksel ekranu w kierunku sceny, analogicznie jak w metodzie ray casting. Te promienie są nazywane promieniami pierwotnymi (ang.: primary ray).

 

Rysunek 57. Generowanie promieni pierwotnych.

 

Kolejnym etapem, podobnie jak w metodzie poprzedniej, jest znajdowanie punktów zderzenia się promienia z obiektami na scenie - testowany jest każdy obiekt. W przypadku gdy do przecięcia nie dochodzi, promień wychodzi poza scenę i piksel na ekranie przybiera kolor tła. Jeżeli zaś przecięcie nastąpi, spośród możliwych punktów przecięcia wybierany jest punkt najbliższy obserwatorowi. W miejscu zderzenia się promienia z obiektem powstają promienie wtórne (ang.: secondary rays), które w zależności od właściwości obiektu (przezroczystość, współczynnik odbicia) biegną dalej zgodnie z zachowaniem praw odbicia i załamania.

Promienie wtórne traktowane są jak promienie pierwotne: również są testowane z innymi obiektami znajdującymi się na scenie i podobnie jak promienie pierwotne mogą być źródłem kolejnych promieni wtórnych. Proces generowania promieni wtórnych trwa, dopóki wszystkie promienie nie wyjdą poza scenę (trafią w umowne tło) lub algorytm nie osiągnie odpowiedniego poziomu rekurencji (określonego uprzednio w algorytmie). Ta metoda, polegająca na tworzeniu i śledzeniu promieni wtórnych, jest nazywana rekursywną metodą śledzenia promieni (ang.: recursive raytracing), lecz w skrócie mówi się o niej po prostu jako o metodzie śledzenia promieni.

 

Rysunek 58. Promienie pierwotne i wtórne.

 

Rekurencję zawartą w algorytmie śledzenia promieni ilustruje poniższy schemat algorytmu: funkcja TraceRay wywołuje samą siebie aż do osiągnięcia maksymalnej głębokości rekurencji. Pokazano tu najważniejsze kroki obliczeniowe metody:

function TraceRay(R: ray; depth: integer): kolor;
...
begin 
wyznacz P - najbliższy punkt przecięcia promienia R z obiektem; 
Jeśli nie ma żadnego punktu przebicia:
TraceRay :=kolor_tła 
else begin 
  oblicz color jako światło otoczenia; 
  znajdź wersor normalny do powierzchni obiektu w tym punkcie; 
  oblicz lokalne oświetlenie punktu P przez wszystkie źródła światła i dodaj do color; 

  if depth<maxDepth then begin   {depth określa głębokość rekurencji} 
    ...   
    ... 
    {jeśli obiekt jest choćby częściowo lustrzany, wykonaj poniższe operacje:} 
    wyznacz R_ray jako promień odbity w punkcie P;
    R_color:= TraceRay(R_ray, depth+1); 
    color:=color + ksR_color;
    ...
    {jeśli obiekt jest choćby częściowo przeroczysty, wykonaj poniższe operacje:} 
    wyznacz T_ray jako promień załamany w punkcie P;
    T_color:= TraceRay(T_ray, depth+1);
    color:=color + ktT_color; 
    ...
 end; 
 TraceRay :=color;
end; 

Zatem oświetlenie obiektu w danym punkcie pochodzi nie tylko z lokalnego oświetlenia tego punktu przez źródła światła (które jak pamiętamy z poprzedniego rozdziału wyznacza się jako odbicie rozproszone i lustrzane), ale dodaje się do niego oświetlenie pochodzące z promieni wtórnych, które znowu jest sumą oświetlenia lokalnego i oświetlenia pochodzącego z kolejnych promieni wtórnych itd. W ten sposób uzyskuje się efekty wzajemnych, wielokrotnych odbić obiektów, czego nie da się uzyskać bez rekurencyjnego algorytmu.

 

Przy obliczaniu oświetlenia lokalnego w danym punkcie prowadzi się promienie testujące i wyznacza ich wersory do każdego źródła światła. Jeśli promień taki natrafi na obiekt całkowicie nieprzezroczysty, dane żródło światła nie bierze udziału w obliczeniach oświetlenia lokalnego. Jeśli natrafi na obiekt cżęściowo przezroczysty, udział danego źródła światła w lokalnym oświetleniu powierzchni jest odpowiednio zmniejszany. W ten sposób metoda śledzenia promieni prowadzi do wyznaczania cieni na obiektach, wynikających z zasłaniania ich przez inne obiekty.

Ostatecznie więc uzyskuje się więc tą metodą efektowne obrazy obiektów o różnym stopniu przezroczystości, wzajemnie i wielokrotnie się w sobie odbijających, wraz z cieniami, które na siebie nawzajem rzucają:

Przykład 1 - seria ilustracji pokazująca zmianę obrazu wraz ze zwiększeniem poziomu rekurencji

 

Metoda śledzenia promieni pozwala też na rendering obiektów CSG: przy przecięciach promienia śledzącego z obiektem CSG problem operacji logicznych redukuje się do jednego wymiaru. Ray tracing możliwia też nakładanie tekstur i odwzorowywanie otoczenia na powierzchni, a także dodawanie do sceny efektów specjalnych, takich jak tłumienie atmosferyczne, mgła i wiele innych. Pozwala wprowadzić różnego rodzaju wirtualne kamery (sferyczne, typu "rybie oko") i rozmaite źródła światła (reflektory, walcowe, powierzchniowe). Modyfikacje i uzupełnienia wprowadzane do algorytmu pozwalają nie tylko na generowanie ostrych cieni, ale i tych tzw. "miękkich", rozmytych, bardziej realistycznych.

Rekurencyjny proces zachodzący podczas śledzenia promieni można zilustrować tzw. drzewem promieni, czyli schematem pokazującym drogę promienia i jego późniejsze rozgałęzienia, aż do końca procesu rekurencyjnego. Poniżej schematy dla obiektów przezroczystych i nieprzezroczystych.

Rysunek 59. Śledzenie promieni dla obiektów nieprzezroczystych; obok - drzewo promieni; na żółto zaznaczono promienie testujące, skierowane do źródła światła.

 

Rysunek 60, Śledzenie promieni dla obiektów przezroczystych; obok - drzewo promieni; na żółto zaznaczono promienie testujące, skierowane do źródła światła.

 

 

7.2.1 Metody przyspieszania obliczeń

Z metodą śledzenia promieni w sposób naturalny związane są zagadnienia zwiększania szybkości obliczeń. Najbardziej klasyczne z nich (poza wspomnianą juz wcześniej pracą wieloprocesorową) są następujące:

  • zwiększanie efektywności algorytmów przecięcia obiektów (tych o złożonej reprezentacji) z promieniem;
  • metoda brył ograniczających (ang. bounding volumes) - skomplikowane obiekty otacza się prostymi otoczkami (np. sferami), których przecięcia z promieniem można łatwo obliczyć; jeżeli promień nie przetnie kształtu otaczającego obiekt, to możemy jednoznacznie stwierdzić, że sam obiekt również nie został przez ten promień przecięty. Dopiero kiedy obiekt otaczający zostanie trafiony przez promień, należy sprawdzić, czy nastąpiło przecięcie z obiektem właściwym. Prawdopodobieństwo, że obiekt zostanie trafiony przez promień, zależy od tego, jak ściśle jest on otoczony przez otoczkę ograniczającą. Przypadkiem szczególnym są powierzchnie NURBS, dla których znalezienie otoczek wypukłych wykonuje się w prosty sposób na podstawie siatki wierzchołków kontrolnych.

  Metodę tę można dodatkowo usprawnić wprowadzając hierarchię obiektów; obiekty leżące blisko siebie tworzą grupę obiektów, mającą wspólną otoczkę ograniczającą.

Rysunek 61.a) zastosowanie otoczek ograniczających; b) zastosowanie hierarchii obiektów i ich otoczek.

  • metoda podziału przestrzeni sceny - tworzenie struktury złożonej z voxeli (czyli "trójwymiarowych pikseli", będących elementami przestrzeni 3D). Scena może być podzielona w sposób równomierny, ale bardziej efektywny jest adaptacyjny podział, który prowadzi się tak, by każdy voxel przecinał mniej niż pewną maksymalną liczbę obiektów sceny.

Rysunek 62. Metoda podziału przestrzeni sceny: a) podział równomierny; b) podział przystosowany do sceny.

 

Metoda ray tracing należy do grupy metod tzw. fotorealistycznego renderingu. Przy dzisiejszych szybkościach komputerów pozwala na uzyskanie obrazów najwyższej jakości w czasie zbliżonym do rzeczywistego. Dlatego obecnie stosuje się ją nie tylko w systemach grafiki komputerowej, ale i w systemach CAD/CAM do realistycznego obrazowania zaprojektowanych modeli.

 

Zupełnie inną filozofię rozwiązania prezentuje POV-Ray, program - podobnie jak Blender - z grupy Freeware i Open Source, generujący obrazy w oparciu o metodę śledzenia promieni i scenę zapisaną w języku skryptowym. Ze względu na całkowicie odmienne podejście do modelowania sceny nie będziemy się nim tutaj zajmować, ale jest on ze wszech miar wart polecenia do samodzielnej pracy. Przykłady obrazów wygenerowanych przy jego użyciu były już zamieszczone w niniejszym rozdziale, a także w poprzedniej lekcji, zaś kolejne znajdują się w rozdziale o animacji.

Na zakończenie - animacja ilustrująca metodę śledzenia promieni; nie jest ona dokładnym odwzorowaniem działania raytracera - ilustruje działanie algorytmu przy najprostszych założeniach i jednym poziomie rekurencji.

 

Rys. 11.27. Animacja ilustrująca metodę śledzenia promieni. Osobno pokazano przypadki: 
a) gdy promień testujący nie napotyka obiektu na swej drodze; 
b) gdy napotyka obiekt matowy, o małym współczynniku odbicia lustrzanego - promienie wtórne mają małe znaczenie; 
c) gdy napotyka obiekt lustrzany - udział promieni wtórnych jest bardzo istotny;
d) gdy napotyka obiekt przezroczysty - promienie wtórne wynikają z praw załamania światła i odbicia wewnętrznego.

Obsługa animacji:

- strzałka w lewo - odtwarzanie

- podwójna kreska - pauza

- podwójna strzałka - przeskok do końca animacji