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.