Zagadnienia

10. Podstawowe modele oświetlenia i metody cieniowania

Aby słońce nie odbijało się w przyrządach celowniczych, należy je przedtem okopcić (przyrządy, nie słońce).

Anna

10.1. Oświetlenie

Modele oświetlenia opisane w tym miejscu są heurystyczne. Zamiast na podstawach fizycznych, opierają się one na wzorach dobranych tak, aby otrzymane obrazy ,,dobrze wyglądały”. Do pełnego realizmu (takiego jak na fotografii) modele te są niewystarczające, za to umożliwiają przeprowadzanie obliczeń w krótkim czasie.

10.1.1. Oświetlenie bezkierunkowe

Najprostszy model oświetlenia opiera się na założeniu, że przestrzeń, w której znajdują się rysowane obiekty, jest wypełniona światłem, które dochodzi ze wszystkich kierunków z taką samą intensywnością. Założenie to jest nieodległe od prawdy, jeśli scena jest umieszczona w pomieszczeniu o jasnych (np. białych) matowych ścianach i obiekty te są oświetlone przede wszystkim światłem odbitym od ścian. Wzór, który służy do obliczenia intensywności światła odbitego w stronę obserwatora (czyli do obliczenia koloru pikseli) ma postać

\displaystyle I\:=\: I_{{\mathrm{amb}}}\, a.

Czynnik I_{{\mathrm{amb}}} opisuje intensywność światła rozproszonego w otoczeniu i jest funkcją długości fali świetlnej. Czynnik a to albedo powierzchni przedmiotu, które zależy również od długości fali, a także od punktu powierzchni, która nie musi być jednobarwna. Często funkcje długości fali, takie jak I, I_{{\mathrm{amb}}} i a, są reprezentowane za pomocą trzech wartości odpowiedających barwie czerwonej, zielonej i niebieskiej. W niektórych zastosowaniach to nie wystarczy i trzeba użyć większej liczby próbek, tj. wartości funkcji opisującej oświetlenie dla więcej niż trzech długości fali świetlnej (nawet jeśli potem na monitorze obraz jest wyświetlany za pomocą luminoforów o trzech barwach).

Obrazy wykonane z użyciem tego modelu oświetlenia są całkowicie pozbawione plastyki; jeśli obiekty są jednobarwne (bez tekstury) to wyglądają jak plamy o stałym kolorze.

10.1.2. Odbicie lambertowskie

Wzór

\displaystyle I\:=\:\Bigl(I_{{\mathrm{amb}}}+\sum _{i}I_{{\mathrm{d}i}}v_{i}\max\bigl(0,\cos\measuredangle(\bm{n},\bm{L}_{i})\bigr)\Bigr)a

opisuje tzw. lambertowski model odbicia światła, nazwany tak od J.H. Lamberta, który zajmował się nim w 1760r. Oprócz światła rozproszonego w otoczeniu, o intensywności I_{{\mathrm{amb}}}, mamy tu pewną liczbę punktowych źródeł światła. Intensywność oświetlenia powierzchni przez i-te źródło jest opisana przez funkcję I_{{\mathrm{d}i}}, zależną od długości fali świetlnej, a także od odległości źródła światła od oświetlanego punktu, jeśli ta odległość jest skończona. Czynnik v_{i} jest równy 1 lub 0, co zależy od tego, czy między rozpatrywanym punktem powierzchni i źródłem światła jest jakiś obiekt rzucający cień, czy nie.

Wektor \bm{n} jest wektorem normalnym powierzchni, a wektor \bm{L}_{i} określa kierunek do źródła światła. Kosinus kąta między tymi wektorami jest obliczany przez obliczenie iloczynu skalarnego.

Lambertowski model oświetlenia opiera się na założeniu, że obiekty są idealnie matowe, a zatem światło odbite od powierzchni rozchodzi się we wszystkich kierunkach nad powierzchnią z taką samą intensywnością. Nie ma w tym modelu możliwości otrzymania na obrazie odblasków, które można zaobserwować na powierzchniach błyszczących.

10.1.3. Model Phonga

Odblaski są możliwe do uzyskania w modelu opracowanym w 1975r. przez Phong Buoi-Tuonga. Wzór używany do obliczenia intensywności światła odbitego od powierzchni w kierunku obserwatora w tym modelu ma postać

