następny punkt »


1. Cieniowanie

Kolejny problem, który wymaga rozwiązania w fazie renderingu polega na odpowiednim pocieniowaniu wszystkich wyświetlanych powierzchni, co faktycznie oznacza obliczenie barwy każdego piksela wyświetlanej powierzchni. Bierze się przy tym pod uwagę atrybuty wyświetlanej powierzchni (barwa oryginału, materiał powierzchni itp.) oraz sposób oświetlenia. Zależnie od potrzeb korzysta się przy tym z różnych metod.

W najprostszym przypadku możemy ograniczyć się do cieniowania płaskiego polegającego na tym, że każdy wielokąt aproksymujący powierzchnię boczną obiektu jest pokrywany jednolitą barwą. Wyjaśnijmy sposób rozwiązania problemu cieniowania na przykładzie sześcianu oświetlonego odległym źródłem światła o natężeniu Ip przy czym promienie świetlne są do siebie równoległe. W takim przypadku jasność poszczególnych ścianek zależy od kąta padania promieni na daną ściankę. Jasność ścianki wyznacza się w sposób zilustrowany na rysunku XI.1 - jasność ścianki jest równa iloczynowi natężenia źródła światła i kosinusa kąta między wektorem N normalnym do płaszczyzny ścianki a wektorem L skierowanym do źródła światła.

Rys. XI.1. Zależność wartości oświetlenia ścianki od kąta padania promieni świetlnych

Załóżmy dla przykładu, że chcemy wyświetlić niebieski sześcian oświetlony odległym źródłem światła, przy czym dopuszczamy możliwość oglądania sześcianu z różnych miejsc. W tym celu w pierwszej fazie należy określić ścianki widoczne ze źródła światła i określić ich jasności. Pozostałym ściankom należy przypisać jasność wynikającą z oświetlenia przez światło otoczenia (gdyby nie uwzględnić światła otoczenia to ścianki niewidoczne ze źródła światła powinny otrzymać barwę czarną, co raczej jest niezgodne z naszą intuicją). Wartość światła otoczenia należy również uwzględnić przy wyznaczaniu jasności ścianek widocznych ze źródła światła. W drugiej fazie można określić położenie obserwatora, znaleźć ścianki widoczne z tego punktu i wyświetlić pocieniowany sześcian. Na rysunku XI.2 pokazano widok sześcianu dla dwóch położeń obserwatora.

Rys. XI.2. Sześcian oświetlony odległym źródłem światła. a) Widok dla obserwatora znajdującego się w położeniu, z którego widać bezpośrednio trzy ścianki oświetlone przez źródło światła, przy czym światło pada na ścianki 1, 2 i 3 pod różnymi kątami, b) widok dla obserwatora znajdującego się po przeciwnej stronie sześcianu niż źródło światła, w punkcie, z którego widać trzy ścianki, które nie są bezpośrednio oświetlone przez źródło światła. Barwę ścianek 4, 5 i 6 określa przyjęte światło otoczenia

Model cieniowania płaskiego jest dobry w odniesieniu do prostych obiektów, których powierzchnie boczne składają się z niewielkiej liczby wielokątów. W przypadku gdy krzywoliniowe powierzchnie boczne obiektów są aproksymowane wielokątami metoda cieniowania płaskiego nie daje dobrych rezultatów - jeżeli każdy wielokąt jest pokryty jednolitą barwą, to widoczna jest struktura wielokątowa (por. rysunek XI.3). Efekt ten można usunąć stosując metodę cieniowania Gouraud. W metodzie tej, przy dostatecznie dużej liczbie dostępnych barw, każdy piksel wielokąta może mieć inną barwę.

Rys. XI.3. Przykłady cieniowania bryły. a) Metoda cieniowania płaskiego, b) metoda Gouraud, c) metoda Phonga (na środkowej części powierzchni kuli widoczne jest rozświetlenie)

Załóżmy, że powierzchnia boczna bryły jest aproksymowana trójkątami i weźmy pod uwagę jeden trójkąt. Załóżmy ponadto, że znamy rzut tego trójkąta na płaszczyznę ekranu oraz, że znamy barwy (wartości jasności) trzech wierzchołków trójkąta (barwy te zostały wyznaczone w przestrzeni 3D przed rzutowaniem; sposób wyznaczania barw punktów powierzchni 3D jest omawiany dalej). Zadanie polega na wyznaczeniu barwy każdego piksela należącego do trójkąta.

