Grafika Komputerowa (GRK)
Wykład VIII

Cieniowanie i teksturowanie

W poprzednim wykładzie, przy omawianiu koncepcji renderingu nie poruszaliśmy problemów związanych z cieniowaniem powierzchni obiektów znajdujących się w oświetlonej scenie, ponieważ są one takie same niezależnie od przyjętej wersji renderingu. Ten wykład jest poświęcony omówieniu różnych problemów związanych z cieniowaniem i teksturowaniem.

Niezależnie od przyjętej koncepcji realizacji renderingu zawsze pojawia się problem cieniowania, czyli określenia barwy powierzchni bocznych obiektów występujących w scenie i oświetlanych przez źródła światła, a w konsekwencji wyznaczenie barw poszczególnych pikseli obrazu. W grafice komputerowej stosuje się wiele różnych rozwiązań tego problemu. Są one dostosowane do różnych wymagań stawianych generowanym obrazom, związanych głównie ze złożonością sceny i wymaganiami dotyczącymi jakości obrazu.

W praktyce bardzo często korzysta się również z teksturowania, które umożliwia bezpośrednie określenie wyglądu powierzchni bocznej obiektu albo ewentualnie zmodyfikowanie wyniku wcześniej wykonanego cieniowania powierzchni.

Cieniowanie

Cieniowanie płaskie

W najprostszym przypadku można 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 ten sposób cieniowania na przykładzie sześcianu, w oryginale niebieskiego, oświetlonego kierunkowym źródłem światła o intensywności $I_p$. W takim przypadku jasność poszczególnych ścianek sześcianu zależy od kąta padania promieni ze źródła światłą na daną ściankę.

Jasność ścianki wyznacza się w sposób zilustrowany na rysunku VIII.1 - jasność ścianki jest równa iloczynowi jasności źródła światła i cosinusa kąta między wektorem N normalnym do płaszczyzny ścianki a wektorem L skierowanym do źródła światła.

Rysunek VIII.1

Rys. VIII.1. Zależność jasności ścianki od kąta padania promieni z kierunkowego źródła światła

Proces cieniowani sześcianu trzeba zacząć od określenia ścianek do których bezpośrednio docierają promienie ze źródła światła. Dla tych ścianek można określić kąty padania tych promieni na poszczególne ścianki i w konsekwencji odcień koloru niebieskiego.

Powstaje pytanie jaką barwę przypisać pozostałym ściankom, czyli tym do których nie docierają promienie ze źródła światła. Przypisanie tym ściankom barwy czarnej byłoby raczej niezgodne z naszą intuicją. Problem ten rozwiązuje się w ten sposób, że wprowadza się pojęcie światła rozproszonego - światła, które istnieje w całej scenie ale nie jest związane z żadnym źródłem światła. Uwzględniając istnienie światła rozproszenia można rozpatrywanym ściankom przypisać barwę ciemnoniebieską. Wartość światła otoczenia można również uwzględnić przy wyznaczaniu jasności ścianek widocznych ze źródła światła.

Po określeniu sposobu cieniowania ścianek sześcianu można określić położenie obserwatora w scenie, znaleźć ścianki widoczne z tego punktu i wyświetlić pocieniowany sześcian. Na rysunku VIII.2 pokazano widok sześcianu dla dwóch położeń obserwatora. Każda ścianka ma jednolity odcień barwy - stąd nazwa cieniowanie płaskie.

Rysunek VIII.2

Rys. VIII.2. Sześcian oświetlony kierunkowym ź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 promienie padają 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

Cieniowanie gładkie

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 (trójkątami) metoda cieniowania płaskiego nie daje dobrych rezultatów. Jeżeli każdy wielokąt jest pokryty jednolitą barwą, to może być widoczna struktura wielokątowa powierzchni aproksymującej (por. rysunek VIII.3). Efekt ten można usunąć wykorzystując cieniowanie gładkie, bazujące na metodzie Gouraud omówionej w wykładzie IV.

Rysunek VIII.3

Rys. VIII.3. Przykłady cieniowania powierzchni kuli. a) Metoda cieniowania płaskiego, b) metoda cieniowania gładkiego

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). W tej sytuacji możemy wyznaczyć barwy pikseli należących do trójkąta za pomocą metody Gouraud.

Zauważmy, że przy cieniowaniu dwóch trójkątów o wspólnej krawędzi uzyskuje się gładkie przejście cieniowania między obu trójkątami.

Równanie Phonga

Warunkiem koniecznym dla korzystania z cieniowania gładkiego jest znajomość barw wierzchołkowych poszczególnych trójkątów. Sposób wyznaczania tych barw można potraktować jako szczególny przypadek problemu wyznaczania barwy punktu powierzchni bocznej bryły w przestrzeni sceny.

