Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu Mirosław Głowacki
Cieniowanie Bardzo ważnym elementem sceny jest oświetlenie. To właśnie odpowiednie dobranie oświetlenia sprawia, że cała trójwymiarowa scena nabiera prawdziwej głębi 1. etap - kalkulacja oświetlenia obliczane są wektory natężenia światła dla każdego z wierzchołków trójkątów tworzących scenę 3D (lub nawet dla każdego piksela) 2. etap - zostają one zamienione na odpowiednią jasność na powierzchniach wielokątów z nałożonymi nań teksturami Drugi etap generowania trójwymiarowego obrazu nazywa się cieniowaniem (ang. shading) Niektórzy używają tego pojęcia dla całości procesu, ale to dwa oddzielne typy algorytmów
Oświetlanie sceny Obliczenia związane z oświetleniem polegają na określeniu współrzędnych oraz typów źródeł światła punktowe, rozproszone, ruchome i obliczaniu natężenia promieniowania w każdym z wierzchołków W wyniku tego procesu do poszczególnych punktów sceny zostają przypisane wektory określające natężenie światła w danym miejscu Karty graficzne wyposażone w moduł T&L (Transform & Lighting) wykonują najbardziej czasochłonne obliczenia związane z oświetleniem samodzielnie, bez udziału procesora głównego
Efekt oświetlania i cieniowania
Oświetlenie światłem otoczenia W najprostszych rozwiązaniach zakłada się, że światło dociera ze wszystkich kierunków Zakłada się wtedy stałe oświetlenie obiektów niezależnie od ich pozycji i orientacji Powstały obraz jest mało realistyczny ponieważ bardzo niewiele rzeczywistych scen jest oświetlanych w ten sposób
Pokój z kamerą oświetlony przez światło otoczenia
Oświetlanie punktowym źródłem światła jasność obiektu zmienia się w zależności od kierunku i odległości od źródła kierunkowym źródłem światła źródło światła znajduje się daleko od oświetlanego obiektu i promienie są równoległe stosowanie barwnych świateł i powierzchni model oświetlenia Warna światło jest modelowane jako odbicie zwierciadlane od jednego punktu oświetlanego przez punktowe źródło światła wieloma źródłami światła
Rendering waz model oświetlenia Cooka- Torrence a: a) plastik, b) miedź
Samochód oświetlony przez pięć świateł ze sterowaniem Warna
Oświetlanie klapy Warna odpowiednik przysłon reflektorów fotograficznych stożki Warna światło rozchodzi się tylko w obszarze ograniczonym stożkiem z wierzchołkiem w źródle światła modele oświetlenia mające podłoże fizyczne
Cieniowanie Istnieje wiele metod cieniowania. Najważniejsze z nich to: cieniowanie płaskie cieniowanie interpolacyjne Gourauda cieniowanie Phong a
Cieniowanie płaskie Cieniowanie płaskie (ang. flat shading) jest najprostszą metodą cieniowania. Polega ono na przyporządkowaniu całej powierzchni trójkąta jednego poziomu jasności oraz uwzględnieniu barwy w przypadku gdy na scenie, rozstawione są kolorowe źródła światła. Poziom jasności i barwa są określane przez jeden z jego wierzchołków zazwyczaj przez znajdujący się najbliżej obserwatora
Cieniowanie płaskie Oznacza to, że każdemu trójkątowi przypisuje się jeden ściśle określony odcień, niezależnie od otaczających go wielokątów. Zakłada się wtedy również rozproszone odbicie światła Niestety, rezultaty cieniowania płaskiego nie są zadowalające, gdyż szczególnie na okrągłych przedmiotach (np. kulach) uzyskuje się efekt kanciastości obiektów, wynikający z gwałtownych zmian jasności przylegających do siebie trójkątów.
Indywidualne cieniowanie płaskie
Cieniowanie płaskie i cieniowanie Gourauda
Cieniowanie Gourauda Cieniowanie to (ang.gouraud shading) zakłada, iż pojedynczy odcień wnętrza każdego trójkąta powstaje z uśrednienia (interpolacji) kolorów i natężenia światła występujących w każdym z jego wierzchołków niejako uwzględniona zostaje jasność sąsiednich wielokątów
Cieniowanie płaskie i cieniowanie Gourauda
Cieniowanie wielokątów metodą Gourauda z odbiciem rozproszonym
Cieniowanie Gourauda Często w metodzie tej wnętrzu trójkąta przypisuje się nie jeden, ale kilka różnych poziomów jasności Otrzymane są one przez interpolacje natężenia światła wzdłuż linii przechodzącej przez trójkąt i biegnącej od obserwatora do punktu w nieskończoności (zwierciadlane odbicie światła).
Cieniowanie Gourauda W ten sposób zostają zachowane płynne przejścia poziomów jasności pomiędzy poszczególnymi wielokątami, Nie ma przylegających do siebie obszarów o drastycznie różnych poziomach natężenia światła. Co ciekawe, cieniowanie Gourauda wywołuje złudzenie gładkości sferycznych obiektów złożonych nawet z niewielkiej liczby trójkątów
Cieniowanie wielokątów metodą Gourauda z odbiciem zwierciadlanym
Cieniowanie Phonga Spośród klasycznych, najbardziej zaawansowanym i skomplikowanym pod względem obliczeniowym sposobem odwzorowywania jasności obiektów jest cieniowanie Phonga (ang. Phong shading), nazywane też techniką per-pixel lighting. W metodzie tej kolor i natężenie światła przyporządkowywane są oddzielnie do każdego punktu sceny 3D - piksela obrazu W metodzie tej interpolacji podlega wektor normalny do powierzchni na podstawie normalnych wektorów węzłowych. Jasność wewnątrz trójkąta może się zatem wyraźnie różnić od wartości węzłowych
Wielokąty cieniowane metodą Phonga z odbiciem zwierciadlanym
Cieniowanie Phonga z krzywoliniową interpolacją kształtu obiektów Często w celu poprawienia wyglądu sceny stosuje się krzywoliniową metodę modelowania niektórych powierzchni
Powierzchnie krzywoliniowe z odbiciem zwierciadlanym
Zastosowanie wielu źródeł światła w stosunku do sceny Obrazy oświetlone jednym źródłem światła nie zawsze wyglądają naturalnie. Często w celu poprawienia wyglądu sceny stosuje się oświetlanie bardziej złożone, uwzględniające wiele źródeł światła, odbicia światła, itp. Dodatkowe efekty daje nałożenie tekstury
Ulepszony model oświetlania i wiele świateł
Cieniowanie z odwzorowaniem tekstury
Odwzorowanie z oddziaływaniem wzajemnym obiektów oświetlenie globalne W celu dalszej poprawy jakości obrazu stosuje się wzajemne oddziaływanie obiektów: mapowanie środowiska, algorytmy z oświetleniem globalnym Oddziaływanie takie może dotyczyć oświetlenia pochodzącego od obiektów sceny oraz być uzupełnione innymi efektami, takimi jak odbicia
Odwzorowanie z oddziaływaniem wzajemnym obiektów
Obraz z odbiciami
Śledzenie promieni Algorytm uwzględnia cienie, załamania i odbicia Występują promienie pierwotne i wtórne pochodzące od odbić, załamań, itp. Odbicia i załamania światła mogą być wielokrotne
Śledzenie promieni klatka z filmu Quest
Śledzenie promieni: funkcje do modyfikacji barw, normalnych do powierzchni i przezroczystości prawie w każdym pikselu
Algorytm śledzenia promieni Z punktu w którym znajduje się obserwator wyprowadzany jest promień pierwotny, który przecina rzutnię. Wyszukiwany jest najbliższy punkt przecięcia z obiektami znajdującymi się na scenie. Następnie dla każdego źródła światła zdefiniowanego na scenie wyznaczana jest jasność w tym punkcie, zgodnie z określonym modelem oświetlenia (np. Lamberta czy Phonga). Najczęściej także określa się cienie w tym celu jest testowana widoczność źródła światła z danego punktu, tj. czy światło nie jest przesłaniane przez jakiś obiekt i jeśli nie dopiero wtedy oblicza się jasność punktu dla tego źródła.
Algorytm rekurencyjny śledzenia promieni W algorytmie rekurencyjnym jeśli punkt przecięcia należy do obiektu odbijającego światło lub przezroczystego, wysyłane są z tego punktu promienie wtórne: promień odbity promień załamany i algorytm rekursywnie powtarza się od drugiego kroku. W większości przypadków ogranicza się liczbę zejść rekurencyjnych. Kolor punktu wyznaczany jest dopiero, gdy znane są wyniki przetwarzania promieni wtórnych. Zwykle projektant podaje procentowo wpływ kolorów z promieni wtórnych, tj. określa stopień odbicia/załamania światła przez obiekt.
Śledzenie promieni
Śledzenie promieni - przykład Obserwator znajduje się w punkcie O Na scenie umieszczone zostały dwa światła L1 i L2 oraz trzy obiekty: a (elipsa): nieprzezroczysty, nie odbija światła, b (koło): przezroczysty, odbija światło, c (prostokąt): tylko odbija światło. Z punktu O wyprowadzany jest promień pierwotny (zielony), który trafia w obiekt b Ponieważ odbija i załamuje światło, toteż z punktu przecięcia wypuszczane są dwa promienie wtórne: odbity (czerwony) i załamany (niebieski). Promień odbity trafia z kolei w obiekt a tutaj już nie są generowane żadne promienie wtórne. Z kolei promień załamany znów trafia w obiekt b i ponownie ulega załamaniu (tak naprawdę powinien tutaj być jeszcze promień odbity, ale ze względu na przejrzystość rysunku został pominięty). Ten promień trafia w obiekt c, który odbija światło, toteż generowany jest tylko jeden promień wtórny (odbity), który jednak nie przecina się z żadnym obiektem na scenie i na tym kończy się analiza. Kreskami przerywanymi zaznaczono pomocnicze promienie, służące określeniu widoczności świateł w punktach przecięcia (dla punktów obiektu b te promienie nie zostały narysowane) Jak widać zarówno inne obiekty (b) jak i sam obiekt (a) może blokować światło.
Metoda energetyczna Brana jest pod uwagę zasada zachowania energii promieni świetlnych w środowisku zamkniętym Całkowita energia emitowanana lub odbijana przez jedną powierzchnię jest odbijana lub pochłaniana przez inne powierzchnie We wcześniej prezentowanych rozwiązaniach źródło światła i powierzchnie przez nie oświetlane były traktowane oddzielnie Metoda energetyczna zakłada, że każda powierzchnia może emitować światło Źródła światła zawsze mają pewną powierzchnię Powierzchnie dzieli się na niewielkie płaty Rozpraszające powierzchnie są zabarwione barwami innych powierzchni
Sześcian (na rysunku brak emitującej białej ściany przedniej). Metoda energetyczna zdjęcie (a) z widocznym efektem rozlewania barwy, rendering klasyczny przy 49 płatach na ścianę (b i c) - cieniowanie stałe (b) i interpolowane (c)
Efekty specjalne Ostatnim etapem renderingu sceny 3D jest dodanie tzw. efektów atmosferycznych (ang. atmospheric effects). Nazwa ta niezbyt dobrze oddaje sens nakładanych na scenę elementów, gdyż oprócz typowych zjawisk atmosferycznych, takich jak mgły, opary nad lustrem wody, falowanie rozgrzanego powietrza, mżawka, zalicza się do nich dym, ogień oraz zmętnienia lustra wody, itp.
Efekt mgły W programach najczęściej wykorzystywanym efektem atmosferycznym jest mgła (ang. fog). Tworzy się ją za pomocą czterech różnych technik: mgła liniowa tablica mgieł mgła wykładnicza mgła wolumetryczna
Efekt mgły
Mgła w tle
Mgła liniowa Najprostszą z technik tworzenia jest tzw. mgła liniowa (ang. linear fog). Stosowanie tej metody polega na liniowym zamgleniu obiektów wraz ze wzrostem ich odległości od obserwatora. Wykorzystuje się w tym przypadku funkcje liniowe
Tablica mgieł Lepszą i częściej stosowaną metodą jest tzw. tablica mgieł (ang. table fog). W tym przypadku stopień zamglenia, zależny od odległości od obserwatora, zapisany jest w przygotowanej uprzednio tablicy. Ta metoda doskonale się sprawdza w przypadku tworzenia takich efektów, jak opary nad powierzchnią jeziora, nieciągłe smugi mgły nad bagnami itp.
Mgła wykładnicza Trzecim sposobem otrzymywania mgły jest tzw. mgła wykładnicza (ang. Expotential fog). W działaniu przypomina ona efekty uzyskiwane za pomocą tablicy mgieł, lecz nie wymaga się w tym przypadku predefiniowania stopni zamglenia, które obliczane są na bieżąco na podstawie zaprogramowanej funkcji wykładniczej.
Mgła wolumetryczna (ang. volumetric fog). Do jej tworzenia wykorzystywane są półprzezroczyste tekstury trójwymiarowe. Mgła zbudowana jest z warstw o różnej gęstości, co pozwala na wyjątkowo realne odwzorowanie otaczającego nas świata.
Zamglenie tła W realnym świecie, odległe obiekty, jak np. góry na horyzoncie, zawsze są widziane dosyć niewyraźnie. Z tym problemem akceleratory 3D radzą sobie w identyczny sposób jak w przypadku mgły wykładniczej obrazy obiektów rozmazywane są wraz ze wzrostem ich odległości od obserwatora.
Sygnalizacja głębokości Efekt ten (ang. depth cueing) polega na wykładniczej zmianie koloru i odcienia przedmiotu w zależności od dystansu od obserwatora im jest on większy, tym mniej wyraźnie widać nawet duże obiekty.
Rasteryzacja Etap zamiany wszystkich parametrów generowanej sceny na zbiór pikseli gotowych do wysłania na monitor nazywa się rasteryzacją. Wykonuje go specjalizowany moduł znajdujący się wewnątrz każdego, nawet najprostszego układu graficznego, nazywany jednostką rasteryzującą.
Rasteryzacja Rasteryzacja nie dotyczy wyłącznie grafiki 3D, ale również dostosowywania płaskiego obrazu, np. z edytora tekstu, do wyświetlenia go na ekranie monitora, który składa się z matrycy punktów o ustalonym z góry wymiarze (rozdzielczości), np. 1024 768 pikseli. W trakcie procesu dopasowywania wszystkie obiekty, jak np. okręgi, muszą zostać narysowane za pomocą ograniczonej liczby pikseli.
Rasteryzacja Każdemu punktowi sceny przyporządkowane są trzy współrzędne: x, y, z. Przeniesienie dwóch pierwszych wartości na obraz dwuwymiarowy nie stanowi problemu Współrzędna z określa zaś odległość obiektu od płaszczyzny ekranu. W większości programów wykorzystuje się 16-bitową głębię, która umożliwia odwzorowanie 65 536 pozycji obiektu W aplikacjach inżynierskich oraz przy tworzeniu profesjonalnej grafiki używa się 24 lub nawet 32 bitowej głębi.
Techniki towarzyszące rasteryzacji Najważniejszymi technikami towarzyszącymi rasteryzacji są: z bufor bufor szablonowy antyaliasing dithering
z - bufor Podczas odwzorowywania trójwymiarowej sceny na obraz dwuwymiarowy jednostka rasteryzująca przechowuje wyniki swojej pracy w wydzielonej pamięci lokalnej akceleratora 3D, nazywanej buforem ramki (ang. frame buffer). To właśnie z tego obszaru w ostatniej fazie generowania obrazu na ekran monitora wysłana zostanie gotowa, pojedyncza klatka tworzonej sceny 3D.
z - bufor W pamięci RAM karty graficznej wydzielona zostaje również matryca odpowiadająca swoją wielkością rozdzielczości ekranu, a głębokością 16, 24 lub 32 bitom, w zależności od zastosowanej głębi współrzędnej z. Ten duży objętościowo fragment pamięci lokalnej karty, mający za zadanie przechowywać dane o współrzędnej z nazywany jest z-buforem (ang. z-buffer).
Z - bufor Zasada działania bufora z polega na tym, że np. dla dwóch trójkątów przed ich narysowaniem porównuje się ich współrzędne z z wartością zapamiętaną w z-buforze. Jeśli nowy rysowany punkt ma wartość niższą (to znaczy zasłania poprzedni obiekt), jest rysowany Cały proces powtarzany jest dla każdego obiektu generowanej sceny 3D.
Z - bufor Zastosowanie Z-bufora pozwala znacząco odciążyć jednostkę rasteryzującą akceleratora, która w przeciwnym razie musiałaby narysować zupełnie niepotrzebnie wiele dodatkowych trójkątów. Z drugiej strony technika ta skutecznie obciąża wewnętrzną magistralę pamięci karty, powodując zatory w dostępie do danych.
Z bufor
Bufor szablonowy Większość nowoczesnych akceleratorów wyposażona jest w tzw. bufor szablonowy (ang. stencil buffer) stosowany m.in. po to, aby zmniejszyć obciążenie procesora graficznego i magistrali pamięci. Może on zostać wykorzystany na kilka sposobów, jednak najczęściej programiści posługują się nim w symulatorach lotu lub jazdy samochodem. W tym przypadku najpierw tworzony jest szablon deski rozdzielczej lub kokpitu, który następnie umieszczany jest w buforze. Następnie akcelerator renderuje grafikę 3D tylko w miejscu nie zakrytym przez szablon Po wygenerowaniu sceny nakłada się oba obrazy na siebie.
Bufor szablonowy
Bufor szablonowy Do tego zadania wystarczy bufor jednobitowy Większość układów graficznych dysponuje 8 bitowym buforem szablonowym. Dzięki nim można uzyskać dodatkowe efekty, jak ślady po hamowaniu samochodu, plamy oleju na jezdni czy tzw. cienie wolumetryczne (ang. volumetric shadow) dokładnie odwzorowujące kształt rzucających je przedmiotów.
Wykorzystanie bufora szablonowego do tworzenia cienia
Antyaliasing Ponieważ ekran ma ograniczoną rozdzielczość rysując ukośną linię czy też granicę pomiędzy dwoma kolorami, zapalają się piksele znajdujące się najbliżej teoretycznego przebiegu linii (rasteryzacja odcinka). Taki sposób rysowania powoduje powstanie schodkowatych odcinków, a im niższa rozdzielczość, tym większe wrażenie schodkowatości. Aby się pozbyć tego efektu, w kartach zastosowano specjalne techniki nazywane antyaliasingiem.
Antyaliasing Można wyróżnić dwa główne typy antyaliasingu: krawędziowy pełnoekranowy
Antyaliasing
Antyaliasing krawędziowy Najczęściej wykorzystywaną metodą jest antyaliasing krawędziowy (ang. Edge Anti- Aliasing), polegający na odpowiednim rozmywaniu krawędzi wzdłuż rysowanej linii czy granicy kolorów. Procedury antyaliasingu wymagają znacznej mocy obliczeniowej, dlatego w większości wypadków nie wygładza się wszystkich widocznych na ekranie linii, lecz tylko tę część z nich, która najbardziej wpływa na wygląd generowanej sceny
Antyaliasing pełnoekranowy Sposób realizacji pełnoekranowego antyaliasingu (ang. Full Scene Anti-Aliasing) jest różny w zależności dla różnych procesorów graficznych. Niektóre procesory graficzne przetwarzają każdą klatkę w dwukrotnym powiększeniu, a następnie przeskalowują ją do żądanej wielkości Inne karty używają bufora akumulacyjnego, tzw. T- bufora. Umieszczane są w nim dwie lub cztery identyczne ramki obrazu, Każda z nich jest minimalnie przesuwana względem pozostałych po czym następuje ich zlanie w jeden obraz
Antyaliasing pełnoekranowy Niezależnie od stosowanej metody antyaliasingu pełnoekranowego ilość danych, które trzeba wygenerować, jest zawsze dwu - lub czterokrotnie większa od ilości normalnej, tj. bez wygładzania krawędzi, co prowadzi do poważnego spadku wydajności. Stosowanie tej metody powoduje jednak, że w odróżnieniu od antyaliasingu krawędziowego cały obraz na ekranie monitora pozbawiony jest schodków.
Dithering Dla 24-bitowej głębi barw dostępnych jest aż 16 777 216 odcieni. Jednak w przypadku czasami wykorzystywanego trybu 16-bitowego liczba ta spada do 65 536. Aby więc oddać brakujące w 16-bitowej palecie barwy, stosuje się metodę nazywaną ditheringiem. Polega ona na symulacji niedostępnego w systemie koloru poprzez kompozycję kilku zbliżonych do niego barw z dostępnej palety. Może to doprowadzić jednak do obniżenia jakości wyświetlanego obrazu, efektu - ziarnistości.
Dithering 16 bitowa-paleta kolorów obraz po ditheringu 24 bitowa-paleta kolorów obraz nie wymaga ditheringu
Głębia ostrości uzyskana metodą przetwarzania końcowego