Weźmy pod uwagę lewą krawędź trójkąta (por. rysunek XI.4). Oznaczmy wartości jasności barw wierzchołkowych przez I1 i I2. Krawędź ta jest przecinana przez linie rastra. Znając wartości I1 i I2 możemy dla każdego punktu przecięcia krawędzi z linią rastra znaleźć jasność pośrednią, korzystając z metody interpolacji liniowej. Podobnie, dla prawej krawędzi trójkąta o jasnościach wierzchołkowych I1 i I3 możemy znaleźć barwy w punktach pośrednich krawędzi. Z kolei, weźmy pod uwagę fragment wiersza rastra należący do trójkąta. Ponieważ znamy już wartości jasności na końcach tego odcinka (Ia oraz Ib na rysunku XI.4), to możemy podobnie jak poprzednio znaleźć wartości pośrednie dla poszczególnych pikseli należących do odcinka rastra (na przykład wartość Ic na rysunku). Postępując w ten sposób dla innych wierszy rastra możemy znaleźć wartość jasności dla każdego piksela należącego do wnętrza trójkąta. W efekcie można uzyskać gładkie cieniowanie powierzchni trójkąta. Przykład takiego cieniowania jest pokazany na rysunku XI.4 dla wersji czarno-białej i kolorowej.

Rys. XI.4. Metoda Gouraud. a) Ilustracja działania metody, b,c) przykłady uzyskiwanych efektów

Pewnym ograniczeniem metody Gouraud jest to, że zestaw barw jakie można uzyskać wewnątrz wypełnianego trójkąta jest ograniczony przez zestaw barw wierzchołkowych i na przykład nie można uzyskać efektu rozświetlenia wewnątrz trójkąta. Zasygnalizujmy, że problem ten pozwala rozwiązać metoda Phonga, w której prowadzi się podwójną interpolację podobnie jak w metodzie Gouraud, z tym, że dla wartości wektorów normalnych a nie dla barw. Dopiero po określeniu wektora normalnego dla konkretnego piksela wyznacza się jego barwę. Przykład efektu działania cieniowania Phonga pokazano na rysunku XI.3c.

Omówione wyżej metody określania barw poszczególnych pikseli są stosowane do wielokątów, które zostały już zrzutowane na płaszczyznę ekranu. Zastanówmy się teraz jak można wyznaczać jasność dowolnego punktu powierzchni zewnętrznej bryły, a więc jeszcze przed rzutowaniem. Najczęściej korzysta się tu z równania podanego przez Phonga lub jego modyfikacji. Zakładamy, że znamy wektor normalny do powierzchni w rozważanym punkcie oraz wektor skierowany do odległego punktowego źródła światła (por. rysunek XI.5).

Rys. XI.5. Ilustracja do sposobu obliczania jasności punktu w przestrzeni 3D. a) Wpływ oświetlenia przez punktowe źródło światła, b) efekt odbicia zwierciadlanego

Phong w swoim modelu uwzględnił trzy elementy mające wpływ na jasność punktu: światło otocznia Ia, światło pochodzące bezpośrednio ze źródła światła Ip oraz światło wynikające z odbicia zwierciadlanego od powierzchni Is. O świetle otoczenia mówiliśmy wcześniej. Podobnie pokazywaliśmy już, że wpływ światła ze źródła światła Ip docierającego bezpośrednio do powierzchni uwzględnia się biorąc pod uwagę kąt między promieniem światła a normalną do powierzchni (a dokładniej kosinus kąta).

W przypadku efektu odbicia zwierciadlanego bierze się pod uwagę odchylenie rzeczywistego kierunku obserwacji punktu odbicia od teoretycznego kierunku promienia odbitego (por. kąt β na rysunku XI.5b). W obliczeniach faktycznie uwzględnia się n-tą potęgę kosinusa kąta β. Wartość n dobiera się eksperymentalnie z uwzględnieniem właściwości materiału powierzchni odbijającej.

Podstawowe równanie Phonga ma następującą postać:

W równaniu tym współczynniki ka, kd oraz ks są współczynnikami wagowymi o wartościach z przedziału od 0 do 1. Współczynniki te umożliwiają regulowanie stopnia wpływu poszczególnych źródeł światła, a pośrednio modelowanie rodzaju materiału, z którego jest wykonana powierzchnia.

W przypadku gdy w scenie występuje większa liczba źródeł światła sumuje się ich wpływ na jasność punktu (należy zwracać uwagę na to żeby nie przekroczyć dopuszczalnej wartości jasności). Jeżeli rozważany obiekt jest półprzezroczysty, to w równaniu może się pojawić czwarty czynnik umożliwiający uwzględnienie efektów załamania światła. W przypadku świateł barwnych można korzystać z równania Phonga niezależnie dla każdej składowej R, G i B.


 następny punkt »