Podstawowy sposób postępowania został zaproponowany przez Phonga i równanie przez niego zaproponowane znane jest jako równanie Phonga. Zostało ono określone przy następujących założeniach:

  • Dostępne jest punktowe źródło światła
  • Światło dociera do analizowanego punktu powierzchni z jednego kierunku i odbija się
  • Uwzględnia się odbicie dyfuzyjne i odbicie zwierciadlane (w kierunku obserwatora)
  • Uwzględnia się fakt istnienia światła rozproszonego.

Generalnie, cechą odbicia dyfuzyjnego jest to, że światło odbija się od powierzchni obiektu we wszystkich kierunkach jednakowo, a intensywność odbitego światła zależy od kąta między padającym promieniem a wektorem normalnym do powierzchni w rozpatrywanym punkcie. Przy założeniach przyjętych przez Phonga oznacza to, że intensywność odbitego światła można obliczać korzystając z zależności kosinusowej (tak jak to było przy cieniowaniu płaskim) (por. rys.VIII.4a).

W przypadku odbicia zwierciadlanego klasycznie kąt między wektorem normalnym do powierzchni a promieniem odbitym jest równy kątowi między wektorem normalnym a w promieniem padającym. Phong uwzględnił jednak fakt, że niektóre powierzchnie nie muszą być perfekcyjnie zwierciadlane - w rzeczywistości występują również powierzchnie błyszczące. W kontekście takich powierzchni Phong dopuścił odchylenie rzeczywistego kierunku obserwacji punktu odbicia od teoretycznego kierunku promienia odbitego (por. kąt β na rysunku VIII.4b). 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.

Rysunek VIII.4

Rys.VIII.4. 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

Zwróćmy uwagę, że zarówno dla obliczeń związanych z odbiciem dyfuzyjnym, jak i z odbiciem zwierciadlanym konieczna jest znajomość wektora normalnego N do powierzchni w analizowanym punkcie. Jeżeli analizowany punkt jest wierzchołkiem siatki trójkątnej przybliżającej powierzchnię boczną, to wektor normalny oblicza się jako wektor wypadkowy wektorów normalnych do ścianek trójkątów, przesuniętych do wspólnego wierzchołka. Ponadto istotna jest znajomość wektora L skierowanego z tego punktu do źródła światła.

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

$$I=k_aI_a+k_dI_d\cosα+k_sI_s\cos^nβ$$

W równaniu uwzględnione są trzy czynniki mające wpływ na jasność punktu powierzchni: światło rozproszenia ($I_a$), światło odbijane dyfuzyjnie ($I_d$) i światło odbijane zwierciadlanie ($I_s$).

W równaniu tym, współczynniki $k_a$, $k_d$ oraz $k_s$ 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). W przypadku świateł barwnych można korzystać z równania Phonga niezależnie dla każdej składowej R, G i B.

Zaawansowane metody cieniowania

W opisanych dotychczas metodach cieniowania rozpatrywane były tylko promienie docierające do cieniowanej powierzchni bezpośrednio z poszczególnych źródeł światła. Pomijany więc był fakt, że w rzeczywistości światło może dochodzić do powierzchni również po wielokrotnych odbiciach od innych obiektów. Przy uwzględnieniu tego faktu w grafice operuje się pojęciem oświetlenia globalnego.

Pełna realizacja koncepcji oświetlenia globalnego praktycznie nie jest możliwa. Stąd, opracowano kilka metod umożliwiających realizację tej koncepcji w sposób przybliżony. Jedną z tych metod jest omówiona wcześniej metoda śledzenia promieni, w której przy wyznaczaniu barwy określonego punktu powierzchni obiektu uwzględnia się wpływ oświetlenia pochodzącego od obiektów, które znajdowały się na ścieżkach drzewa rozchodzenia się promieni. Zwróćmy dodatkowo uwagę na to, że koncepcja oświetlenia globalnego eliminuje potrzebę korzystania z pomocniczego światła rozproszenia.

Drugim elementem, który ma istotne znaczenie dla zaawansowanych metod cieniowania jest konieczność uwzględnienia szeroko rozumianego pojęcia interakcja światło - materiał. W istocie chodzi o to żeby dokładniej uwzględnić sposób odbijania się światła od różnych materiałów z jakich mogą być wykonane powierzchnie obiektów.

Z punktu widzenia właściwości odbijania światła, powierzchnie obiektów mogą być różnego typu. Mogą to być powierzchnie: gładkie, nierównej, matowe, zwierciadlane, błyszczące, półprzezroczyste, pochłaniające, emisyjne. Na przykład, światło inaczej odbija się od powierzchni gładkiej a inaczej od powierzchni nierównej (por. rys. VIII.5) - istotne są kierunki wektorów normalnych w poszczególnych punktach powierzchni.

