1. Oświetlenie

Transkrypt

1. Oświetlenie
1. Oświetlenie
Rzeczywiste światło emitowane przez określone źródło, odbijane jest na milionach
powierzchni obiektów, po czym dociera do naszych oczu powodując, że widzimy dane
przedmioty. Światło padające na określoną powierzchnię ulega obiciu (powierzchnie gładkie),
powodując oświetlenie kolejnych przedmiotów lub rozproszeniu (powierzchnie matowe,
chropowate) dając w efekcie stopniowy zanik padającego światła. Pełne odwzorowanie
wspomnianych mechanizmów, rządzących prawami oświetlenia jest nie możliwe, choćby ze
względu na stopień złożoności występujących zjawisk. W związku z powyższym w grafice
komputerowej stosuje się szereg mechanizmów oświetlania i cieniowania, bazujących na
pewnego rodzaju uproszczeniach i trickach. Proste modele oświetlenia wyznaczają wartość
światła docierającą do jednego punktu na powierzchni ścianki bryły (cieniowanie płaskie ang.
flat shading ). Bardziej skomplikowany model (cieniowanie Gouraud’a) zakłada wyznaczenie
wartości światła docierającego do ścianki na podstawie interpolacji intensywności światła
wyznaczonego w wierzchołkach ścianki. Model ten jest powszechnie stosowany w systemach
graficznych takich jak OpenGL i Direct3D, ponieważ daje się w pełni zaimplementować w
sprzętowych akceleratorach graficznych. Ponadto w modelu tym można zrealizować mechanizmy odbicia rozproszonego (odbicie lambertowskie) oraz odbicia lustrzanego. Niestety
model ten daje interesujące efekty dla brył składających się z możliwe dużej ilości ścianek
(chcąc oświetlić dość realnie sześcian należy każdą z jego ścian podzielić na szereg mniejszych). Kolejny model oświetlenia, zaproponowany przez Phong’a Bui-Tuong’a, pozwala
wyznaczyć wartość światła docierającą do każdego z rysowanych pikseli. Metoda ta jest dość
dokładna i pozwala na realizację np. nierówności powierzchni (ang. bump mapping). Główną
ideą cieniowania Phonga jest interpolacja wektorów normalnych związanych ze ścianką i wyznaczanie wartości światła, dla każdego z rysowanych punktów. Można zauważyć, że zwiększając liczbę ścianek bryły na tyle, że rysowany trójkąt ma wielkość nie wiele przekraczającą
pojedynczy punkt praktycznie uzyskujemy przejście z modelu cieniowania Gouraud’a do modelu Phong’a.
1.1. Materiały i powierzchnie
Dla zwiększenia realności rysowanych obiektów należy wprowadzić możliwość definiowania właściwości ich powierzchni: kolor, stopień chropowatości, ilość odbijanego światła, poziom światła emitowanego. W tym celu posłużymy pojęciem materiału, powszechnie
stosowanym w grafice komputerowej. W naszym przypadku do opisu cech materiału zdefiniujemy następującą strukturę
struct Material3D
{
Color3D ambient;
Color3D diffuse;
Color3D specular;
Color3D emissive;
float
power;
};
Koncepcja stosowania materiałów zakłada podział obiektu na pewne części zwane powierzchniami (ang. surface) i przypisaniu im odpowiednio zdefiniowanych materiałów. Podczas rysowania bryły, algorytmy wyznaczające oświetlenie analizują przynależność każdej ze
ścianek do jeden z powierzchni i korzystają z materiału do niej przypisanego. Można w tym
miejscu zadać pytanie, dla czego właściwości powierzchni nie są przypisane bezpośrednio do
każdego z wierzchołków bryły? Odpowiedz jest bardzo prosta, niektóre z wierzchołków są
wspólne dla różnych powierzchni i powstałby problem z określeniem koloru, przykładem
może być sześcian składający się z 8 wierzchołków. Jedyną metodą do narysowania każdej ze
ścian sześcianu w innym kolorze jest właśnie użycie materiałów. Poszczególne pola wchodzące w skład struktury materiału wyjaśnione zostaną w dalszej części.
1.2. Ogólne równanie oświetlenia
W modelu oświetlenia rozważanym w dalszej części rozdziału zakładamy, że całkowite natężenie światła będzie sumą: światła otaczającego, światła rozpraszanego na powierzchni obiektów (odbicie lambertowskie) oraz światła odbijanego przez powierzchnie obiektów (odbicie
zwierciadlane). Dodatkowo założymy możliwość emisji światła przez obiekty. Biorąc pod
uwagę wszystkie powyższe założenia ogólne równanie oświetlenia przyjmuje ostatecznie
postać:
I = Ambient + Diffuse + Specular + Emissive
I jest to wartość natężenia światła występującego w scenie, ambient składowa światła otaczającego, diffuse składowa światła będącego wynikiem odbicia rozproszonego, specular składowa światła będącego wynikiem obicia lustrzanego, emissive składowa światła emitowanego
przez poszczególne materiały (obiekty lub ich fragmenty). Należy dodać, że równanie to jak i
wszystkie podane poniżej występują w wersji dla światła monochromatycznego. W przypadku świateł kolorowych wszystkie z podanych wzorów należy zastosować oddzielnie do każdej
ze składowych (RGB) tj. czerwonej, zielonej i niebieskiej.
1.3. Światło otaczające (ambient light)
Tego typu światło nie ma odniesienia do rzeczywistych źródeł światła i używane jest
do oświetlenia wszystkich obiektów w scenie z jednakowym natężeniem i przy zachowaniu
tego samego koloru. Światła otaczającego, najczęściej używa się do wstępnego ustalenia jasności sceny, ze względu na to, że uproszczony model oświetlenia nie uwzględnia wszystkich
możliwych dróg, którymi światło może dotrzeć do obiektu. Przykładem ilustrującym taką
sytuację może być oświetlenie latarką lub innym źródłem o stosunkowo wąskim snopie światła przedmiotu o lustrzanej powierzchni i znajdującym się. w ciemnym pokoju. W rzeczywistości część światła odbitego od tego przedmiotu posłuży do oświetlenia innych przedmiotów.
Natomiast w modelu oświetlenia, który będziemy rozpatrywać na powierzchni obiektu pojawią się widoczne rozbłyski, lecz w żaden sposób nie będą oddziaływały one na pozostałe
obiekty. Światło otaczające można opisać wzorem:
Ambient = M a ⋅ ∑ Lai
i
gdzie Ma składowa ambient materiału – parametr ten określa w jakim stopniu składowa światła otaczającego wpływa bezpośrednio na daną powierzchnię, Lai składowa ambient i-tego,
światła, określająca intensywność światła otoczenia generowanego przez i-te światło. Światło
otaczające może być definiowane jako składowa poszczególnych świateł lub jako światło
definiowane globalnie.
Ze względu na prostotę realizacji, jak najbardziej wskazane jest, aby tworzenie programowego modelu oświetlenia rozpocząć właśnie od tego typu światła.
Rys. 1 Obiekt oświetlony światłem otoczenia
1.3 Odbicie rozproszone
Przedstawione wyżej światło otaczające oświetla każdy obiekt z jednakową intensywnością w każdej z części bryły i daje w rezultacie mało realne efekty. Odbicie omawiane w
tym punkcie pozwala na zróżnicowanie oświetlenia obiektu w zależności od kierunku i umiejscowienia światła. Powierzchnie matowe, bez połysku charakteryzują się odbiciem rozproszonym i wydają się równie jasne ze wszystkich stron obserwacji. W zasadzie dla danej powierzchni jasność zależy tylko od kąta między kierunkiem wektora, poprowadzonego od
punktu zaczepienia normalnej do światła i normalną do powierzchni oświetlanej.
N
L
θ
Rys 2. Odbicie rozproszone. L wektor poprowadzony od punktu na powierzchni do światła, N normalna do
powierzchni.
Ogólnie można powiedzieć, że równanie oświetlenia dla odbicia rozproszonego ma postać
Diffuse = M d ⋅ Ld ⋅ cos(θ )
gdzie Ld natężenie światła padającego na powierzchnię, Md współczynnik Diffuse materiału,
określający zdolność powierzchni do rozpraszania światła.
Stosując znormalizowane wektory N i L powyższe równanie można zapisać w postaci
(
Diffuse = M d ⋅ Ld ⋅ N ⋅ L
(
)
(
)
)
gdzie N ⋅ L jest iloczynem skalarnym wektorów N ⋅ L = N x ⋅ Lx + N y ⋅ L y + N z ⋅ Lz
Równanie to posiada pewien poważny błąd, otóż nie uwzględnia odległości światła od
obiektu i jego tłumienia w atmosferze. W zasadzie równanie powyższe nadaje się do opisu
światła kierunkowego, czyli takiego, które posiada intensywność oraz kierunek L natomiast o
jego punkcie położenia można powiedzieć, że leży w nieskończoności. Tego typu światło
zostało zdefiniowane w Direct3D, gdyż daje stosunkowo dobre efekty wizualne przy niespecjalnie dużym nakładzie obliczeń. Definiując współczynnik tłumienia1 światła zakłada się, że
strumień światła docierający do powierzchni maleje proporcjonalnie do kwadratu odległości
światła od obiektu.
Attenuation =
1
d2
Niestety, stosowanie tego wzoru w praktyce nie daje dostatecznie dobrych efektów, ponieważ
dla małych odległości powyższy wzór ulega szybkim zmianom, natomiast przy dużych odległościach zmienia się nieznacznie. W celu poprawienia wspomnianych efektów przyjmuje się