\displaystyle I\:=\:\Bigl(I_{{\mathrm{amb}}}+ \displaystyle\sum _{i}I_{{\mathrm{d}i}}v_{i}\max\bigl(0,\cos\measuredangle(\bm{n},\bm{L}_{i})\bigr)\Bigr)a+\sum _{i}I_{{\mathrm{d}i}}v_{i}W\bigl(\measuredangle(\bm{n},\bm{L}_{i})\bigr)\cos^{m}\measuredangle(\bm{R}_{i},\bm{v}).
Rys. 10.1. Wektory występujące w modelu odbicia światła Phonga.

Od wzoru opisującego model lambertowski wzór ten różni się obecnością składnika opisującego odblaski. Funkcja W uwzględnia zależność intensywności odblasku od kąta padania światła na powierzchnię i często przyjmowana jest tu funkcja stała. Intensywność światła w odblasku zależy od kąta między wektorem \bm{v} opisującym kierunek do obserwatora i wektorem \bm{R}_{i}, którego kierunek odpowiada odbiciu światła padającego z kierunku wektora \bm{L}_{i} w idealnym lustrze. Wektor \bm{R}_{i} można obliczyć na podstawie wzoru

\displaystyle\bm{R}_{i}\:=\: 2\langle{\bm{n}},{\bm{L}_{i}}\rangle\bm{n}-\bm{L}_{i},

do którego należy podstawić wektor jednostkowy \bm{n}. Kosinus kąta między wektorami \bm{v} i \bm{R}_{i} jest podnoszony do potęgi m. Liczba m zależy od ,,stopnia wypolerowania” powierzchni i jest tym większa im bardziej błyszcząca ma być ta powierzchnia. Przyjmowane w praktyce wartości parametru m są w granicach od kilku do kilkuset. Na ogół m jest liczbą całkowitą, ponieważ wtedy m-tą potęgę można obliczyć kosztem O(\log _{2}m) mnożeń.

Warto zwrócić uwagę na to, że albedo powierzchni (opisane przez funkcję a) nie wpływa na barwę światła w odblaskach. Rzeczywiście, jeśli przyjrzymy się odblaskom na powierzchni fizycznie istniejących przedmiotów, to najczęściej mają one barwę światła padającego na powierzchnię.

Zamiast obliczać wektor \bm{R}_{i}, a następnie \cos\measuredangle(\bm{R}_{i},\bm{v})=\langle{\bm{R}_{i}},{\bm{v}_{i}}\rangle/\bigl(\|\bm{R}_{i}\| _{2}\|\bm{v}\| _{2}\bigr), możemy wykonać rachunek przybliżony. Mamy \measuredangle(\bm{R}_{i},\bm{v})\approx 2\measuredangle(\bm{n},\bm{H}), gdzie

\displaystyle\bm{H}\:=\:\frac{\bm{L}_{i}+\bm{v}}{\|\bm{L}_{i}+\bm{v}\| _{2}}

(wektory \bm{L}_{i} oraz \bm{v} mają długość 1). Równość zachodzi w przypadku, gdy wektory \bm{L}_{i}, \bm{n} i \bm{v} leżą w jednej płaszczyźnie. Następnie mamy przybliżoną równość

\displaystyle\cos^{m}\measuredangle(\bm{R}_{i},\bm{v})\:\approx\:\langle{\bm{n}},{\bm{H}}\rangle^{{2m}}.

W implementacjach często stosuje się stablicowane z dostatecznie małym krokiem wartości funkcji f(t)=t^{{2m}}, co znacznie przyspiesza obliczenia (kosztem pamięci).

Rys. 10.2. Porównanie odbicia światła Lamberta i Phonga.

Należy podkreślić, że model Phonga jest czysto empiryczny, tj. nie ma on podstaw fizycznych, ale dobierając odpowiednio jego parametry, można osiągnąć dosyć dobre przybliżenie wyglądu różnych materiałów na obrazie. Najczęściej obiekty narysowane za pomocą tego modelu mają wygląd nieco ,,plastikowy”. Jest to spowodowane przez dość dobre przybliżenie skutków odbicia światła od przedmiotów wykonanych z plastiku.

10.2. Cieniowanie

Cieniowanie jest sposobem obliczania barwy pikseli należących do zrasteryzowanego wielokąta (najczęściej trójkąta) na podstawie informacji związanej z jego wierzchołkami. Może ono mieć na celu stworzenie złudzenia, że obraz zbioru trójkątów przedstawia gładką powierzchnię krzywoliniową.

10.2.1. Cieniowanie stałe