Rysunek VIII.5

Rys. VIII.5. Przykładowe kierunki odbicia światła od nierównej powierzchni

W porównaniu z uproszczonym modelem odbicia dyfuzyjnego w równaniu Phonga, w rzeczywistości światło padające na punkt powierzchni dociera ze wszystkich możliwych kierunków ωi i jest rozpraszane w różnych kierunkach ωo niekoniecznie równomiernie.

Sposób odbijania światła od powierzchni wykonanej z określonego materiału jest opisywany za pomocą funkcji BRDF (Bidirectional Reflectance Distribbution Function). Funkcja taka określa jaka część światła padającego z kierunków ωi jest odbijana w każdym z kierunków wyjściowych ωo.

Funkcje BRDF mogą być wyznaczane teoretycznie na gruncie fizyki, albo doświadczalnie w wyniku pomiarów. W grafice komputerowej najczęściej wykorzystuje się funkcje uproszczone opracowane przez różnych badaczy na potrzeby symulacji efektów odbicia światła dla różnych materiałów. Można tu wymienić funkcje (modele) Blinna-Phonga, Cooka-Torrance’a, Warda, Orena-Nayara.

Powyższe funkcje są wykorzystywane przy bezpośrednich odbiciach światła od powierzchni obiektu. W grafice komputerowej uwzględnia się również sytuacje, kiedy światło nie tylko odbija się od powierzchni, ale również wnika pod powierzchnię i po kilku wewnętrznych odbiciach jest emitowane na zewnątrz (rys. VIII.6). Takie sytuacje opisują funkcje BSRDF (BSSRDF). Są one wykorzystywane na przykład przy modelowaniu skóry człowieka.

Rysunek VIII.6

Rys. VIII.6. Ilustracja odbicia podpowierzchniowego

Teksturowanie

Często chcemy żeby powierzchnie zewnętrzne obiektów były pokryte jakimiś wzorami. Dla realizacji takich zadań w grafice najczęściej korzysta się z koncepcji teksturowania powierzchni. Ogólnie, koncepcja ta polega na tym, że najpierw definiuje się odpowiedni wzór - teksturę, a następnie odwzorowuje się taki wzór na powierzchnię obiektu. Na rysunku VIII.7 przedstawiono kilka tekstur i obiekt z naniesionymi teksturami.

Rysunek VIII.7a
Rysunek VIII.7b

Rys. VIII.7. Przykłady teksturowania

Teksturę może stanowić dowolna mapa bitowa. W szczególności, może to być obraz uzyskany na przykład ze skanera albo z aparatu cyfrowego. Tekstura zwykle jest definiowana w układzie współrzędnych u,v. albo s,t. Elementarny fragment tekstury jest określany jako teksel.

W najprostszym przypadku, gdy obszar tekstury jest zgodny z obszarem powierzchni płaskiej, na którą należy nanieść teksturę, zadanie jest proste i sprowadza się do odwzorowania poszczególnych tekseli na odpowiednie piksele obrazu w układzie współrzędnych x,y, tak jak na rysunku VIII.8. Jednak w ogólnym przypadku, konieczne jest znalezienie odpowiedniego sposobu odwzorowania.

Rysunek VIII.8

Rys. VIII.8. Podstawowa koncepcja teksturowania. W najprostszym przypadku jeden teksel jest odwzorowywany na jeden piksel

Wyżej korzystaliśmy z modelu oczkowego zarówno w stosunku do pikseli jak i do tekseli. Dalej będziemy korzystali z modelu węzłowego.

W praktyce są stosowane różne sposoby odwzorowania tekstur. W przypadku prostych obiektów można korzystać z odwzorowania analitycznego. Na przykład, jeżeli trzeba odwzorować teksturę na powierzchnię boczną walca, to można skorzystać z funkcji opisującej położenie punktu P na powierzchni walca o postaci

$$\bi p(θ,y)=⟨r\sinθ,y,r\cosθ⟩$$

gdzie współrzędne θ,y oznaczają odpowiednio: kąt θ mierzony w odniesieniu do kąta zerowego związanego z wybraną osią pionowa na powierzchni walca, a y wysokość określoną w stosunku do punktu leżącego w połowie wysokości h walca. Dla tak określonego punktu P na powierzchni walca, współrzędne teksela, który będzie przypisany punktowi P można wyznaczyć z zależności

Wzory s t

Ten proces teksturowania ilustruje rysunek VIII.9.

Rysunek VIII.9

Rys. VIII.9. Przykład teksturowania analitycznego