1
Attenuation = min
2
 c0 + c1 ⋅ d + c 2 ⋅ d

,1

Znając podstawowe założenia równanie oświetlenia dla odbicia rozproszonego można zapisać
w następujący sposób:
(
)
Diffuse = ∑ M d ⋅ Ldi ⋅ N ⋅ Ldiri ⋅ Attenuation ⋅ Spot
i
gdzie Md składowa diffuse materiału, określająca zdolności rozpraszania światła na powierzchni; Ldi składowa diffuse (intensywność) i-tego światła; N normalna do powierzchni;
Ldiri wektor kierunku i-tego światła; Attenuation współczynnik tłumienia światła; Spot
współczynnik ten pozwala na definicje świateł innych niż punktowe, sposób jego wyznaczania przedstawiony jest w dalszej części. W naszych dotychczasowych rozważaniach nalezy
przyjąć Spot=1.0.
1
Tłumienie - ang. attenuation.
Rys. 3 Obiekt oświetlony światłem będącym wynikiem odbicia rozproszonego
1.4 Odbicie zwierciadlane
Lustrzane odbicie można zauważyć na każdej błyszczącej powierzchni. Rozświetlenie
widoczne na takiej powierzchni jest wynikiem odbicia zwierciadlanego (biała intensywnie
świecąca część obiektu) natomiast światło odbite od reszty obiektu jest wynikiem odbicia
rozproszonego. Obserwując tego typu obiekt można zauważyć, że wraz z ruchem naszej głowy porusza się rozświetlenie na obiekcie. Dzieje się tak, ponieważ błyszczące powierzchnie
odbijają światło niejednakowo, w zależności od kierunku obserwacji. Na idealnej lustrzanej
powierzchni światło odbije się tylko w kierunku odbicia R , będącym lustrzanym odbiciem
L , względem N . Dlatego obserwator może widzieć odbite zwierciadlanie światło tylko wtedy, gdy kąt α na rys. 5 jest bliski zeru. Kat α jest katem między wektorem poprowadzonym
od ścianki do punktu umiejscowienia obserwatora ( V ), a wektorem odbicia R
N
L
R
θ
θ
α
V
Rys. 5 Odbicie zwierciadlane.
Phong Bui-Toung opracował model oświetlenia dla nieidealnych obiektów odbijających, w
modelu tym zakłada się, że maksimum odbicia zwierciadlanego występuje dla kąta α równego
zero i szybko spada wraz ze wzrostem wartości kąta. Wspomniany szybki spadek wartości
odbicia można aproksymować za pomocą cos n α . Typowo n zmienia się od 1 do wartości
kilkuset i parametr ten reprezentowany jest przez składową power struktury opisującej właściwości materiału (Material3D). Można zauważyć, że dla idealnego zwierciadła n powinno być równe nieskończoności, czyli odbicie powinno następować gdy kąt między wektorem obserwacji V , a wektorem odbicia R równy zero. Poniżej zamieszczone są wykresy
funkcji cos n α dla kilku, różnych wartości parametru n.
1
1
1
1
0.9
0.9
0.9
0.9
0.8
0.8
0.8
0.8
0.7
0.7
0.7
0.7
0.6
0.6
0.6
0.6
0.5
0.5
0.5
0.5
0.4
0.4
0.4
0.4
0.3
0.3
0.3
0.3
0.2
0.2
0.2
0.1
0.1
0.1
0
0
10
20
30
40
50
cos α
60
70
80
90
0
0
10
20
30
40
50
60
70
80
0
90
0.2
0.1
0
cos 2 α
10
20
30
40
50
60
70
80
90
0
0
cos 8 α
Rys. 6 Wykresy funkcji cos
n
α
10
20
30
40
50
60
70
80
90
cos 64 α
dla różnych wartości parametru n.
Stosunek natężenia światła odbijanego zwierciadlanie do natężenia światła padającego może
również zależeć od kata padania θ. Oznaczając to jako W(θ), to równanie oświetlenia dla składowej światła specular przybiera następującą postać
Specular = Attenuation ⋅ Ls ⋅ W (θ ) ⋅ cos n α
Jeżeli wektory odbicia R i obserwacji V są znormalizowane to cos α = R ⋅ V . W(θ) na ogół
ma wartość stałą i w naszym przypadku określany jest przez składową specular materiału
oraz każdego ze świateł. Mając na uwadze powyższe spostrzeżenia równanie oświetlenia dla
odbicia lustrzanego można ostatecznie zapisać
(
Specular = M s ⋅ ∑ Lsi ⋅ R ⋅ V
)
n
⋅ Attenuation ⋅ Spot
i
gdzie Ms składowa specular materiału; Lsi składowa specular i-tego światła; parametry Attenuation i Spot są identyczne jak dla odbicia rozproszonego. n jest określane przy pomocy
składowej power materiału.
Wektor odbicia R wyznacza się jako zwierciadlane odbicie wektora L względem N . Korzystając z poniższego rysunku można zapisać U = N ⋅ cosθ ; R = U + S
N
L
R
S
S
U
θ θ
Rys. 7 Wyznaczanie wektora
R.
Na podstawie podobieństwa trójkątów oraz korzystając z odejmowania wektorów można wyznaczyć S = U − L R = U + U − L stąd R = 2 ⋅ N ⋅ cosθ − L . Także mając na uwadze to, że
wektory N i L są znormalizowane można ostatecznie zapisać
(
)
R = 2⋅ N ⋅ N ⋅ L − L
Rys. 8 Obiekt oświetlony światłem będącym wynikiem odbicia rozproszonego oraz odbicia zwierciadlanego
powodowanego przez dwa źródła światła.
Podsumowując pragnę przypomnieć, że składowa Specular, zarówno światła jak intensywność materiału, określa intensywność i kolor odbłysków powstających na oświetlanej
powierzchni. Dzięki temu parametrowi możemy kształtować cechy powierzchni związane z
jej gładkością oraz możemy decydować, czy dana powierzchnia stwarza złudzenie twardej i
metalicznej, czy raczej miękkiej i matowej. Parametr ten uzupełniany jest wartością składowej Power materiału, która określa ostrość odbłysków. Jeżeli wartość podawana jako Power
jest nieduża to cała powierzchnia generuje odblaski. Gdy zaczniemy zwiększać ten parametr
to odblaski będą powstawać jedynie w miejscach ułożonych równolegle do padającego światła dając w efekcie bardzo ostre odblaski, stwarzające złudzenie powierzchni o dużej gładkości.
Rys. 9 parametr Power=50
Rys. 10 parametr Power=5
2. Typy świateł
Nim przejdziemy do omówienia typów świateł realizowanych programowo, w ramach ćwiczeń, zdefiniujemy strukturę pozwalającą na określenie wszystkich niezbędnych parametrów i
właściwości światła. Struktura taka może być zdefiniowana następująco:
struct Light3D
{
LIGHT_TYPE type;
Color3D specular;
Color3D diffuse;
Color3D ambient;
TVector3 Position;
TVector3 Direction;
float
Range;
float
Falloff;
float
c0;
float
c1;
float
c2;
float
Theta;
float
Phi;
};
2.1 Światło kierunkowe (directional light)
Światło kierunkowe posiada jedynie kierunek, kolor i intensywność. Promienie emitowane z tego typu źródła rozchodzą się w całej płaszczyźnie, równolegle do kierunku padania światła. Dla tego typu światła nie można określić takich parametrów jak zasięg, czy sposób zaniku, gdyż nie można wyróżnić punktu, z którego emitowane jest światło. Z punktu
widzenia stopnia skomplikowania obliczeń, ten typ światła jest najmniej czasochłonny z
wszystkich świateł kierunkowych. Światła tego typu znakomicie nadają się do imitowania
źródeł światła oddalonych od sceny, takich jak słońce, czy księżyc.
2.2 Światło punktowe (point light)
Światło punktowe, jak sama nazwa wskazuje, emitowane jest z określonego punktu i
rozchodzi się we wszystkich kierunkach z jednakowym natężeniem. Dla tego typu światła,
poza kolorem, intensywnością i pozycją, musimy zdefiniować zasięg działania światła i
współczynniki, określające sposób zanikania światła, wraz z oddalaniem się od źródła. Jeżeli
tego nie zrobimy, to światło w cały swoim zakresie będzie posiadało maksymalną wartość, a
oświetlone nim obiekty będą posiadały tylko powierzchnie białe, widoczne z pozycji światła,
lub zupełnie ciemne. Światła punktowe są znacznie bardziej kosztowne pod względem obliczeniowym od świateł kierunkowych, czy otaczających, gdyż w trakcie obliczeń natężenie
światła musi być obliczone dla wszystkich wierzchołków danego obiektu. Tego typu światła
znakomicie poprawiają realizm rysowanych scen i mogą odwzorowywać obiekty takie jak
choćby żarówka.
2.3 Światło reflektorowe (spot light)
Dla tego typu światła, poza kolorem, intensywnością, pozycją oraz kierunkiem w
przestrzeni, musimy określić kąty, między krawędziami tworzącymi stożki oraz parametr,
określający sposób zanikania światła między granicą stożka wewnętrznego, a stożka zewnętrznego. Światło rzucane przez tego typu reflektor składa się z dwóch stożków: wewnętrzny jest jaśniejszy, emitujący właściwe światło i zewnętrzny, zwykle ciemniejszy, określający obszar, w którym światło zanika.
π
θ
Rys. 7. Budowa światła reflektorowego
Efekt reflektorowego światła uzyskiwany jest bezpośrednio dzięki parametrowi Spot występującego w równaniach oświetlenia zarówno dla odbicia rozproszonego jak i dla odbicia zwierciadlanego. Wcześniej parametrowi temu przypisana była wartość 1.0 odpowiadająca zachowaniu się światła punktowego lub kierunkowego, poniżej przedstawiona jest zależność dla
światła reflektorowego





