Cieniowanie Mirosław Głowacki
Jasnym jest, że możemy pocieniować dowolną powierzchnię obliczając normalną do powierzchni w każdym widocznym punkcie i stosując odpowiedni model oświetlenia w tym punkcie. Niestety, taki bezpośredni model cieniowania jest drogi obliczeniowo. Istnieją bardziej efektywne modele oświetlenia dla powierzchni zdefiniowanych przez wielokąty i siatki wielokątów
Najprostszy model cieniowania wielokąta polega na cieniowaniu stałą wartością, określanym również jako cieniowanie ścian albo cieniowanie płaskie. W tym podejściu model oświetlenia jest wykorzystywany tylko raz w celu określenia jednej wartości natężenia, która jest później używana do cieniowania całego wielokąta. W istocie próbkujemy wartość równania oświetlenia raz dla całego wielokąta i utrzymujemy tę wartość w całym wielokącie w celu rekonstrukcji barwy wielokąta.
Takie podejście jest dobre, jeżeli jest spełnionych kilka założeń: źródło światła jest w nieskończoności, a więc N L jest stałe na całej powierzchni wielokąta. obserwator jest w nieskończoności, a więc N V jest stałe na całej powierzchni. wielokąt reprezentuje faktyczną powierzchnię modelowaną i nie jest aproksymacją powierzchni krzywoliniowej. Jeżeli jest wykorzystywany algorytm powierzchni widocznej, który generuje listę wielokątów, taki jak algorytm z listą priorytetową, całe cieniowanie może korzystać z powszechnie dostępnego prymitywu jednobarwnego, wielokąta 2D.
Jeżeli któreś z pierwszych dwóch założeń nie jest spełnione, to, gdybyśmy chcieli zastosować stałe cieniowanie, byłaby potrzebna metoda określania jednej wartości dla każdego N i V. Na przykład wartości mogłyby być obliczane dla środka wielokąta albo dla pierwszego wierzchołka wielokąta. Oczywiście przy stałym cieniowaniu nie ma zmian cieniowania wzdłuż wielokąta, które powinny się w takiej sytuacji pojawić.
Jako alternatywę obliczania równania oświetlenia w każdym punkcie wielokąta Wylie, Romney, Evans i Erdahl jako pierwsi zastosowali do cieniowania interpolację, w której informacja o cieniowaniu jest liniowo interpolowana w trójkącie na podstawie wartości określonych dla jego wierzchołków. Gouraud uogólnił tę metodę na dowolne wielokąty. Metoda ta jest szczególnie łatwa dla algorytmu przeglądania wierszami, który już i tak interpoluje wartość z wzdłuż odcinka przeglądanego na podstawie wartości z obliczonych dla końców tego odcinka.
W celu zwiększenia efektywności można korzystać z równania różnicowego do określania wartości z w każdym pikselu. Chociaż interpolacja z jest fizycznie poprawna (przy założeniu, że wielokąt jest płaski), zauważmy, że cieniowanie z interpolacją nie, ponieważ aproksymuje ono tylko obliczanie modelu oświetlenia w każdym punkcie wielokąta. Ostatnie założenie, że wielokąt dokładnie reprezentuje powierzchnię modelowaną, najczęściej jest niepoprawne i ma istotny wpływ na wynikowy obraz
Wiele obiektów jest krzywoliniowych a nie wielościanowych, jednak reprezentowanie ich jako siatki wielokątów umożliwia stosowanie efektywnych algorytmów wyznaczania powierzchni widocznych dla wielokątów. Jak wykonać rendering siatki wielokątowej, żeby wyglądała możliwie podobnie do powierzchni krzywoliniowej?
Załóżmy, że chcemy aproksymować powierzchnię krzywoliniową za pomocą siatki wielokątowej. Jeżeli każda ściana wielokątowa w siatce jest cieniowana niezależnie, to jest łatwa do odróżnienia od sąsiadów o innej orientacji i otrzymuje się wygląd jak na rysunku
Tak jest, jeżeli wielokąty są wyświetlane: ze stałą barwą, z cieniowaniem z interpolacją, a nawet z oświetleniem obliczanym dla każdego piksela; Wynika to stąd, że dwa sąsiednie wielokąty o różnej orientacji mają różne jasności wzdłuż swoich krawędzi. Proste rozwiązanie polegające na użyciu dokładniejszej siatki okazuje się zaskakująco nieefektywne, ponieważ postrzegana różnica w cieniowaniu między sąsiednimi ściankami jest uwydatniana przez efekt pasm Macha Odkryty przez Macha w 1865 r. efekt który uwypukla zmianę jasności na każdej krawędzi, gdzie jest nieciągłość amplitudy albo pochodnej. Na krawędzi między dwiema ścianami ciemna ściana wygląda ciemniej, a jasna jaśniej.
Na rysunku pokazano dla dwóch przypadków faktyczne i postrzegane zmiany jasności wzdłuż powierzchni.
Na ilu przecięciach białych linii znajdują się czarne kropki? Na żadnych. Wydaje się, że na białych przecięciach pojawiają się czarne kropki. To efekt hamowania aktywności receptora przez pobudzone receptory z nim sąsiadujące.
Jaka jest jasność ilustracji w punkcie B, względem pozostałych punktów? To złudzenie optyczne znane jako Pasmo Macha. Wydaje się, że punkt B jest jaśniejszy niż A, choć w rzeczywistości jasność obu jest taka sama. Złudzenie wynika z własności ludzkiego wzroku, skutkującej postrzeganiem jasnych (lub ciemnych, jak w punkcie C) wstęg na granicach obszarów o różnej jasności.
Efekt pasm Macha jest powodowany przez poziome hamowanie receptorów w oku. Im więcej światła otrzymuje receptor, tym silniej oddziałuje hamująco na odpowiedź receptora sąsiedniego. Odpowiedź receptora na światło jest hamowana przez sąsiednie receptory w zależności odwrotnie proporcjonalnej do odległości od sąsiedniego receptora. Receptory będące bezpośrednio po jaśniejszej stronie dają silniejszą odpowiedź niż te, które są dalej od krawędzi, ponieważ otrzymują one mniejszy sygnał hamowania od sąsiadów po ciemniejszej stronie. Podobnie receptory znajdujące się bezpośrednio po ciemnej stronie zmiany jasności dają słabszą odpowiedź niż znajdujące się dalej w ciemnym obszarze, ponieważ otrzymują silniejsze sygnały hamowania od swoich sąsiadów po jaśniejszej stronie.
W opisanych modelach cieniowania wielokąta barwa każdego wielokąta jest wyznaczana indywidualnie. Dwa podstawowe modele cieniowania dla siatek wielokątowych wykorzystują informacje pochodzącą z sąsiednich wielokątów do symulowania gładkiej powierzchni. Są one znane jako: cieniowanie Gourauda i cieniowanie Phonga Zostały wymienione w kolejności wynikającej ze wzrostu złożoności i efektu realizmu, a ich nazwy pochodzą od nazwisk twórców tych modeli. Współczesne stacje graficzne 3D na ogół mają wspomaganie sprzętowe albo sprzętowo-programowe dla przynajmniej jednej z tych metod.
Siatka wielokątów - obiekt jest tworzony z płaskich wielokątów (najczęściej trójkątów lub czworokątów) Wielokąty mają wspólne wierzchołki i krawędzie. W ten sposób można tworzyć proste bryły, albo - jeśli siatka jest dostatecznie gęsta dobrze przybliżać skomplikowane obiekty
Zamiana obiektów rzeczywistych na sieć elementów fragmenty płatów bikubicznych
Cieniowanie Gourauda, określane również jako cieniowanie na zasadzie interpolowania jasności albo cieniowanie na zasadzie interpolowania barwy, eliminuje nieciągłości jasności.
Większość efektu pasm jasnych pręg na takich obiektach jak torus czy stożek są pasmami Macha powodowanymi przez szybkie chociaż nieciągłe zmiany nachylenia krzywej jasności. Cieniowanie Gourauda nie eliminuje całkowicie takich zmian jasności. Cieniowanie Gourauda rozszerza koncepcję cieniowania z interpolacją stosowanego do poszczególnych wielokątów dzięki interpolowaniu wartości oświetlenia z wierzchołków wielokąta, wyznaczonego przy uwzględnieniu aproksymowanej powierzchni.
Proces cieniowania Gourauda wymaga, żeby była znana normalna dla każdego wierzchołka siatki wielokątowej. Gouraud mógł obliczać te normalne dla wierzchołków bezpośrednio z analitycznego opisu powierzchni. Alternatywnie, jeżeli normalne dla wierzchołków nie są zapisane z siatką i nie mogą być określone bezpośrednio dla bieżącej powierzchni, to Gouraud sugerował, żeby je aproksymować na zasadzie uśredniania normalnych do powierzchni wszystkich ścian wielokątowych, dla których dany wierzchołek jest wspólny
Jeżeli krawędź ma być widoczna (tak jak np. na połączeniu między skrzydłem samolotu a kadłubem), to znajdujemy dwie normalne dla wierzchołków, po jednej dla każdej strony krawędzi, na zasadzie uśrednienia normalnych do wielokątów z każdej strony krawędzi oddzielnie. Następny krok w cieniowaniu Gourauda polega na znalezieniu jasności w wierzchołkach przy wykorzystaniu normalnych w wierzchołkach za pomocą wybranego modelu oświetlenia.
Wreszcie, każdy wielokąt jest cieniowany na zasadzie: interpolacji liniowej między wierzchołkami wzdłuż każdej krawędzi, a potem między krawędziami wzdłuż każdego przeglądanego wiersza w sposób przedstawiony równaniami z prawej strony rysunku Określenie cieniowanie Gourauda jest często uogólniane na: cieniowanie metodą interpolacji jasności jednego wielokąta albo na interpolację dowolnych barw związanych z wierzchołkami wielokąta.
. Dla każdej krawędzi zapamiętujemy: wartość początkową każdej składowej barwy i zmianę jasności dla każdej zmiany jednostkowej współrzędnej y. Widzialny segment w wierszu jest wypełniany na zasadzie interpolowania wartości jasności dwóch krawędzi ograniczających ten segment. Tak jak we wszystkich algorytmach interpolacji liniowej, w celu zwiększenia efektywności można zastosować równanie różnicowe.
Cieniowanie Phonga, znane również jako cieniowanie z interpolacją wektora normalnego, interpoluje wektor normalny N do powierzchni zamiast jasności. Interpolacja ma miejsce wzdłuż segmentu w przeglądanym wierszu, między normalnymi dla początku i dla końca segmentu. Te normalne same są interpolowane wzdłuż krawędzi wielokąta na podstawie normalnych w wierzchołkach, które są obliczane, jeśli to jest konieczne, tak jak w przypadku cieniowania Gourauda. Interpolacja wzdłuż krawędzi znowu może być wykonana za pomocą obliczeń przyrostowych, przy czym wszystkie trzy składowe wektora normalnego są inkrementowane przy przejściu od przeglądanego wiersza do następnego przeglądanego wiersza.
Dla każdego piksela wzdłuż przeglądanego wiersza interpolowana normalna jest normalizowana i jest z powrotem odwzorowywana do układu WC lub izometrycznego do niego Następnie wykonuje się nowe obliczenie jasności za pomocą jakiegoś modelu oświetlenia. Na rysunku pokazano dwie normalne dla krawędzi i normalne interpolowane na ich podstawie, przed i po normalizacji.
Fotografie otrzymano przy zastosowaniu odpowiednio cieniowania Gourauda i cieniowania Phonga oraz równania oświetlenia z czynnikiem odbicia zwierciadlanego. Dla takich modeli oświetlenia cieniowanie Phonga daje istotne polepszenie w stosunku do cieniowania Gourauda, ponieważ rozjaśnienia są reprodukowane z większą wiernością
cos Zastanówmy się, co się stanie, jeżeli n w oświetlenia Phonga jest duże i dla jednego wierzchołka jest bardzo mały kąt, dla każdego natomiast z sąsiednich wierzchołków kąt jest duży. Jasność związana z wierzchołkiem, dla którego kąt jest mały, będzie odpowiednia dla rozświetlenia, a dla innych jasności pojawią się wartości, które nie odpowiadają rozświetleniom. n
Jeżeli użyje się cieniowania Gourauda, to jasność wzdłuż wielokąta jest liniowo interpolowana między jasnością rozświetlenia a mniejszymi jasnościami sąsiednich wierzchołków, rozprzestrzeniając rozświetlenie po powierzchni wielokąta (rys. a). Porównajmy to z ostrym spadkiem jasności rozświetlenia występującym wówczas, gdy wykorzystuje się normalne interpolowane liniowo do n obliczenia czynnika cos w każdym pikselu (rys. b)
Jeżeli rozświetlenie nie trafia na wierzchołek, to cieniowanie Gourauda może je całkowicie pominąć (rys. c), ponieważ żaden punkt wewnętrzny nie może być jaśniejszy od najjaśniejszego wierzchołka, od którego zaczyna się interpolacja. Przy cieniowaniu Phonga jest możliwe usytuowanie rozświetlenia wewnątrz wielokąta (rys. d).
Porównajmy rozświetlenia na piłce
Nawet dla modelu oświetlenia, w którym nie bierze się pod uwagę współczynnika odbicia zwierciadlanego, wyniki interpolacji wektora normalnego są na ogół lepsze od interpolacji jasności, ponieważ w każdym punkcie jest używana aproksymacja normalnej. To w większości przypadków redukuje problemy pasm Macha, ale znacznie zwiększa koszt cieniowania w bezpośredniej implementacji, ponieważ interpolowana normalna musi być normalizowana za każdym razem, gdy jest używana w modelu oświetlenia. Duff opracował kombinację równań różnicowych i tablicę pośrednią dla przyspieszenia obliczeń. Bishop i Weimer pokazują doskonałą aproksymację cieniowania Phonga przy wykorzystaniu rozwinięcia w szereg Taylora, które oferuje większy wzrost szybkości cieniowania.
Jest wiele problemów wspólnych dla tych wszystkich modeli interpolowanego cieniowania Oto kilka najważniejszych: szkielet wielokątowy, zakłócenia perspektywiczne, zależność od orientacji, wspólne wierzchołki, niereprezentatywne normalne związane z wierzchołkiem.
Szkielet wielokątowy. Niezależnie od tego, jak dobrą aproksymację powierzchni krzywoliniowej daje interpolowany model cieniowania, widoczny jest szkielet wielokątowy krawędzi siatki. Możemy tę sytuację poprawić dzieląc powierzchnię na większą liczbę mniejszych wielokątów, ale wiąże się to z odpowiednim wzrostem kosztów.
Wprowadzane są pewne anomalie, ponieważ interpolacja jest wykonywana po przekształceniu perspektywicznym w układzie współrzędnych ekranu 3D, a nie w układzie WC. Na przykład interpolacja liniowa powoduje, że parametr cieniowania na rysunku jest zwiększany o stałą wartość przy przejściu od linii do linii wzdłuż każdej krawędzi. Zastanówmy się, co się stanie, jeżeli wierzchołek 1 jest bardziej odległy niż wierzchołek 2.
Skrót perspektywiczny oznacza, że różnica między kolejnymi liniami nie przekształconej wartości z wzdłuż krawędzi wzrasta w kierunku dalszej współrzędnej. Dlatego jeżeli y s = (y 1 + y 2 )/2, to I s = (I 1 + I 2 )/2, ale z s nie będzie równocześnie równe (z 1 + z 2 )/2. Ten problem można zredukować korzystając z większej liczby mniejszych wielokątów. Zmniejszenie wielkości wielokątów zwiększa liczbę punktów, w których jest próbkowana informacja, która ma być interpolowana, i stąd wzrasta dokładność cieniowania.
Wyniki uzyskiwane za pomocą modeli cieniowania z interpolacją zależą od orientacji rzutowanych wielokątów. Ponieważ wartości są interpolowane między wierzchołkami, a następnie wzdłuż poziomych linii przeglądania, wyniki mogą się różnić przy obracaniu wielokąta (rysunek). Ten efekt jest szczególnie oczywisty, gdy orientacja zmienia się wolno między kolejnymi ramkami animacji.
Podobny problem może również wystąpić przy określaniu powierzchni widocznych, gdy wartość z w każdym punkcie jest interpolowana na podstawie wartości z przypisanych do każdego wierzchołka. Oba problemy można rozwiązać dekomponując wielokąty na trójkąty. Duff sugeruje metody interpolacji niezależne od obrotów, które rozwiązują ten problem bez potrzeby dekompozycji Są to jednak kosztowne metody.
Nieciągłości cieniowania mogą wystąpić wówczas, gdy dwa sąsiednie wielokąty nie mają wspólnego wierzchołka, który leży na ich wspólnej krawędzi. Weźmy pod uwagę trzy wielokąty z rysunku. Wierzchołek C jest wspólny dla dwóch wielokątów z prawej strony, nie jest natomiast wspólny dla dużego wielokąta z lewej strony. Informacja o cieniowaniu określona bezpośrednio w C dla wielokątów z prawej strony na ogół nie będzie taka sama jak informacja interpolowana w tym punkcie na podstawie wartości A i B dla wielokąta z lewej strony. W wyniku powstanie nieciągłość w cieniowaniu.
Nieciągłość tę można wyeliminować umieszczając w wielokącie z lewej strony dodatkowy wierzchołek, który niesie wspólną informację o cieniowaniu. W celu wyeliminowania tego problemu możemy wstępnie przetworzyć wielokątową bazę danych. Jeżeli wielokąty będą dzielone na bieżąco (to znaczy z wykorzystaniem algorytmu wyznaczania powierzchni widocznych z drzewem BSP), to można wprowadzić nowy wierzchołek do współdzielonej krawędzi.
Drzewo BSP (BSP - Binary Space Partition) - drzewo podziału binarnego przestrzeni jest to struktura danych stosowana w grafice komputerowej służąca do: opisywania wielokątów, nawet wielokątów "z dziurami umożliwia szybsze stwierdzenie czy punkt leży wewnątrz/na zewnątrz figury, co jest wykorzystywane m.in. w zadaniach interakcji z użytkownikiem w programach graficznych; opisywania brył zbudowanych z siatek wielokątów jednym z zastosowań jest wykonywanie na bryłach geometrycznych operacji boolowskich: suma, część wspólna, różnica opisywania całych scen trójwymiarowych łatwiejsza detekcja kolizji (istotne w grach komputerowych) łatwiejsze śledzenie promieni oraz usuwanie niewidocznych powierzchni
Drzewo BSP to drzewo binarne, które powstaje poprzez rekurencyjny podział przestrzeni za pomocą hiperpłaszczyzn (proste w przestrzeni 2D, płaszczyzny w 3D, itd.), W węźle drzewa znajduje się obiekt który leży na hiperpłaszczyźnie, natomiast w obu poddrzewach zapisane są wszystkie obiekty, które w całości leżą po danej stronie hiperpłaszczyzny. Jeśli obiektu nie da się zakwalifikować, musi zostać podzielony, tak aby stało się to możliwe. Na głębokość drzewa BSP oraz jego zrównoważenie ma wpływ wybór hiperpłaszczyzn dzielących.
Wadą drzew BSP jest powolny proces tworzenie takiej struktury. Dlatego nie nadają się do opisu np. dynamicznych scen trójwymiarowych, gdzie obiekty przemieszają się, są dodawane lub usuwane. Często jednak są stosowane rozwiązania hybrydowe Jeśli statyczna część sceny jest duża, wówczas jest ona opisywana za pomocą drzewa BSP, natomiast części ruchome (np. drzwi budynków, ściany które mogą zostać usunięte) przechowywane są w jakiś inny sposób.
Na rysunku powyżej pokazano, w jaki sposób tworzone jest drzewo BSP opisujące wielokąt wklęsły. Widać, że dwie krawędzie musiały zostać podzielone (e-d, f-g). W tym przykładzie proste dzielące pokrywają się z krawędziami figury (tak jest najczęściej). Czarne kwadraciki oznaczają puste poddrzewo.
Obliczone normalne związane z wierzchołkami mogą nie reprezentować dokładnie geometrii powierzchni. Na przykład, jeżeli obliczymy normalne związane z wierzchołkami na zasadzie uśredniania normalnych do powierzchni mających wspólny wierzchołek, to wszystkie normalne związane z wierzchołkiem z rysunku będą do siebie równoległe.
Da to w efekcie niewielką zmianę albo w ogóle brak zmiany w cieniowaniu dla odległego źródła światła Dalsza dekompozycja wielokątów przed obliczeniem normalnej związanej z wierzchołkiem rozwiąże ten problem.
Przedstawione problemy stymulowały wiele prac nad algorytmami bezpośredniego renderingu dla powierzchni krzywoliniowych. Algorytmy wielokątowe są jednak na tyle szybsze (i łatwiejsze), aby wciąż stanowić podstawę większości systemów renderingu.