W podobny sposób można rozwiązać proces teksturowania dla kuli. Jeżeli jednak powierzchnia bryły nie daje się tak opisać żeby można było łatwo znaleźć wzory umożliwiające odwzorowanie punktu powierzchni na teksturę, to można skorzystać z teksturowania metodą pośrednią. Najpierw otacza się obiekt pomocniczą bryłą, na którą można łatwo odwzorować teksturę. Może to być kula, walec albo sześcian. W drugim kroku tekstura z powierzchni bryły otaczającej jest odwzorowywana na powierzchnię bryły docelowej. To odwzorowanie można realizować rozmaicie. Na rysunku VIII.10 pokazano przykładowe rozwiązanie.

Rysunek VIII.10

Rys. VIII.10. Ilustracja sposobu odwzorowania tekstury metodą pośrednią

W praktyce często jest stosowane tak zwane odwzorowanie UV. W tym przypadku w czasie modelowania, po określeniu siatki trójkątów przybliżających powierzchnię obiektu, każdemu wierzchołkowi trójkąta siatki przypisuje się współrzędne u,v tekstury. W czasie teksturowania, na podstawie tych współrzędnych odtwarza się odpowiedni trójkąt w obszarze tekstury (por. rys. VIII.11). Następnie dla kolejnego piksela teksturowanego trójkąta, wyznacza się współrzędne barycentryczne α,β,γ (oczywiście znane są współrzędne x,y,z dla każdego wierzchołka trójkąta). Na podstawie znajomości tych współrzędnych barycentrycznych można znaleźć odpowiednią wartość tekstury w trójkącie wyznaczonym w polu tekstury.

Rysunek VIII.11

Rys. VIII.11. Ilustracja teksturowania metodą odwzorowania UV

Przypisanie współrzędnych u,v wierzchołkom siatki trójkątów może być wykonane bezpośrednio przez projektanta. Można jednak korzystać z pomocniczych programów, które umożliwiają rozwinięcie siatki trójkątów na płaszczyznę i nałożenie jej na wzór tekstury oraz automatyczne przypisanie informacji o współrzędnych u,v odpowiednim wierzchołkom siatki.

Przy wyznaczaniu wartości tekstury dla określonego piksela może się zdarzyć, że wyliczone współrzędne tekstury wskażą punkt leżący w oczku siatki tekseli (rys. VIII.12). Wtedy można wybrać teksel leżący najbliżej wskazanego punktu albo za pomocą interpolacji dwuliniowej wyznaczyć wartość wypadkową dla czterech najbliższych tekseli. Jest to problem tak zwanej filtracji tekstury.

Rysunek VIII.12

Rys. VIII.12. Ilustracja problemu filtracji tekstury

Dotychczas milcząco przyjmowaliśmy, że naniesiona tekstura zastępuje wcześniejsze barwy poszczególnych punktów powierzchni. Można jednak informacje o teksturze wykorzystać do modyfikowania wcześniejszej barwy powierzchni. Można na przykład wykorzystać mnożenie albo dodawanie barwy powierzchni i barwy tekstury. Można również wykorzystać operację mieszania (blendingu) dwóch barw $c_1$ i $c_2$ ze sobą w odpowiednim stosunku, określonym przez parametr $α (α∈(0,1))$

$$c=αc_1+(1-α)c_2$$

Tekstury mogą być wykorzystywane nie tylko do przenoszenia informacji o barwach. Za ich pomocą można przenosić również inne informacje. Na przykład, tekstura może nieść informację o mapie wysokości. W tym przypadku odpowiedni teksel określa na jaką wysokość należy przesunąć punkt powierzchni wzdłuż normalnej do powierzchni.

W wykładzie poznaliśmy różne metody cieniowania i teksturowania. Wybór odpowiedniej metody zależy od konkretnego zastosowania.

Przykładowe pytania i problemy do rozwiązania.
  1. Porównać metody cieniowania płaskiego, gładkiego i przy wykorzystaniu równania Phonga.
  2. Podać jakie operacje trzeba wykonać, żeby uzyskać na ekranie obraz zielonej kostki sześciennej oświetlonej kierunkowym źródłem światła. Obserwator może znajdować się w dowolnym punkcie poza sześcianem.
  3. Nad nieprzezroczystą powierzchnią znajduje się sześcian oraz walec. Nad tymi bryłami znajduje się punkowe źródło światła. Naszkicować tę scenę uwzględniając problem cieniowania powierzchni brył oraz rzucane przez nie cienie.
  4. Wyjaśnić różnice między cieniowaniem powierzchni a jej teksturowaniem.
  5. Wyjaśnić metodę teksturowania trójkąta, jeżeli znane są współrzędne (u,v) dla każdego wierzchołka trójkąta.