Najprostsza metoda cieniowania polega na obliczeniu barwy jednego piksela i nadaniu tej samej wartości wszystkim pikselom, które należą do obrazu np. danego wielokąta. Metoda ta jest najprostsza i najszybsza, ale daje obrazy z wyraźnie widocznymi wspólnymi krawędziami ścian, co w sytuacji gdy te ściany stanowią przybliżenie gładkiej powierzchni zakrzywionej jest niepożądane (to jest tzw. efekt Macha).

10.2.2. Cieniowanie Gourauda

Metoda cieniowania Gourauda jest stosowana najczęściej do trójkątów — inne wielokąty są w celu cieniowania triangulowane. Metoda ta polega na obliczeniu (przy użyciu dowolnego modelu oświetlenia) barw wierzchołków trójkąta, a następnie barwa każdego piksela jest obliczana w drodze interpolacji liniowej barw wierzchołków (wygodnie jest to opisać przy użyciu współrzędnych barycentrycznych na płaszczyźnie).

Zastosowanie cieniowania metodą Gourauda powoduje usunięcie lub znaczne osłabienie efektu Macha — barwa pikseli w pobliżu wspólnej krawędzi trójkątów zmienia się w sposób ciągły — ale zawodzi w przypadku, gdy zastosowany model oświetlenia uwzględnia odbicie zwierciadlane (tak jak model Phonga). Można bowiem zgubić odblaski, które leżą wewnątrz obrazu trójkąta, a także otrzymać kanciaste odblaski na powierzchni, która ma wyglądać jak gładka.

10.2.3. Cieniowanie Phonga

W metodzie cieniowania opracowanej przez Phong Buoi-Tuonga określamy we wszystkich wierzchołkach trójkątnych ścian wektor normalny powierzchni, którą chcemy przybliżać za pomocą tych ścian. Następnie, dla każdego piksela, obliczamy ,,wektor normalny” powierzchni w drodze interpolacji wektorów normalnych w narożnikach i po unormowaniu podstawiamy go do wzoru odpowiadającego wybranemu modelowi oświetlenia. Metoda ta jest bardzo skuteczna, ale wymaga znacznie więcej obliczeń niż cieniowanie Gourauda.

Rys. 10.3. Interpolacja wektora normalnego w cieniowaniu Phonga.

,,Wektor normalny” powierzchni w wierzchołkach trójkąta może być przyjmowany na różne sposoby. Jeśli trójkąty przybliżają powierzchnię znaną (np. płat Béziera), to można obliczyć wektor normalny tej powierzchni w punkcie, który odpowiada wierzchołkowi. Jeśli trójkąty przybliżają powierzchnię daną w postaci niejawnej, tj. równaniem f(x,y,z)=0, to najlepiej jest (jeśli to możliwe) obliczyć gradient funkcji f. Jeśli dysponujemy tylko trójkątami, to można przyjąć wektor, który jest średnią arytmetyczną wektorów normalnych wszystkich trójkątów, do których należy ten wierzchołek. Zwróćmy uwagę, że wyświetlając wielokąt w OpenGL-u, możemy dla każdego wierzchołka podać inny ,,wektor normalny” (o dowolnym kierunku).

Cieniowanie jest najczęściej realizowane za pomocą sprzętu, np. podsystemu graficznego stacji roboczej, albo akceleratora w pececie. Metoda cieniowania jest wtedy ukryta przed programem i różna (Gouraud albo Phong) w różnych urządzeniach realizujących ten sam interfejs programisty (np. OpenGL). W tanim sprzęcie do użytku domowego cieniowanie Phonga to jeszcze rzadkość, choć sytuacja zmienia się. Nowe akceleratory graficzne mogą wykonywać programy wprowadzone przez aplikację. W zamierzeniu umożliwia to stosowanie różnych sposobów przetwarzania tekstury nakładanej na wyświetlane powierzchnie. W szczególności można używać własnych procedur cieniowania, a także nakładać opisane dalej tekstury odkształceń.

Rys. 10.4. Sześcian cieniowany metodą Phonga.

10.2.4. Tekstura odkształceń

W każdym modelu oświetlenia uwzględniającym kierunek padania światła na powierzchnię zasadniczą rolę odgrywa wektor normalny, i jak wynika z rozważań nad cieniowaniem Phonga, kolorując obraz powierzchni można trochę oszukiwać zmysł wzroku, wybierając wektor niezupełnie normalny. Stąd już tylko krok do określania wektora normalnego za pomocą arbitralnej funkcji, dzięki czemu daje się symulować niewielkie odkształcenia i chropowatość powierzchni.

Rys. 10.5. Tekstura odkształceń.

Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.

Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.

Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.