1.0 *

 phii 

Spot = 0 gdy rhoi ≤ cos

 2 

falloff



phi


i

rhoi − cos



 2 



theta
phi





i
i 
 cos
 − cos


  2 
 2 
*
















dla świateł niereflektorowych
rhoi = Ldcsi ⋅ Ldiri - gdzie Ldcsi jest parametrem Direction w strukturze opisującej właściwości
i-tego światła. Parametr ten bezpośrednio określa kierunek „patrzenia” światła reflektorowego; Ldiri jest wektorem poprowadzonym od wierzchołka bryły do pozycji i-tego światła.
Parametry Phi i Theta opisują kat rozwarcia stożków odpowiednio: wewnętrznego i zewnętrznego. Parametr Falloff służy do regulacji sposobu zaniku światła na granicy stożków.
Zmieniając wartości tego parametru możemy osiągnąć zupełny zanik światła na brzegach,
zewnętrznego stożka lub wręcz przeciwnie światło będzie tak samo intensywne w całej swojej
wiązce i zaniknie dopiero na granicy swego zasięgu. Efektowność tego typu światła okupiona
jest niestety dużym nakładem obliczeń.
Zadania do wykonania w trakcie ćwiczeń
•
•
•
Utworzyć pliki nagłówkowe zawierające definicje struktur opisujących parametry
światła (struct Light3D) oraz materiału (struct Material3D).
Napisać funkcję wyznaczającą globalne natężenie światła z uwzględnieniem światła
otaczającego oraz światła powstałego w wyniku odbicia rozproszonego i zwierciadlanego dla światła kierunkowego.
Rozszerzyć funkcję z punktu poprzedniego o światło punktowe oraz reflektorowe.