Transformacje. dr Radosław Matusik. radmat

Podobne dokumenty
Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38

Oświetlenie. Modelowanie oświetlenia sceny 3D. Algorytmy cieniowania.

Animowana grafika 3D. Opracowanie: J. Kęsik.

Plan wykładu. Akcelerator 3D Potok graficzny

Oświetlenie obiektów 3D

GRK 4. dr Wojciech Palubicki

0. OpenGL ma układ współrzędnych taki, że oś y jest skierowana (względem monitora) a) w dół b) w górę c) w lewo d) w prawo e) w kierunku do

Model oświetlenia. Radosław Mantiuk. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie

2 Przygotował: mgr inż. Maciej Lasota

Grafika Komputerowa Wykład 4. Synteza grafiki 3D. mgr inż. Michał Chwesiuk 1/30

Synteza i obróbka obrazu. Tekstury. Opracowanie: dr inż. Grzegorz Szwoch Politechnika Gdańska Katedra Systemów Multimedialnych

Przekształcenia geometryczne w grafice komputerowej. Marek Badura

Animowana grafika 3D. Opracowanie: J. Kęsik.

1. Prymitywy graficzne

GRAKO: ŚWIATŁO I CIENIE. Modele barw. Trochę fizyki percepcji światła. OŚWIETLENIE: elementy istotne w projektowaniu

rgbf<składowa_r,składowa_g,składowa_b,filter>. Dla parametru filter przyjmij kolejno wartości: 0.60, 0.70, 0.80, 0.90, 1.00, np.:

Obraz jako funkcja Przekształcenia geometryczne

Przekształcenia geometryczne. Mirosław Głowacki Wydział Inżynierii Metali i Informatyki Przemysłowej

3. Macierze i Układy Równań Liniowych

Programowanie gier komputerowych Tomasz Martyn Wykład 6. Materiały informacje podstawowe

Transformacje obiektów 3D

6 Przygotował: mgr inż. Maciej Lasota

Grafika Komputerowa Wykład 6. Teksturowanie. mgr inż. Michał Chwesiuk 1/23

Bartosz Bazyluk SYNTEZA GRAFIKI 3D Grafika realistyczna i czasu rzeczywistego. Pojęcie sceny i kamery. Grafika Komputerowa, Informatyka, I Rok

Modelowanie i wstęp do druku 3D Wykład 1. Robert Banasiak

Technologie Informacyjne

Programowanie Procesorów Graficznych

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Grafika 3D program POV-Ray - 1 -

Elementy geometrii analitycznej w R 3

Grafika komputerowa Wykład 4 Geometria przestrzenna

Automatyczne tworzenie trójwymiarowego planu pomieszczenia z zastosowaniem metod stereowizyjnych

Ustawienia materiałów i tekstur w programie KD Max. MTPARTNER S.C.

GRAFIKA RASTROWA. WYKŁAD 1 Wprowadzenie do grafiki rastrowej. Jacek Wiślicki Katedra Informatyki Stosowanej

dr Mariusz Grządziel 15,29 kwietnia 2014 Przestrzeń R k R k = R R... R k razy Elementy R k wektory;

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

OpenGL oświetlenie. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska

Przekształcanie wykresów.

GRK 5. dr Wojciech Palubicki

3 Przygotował: mgr inż. Maciej Lasota

Ćwiczenia nr 4. TEMATYKA: Rzutowanie

GRK 2. dr Wojciech Palubicki

Grafika komputerowa Tekstury

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

GRAFIKA KOMPUTEROWA. Plan wykładu. 1. Początki grafiki komputerowej. 2. Grafika komputerowa a dziedziny pokrewne. 3. Omówienie programu przedmiotu

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Z ostatniego wzoru i zależności (3.20) można obliczyć n6. Otrzymujemy (3.23) 3.5. Transformacje geometryczne

macierze jednostkowe (identyczności) macierze diagonalne, które na przekątnej mają same

OpenGL i wprowadzenie do programowania gier

Obrót wokół początku układu współrzędnych o kąt φ można wyrazić w postaci macierzowej następująco

1 Wstęp teoretyczny. Temat: Manipulowanie przestrzenią. Grafika komputerowa 3D. Instrukcja laboratoryjna Układ współrzędnych

Grafika komputerowa. Model oświetlenia. emisja światła przez źródła światła. interakcja światła z powierzchnią. absorbcja światła przez sensor

Krystalochemia białek 2016/2017

1. Oświetlenie Materiały i powierzchnie

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

Wykład 14. Elementy algebry macierzy

GRAFIKA KOMPUTEROWA podstawy matematyczne. dr inż. Hojny Marcin pokój 406, pawilon B5 Tel.

Karty graficzne możemy podzielić na:

OpenGL Światło (cieniowanie)

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

GRK 5. dr Wojciech Palubicki

Przekształcenia geometryczne. Dorota Smorawa

Karta graficzna karta rozszerzeo odpowiedzialna generowanie sygnału graficznego dla ekranu monitora. Podstawowym zadaniem karty graficznej jest

Zaawansowana Grafika Komputerowa

Grafika komputerowa Wykład 10 Modelowanie oświetlenia

DesignCAD 3D Max 24.0 PL

OpenGL Światło (cieniowanie)

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Zadanie polega na zbudowaniu i wyświetleniu przykładowej animowanej sceny przedstawiającej robota spawalniczego typu PUMA.

Zjawisko widzenia obrazów

Języki formalne i automaty Ćwiczenia 5

Tworzenie gier na urządzenia mobilne (zaoczne)

Notacja Denavita-Hartenberga

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

Algebra WYKŁAD 3 ALGEBRA 1

VII. WYKRESY Wprowadzenie

Co należy zauważyć Rzuty punktu leżą na jednej prostej do osi rzutów x 12, którą nazywamy prostą odnoszącą Wysokość punktu jest odległością rzutu

SPRAWDZIAN NR 1. I promienie świetlne nadal są równoległe względem siebie, a po odbiciu od powierzchni II nie są równoległe względem siebie.

Wykład 4. Rendering (1) Informacje podstawowe

SPRAWDZIAN NR Na zwierciadło sferyczne padają dwa promienie światła równoległe do osi optycznej (rysunek).

Scena 3D. Cieniowanie (ang. Shading) Scena 3D - Materia" Obliczenie koloru powierzchni (ang. Lighting)

Architektura Procesorów Graficznych

Grafika komputerowa. Dla DSI II

3. FUNKCJA LINIOWA. gdzie ; ół,.

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny

Temat: Transformacje 3D

Gry komputerowe: efekty specjalne cz. 2

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

i = [ 0] j = [ 1] k = [ 0]

Karta przedmiotu. Podstawy programowania procesorów graficznych. realizowanego w ramach projektu PO WER

Trójwymiarowa grafika komputerowa rzutowanie

; B = Wykonaj poniższe obliczenia: Mnożenia, transpozycje etc wykonuję programem i przepisuję wyniki. Mam nadzieję, że umiesz mnożyć macierze...

Rzutowanie. dr Radosław Matusik. radmat

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

Badanie przy użyciu stolika optycznego lub ławy optycznej praw odbicia i załamania światła. Wyznaczanie ogniskowej soczewki metodą Bessela.

1. Opis okna podstawowego programu TPrezenter.

1. Podstawowe algorytmy techniki rastrowe a) dwa przecinające się odcinki mogą nie mieć wspólnego piksela (T) b) odcinek o współrzędnych końcowych

Autodesk 3D Studio MAX Teksturowanie modeli 3D

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

Transkrypt:

www.math.uni.lodz.pl/ radmat

Cel wykładu Celem wykładu jest prezentacja m.in. przestrzeni modelu, świata, kamery oraz projekcji, a także omówienie sposobów oświetlania i cieniowania obiektów.

Pierwsze gry 3D W pierwszych grach 3D nawet tak podstawowe czynności, jak np. rysowanie linii było realizowane przez programistów odpowiedzialnych za tworzenie w grach grafiki. Zestaw algorytmów, który jest potrzebny do rysowania obiektów 3D jako 2D nosi nazwę rasteryzacji programowej. W wielu kursach grafiki komputerowej to zagadniene zajmuje istotne miejsce. Ale aktualnie używane komputery posiadają dedykowane procesory graficzne (GPU - Graphic Processing Unit), które umożliwiają rysowanie podstawowych obiektów, takich jak punkty, linie, czy trójkąty. W związku z powyższym w nowoczesnych grach nie muszą być implementowane algorytmy rasteryzacji. Zamiast dostarczania karcie graficznej danych potrzebnych do renderowania sceny 3D, używane są biblioteki graficzne, takie jak OpenGL czy DirectX.

Wielokąty Obiekty 3D można przedstawiać w grach na wiele sposobów. Jednak w zdecydowanej większości przypadków te obiekty są reprezentowane za pomocą wielokątów, m.in. trójkątów. Trójkąty są oczywiście najprostszymi wielokątami. Ponadto mamy zagwarantowane, że zawsze będą leżały w jednej płaszczyźnie, podczas gdy wielokąty, które mają cztery lub więcej wierzchołków, mogą leżeć w wielu płaszczyznach.

Rysunek: Prosta siatka modelu stworzona z trójkątów

Współrzędne W przypadku kartezjańskiego układu współrzędnych, jego początek jest centrum świata gry. Mogą jednak istnieć inne układy współrzędnych, zależne od umiejscowienia początków tych układów. Żeby w renderowaniu 3D wyświetlić na ekranie model trójwymiarowy musimy przejść przez cztery oddzielne przestrzenie współrzędnych: modelu; świata; kamery; projekcji.

Przestrzeń modelu Jeśli w naszej grze stworzymy obiekt, to wszystkie jego wierzchołki są ułożone relatywnie w stosunku do początku układu współrzędnych tego modelu. Najczęściej początek układu współrzędnych znajduje się w środku obiektu (w przypadku postaci środek układu znajduje się między jej stopami). Takie umiejscowienie początku układ współrzędnych powoduje, że w łatwy sposób można manewrować danym obiektem.

Załóżmy, że w danym poziomie gry rysujemy 100 różnych modeli obiektów. Ponieważ każdy z tych obiektów został stworzony w początku układu przestrzeni modelu, to każdy pojedynczy obiekt (w tym również nasz gracz!) jest ustawiony w początku układu. Żeby poprawnie stworzyć nasz świat gry potrzebujemy zatem dodatkowych układów współrzędnych.

Przestrzeń świata W przypadku tej przestrzeni istnieje początek układu dla całego świata gry. Każdy obiekt ma swoją pozycję i orientację, względną do początku przestrzeni świata. Kiedy dany obiekt jest wczytywany do pamięci, wszystkie jego współrzędne są wyrażone w terminach przestrzeni modelu. Zatem musimy powiedzieć karcie graficznej jedynie w którym miejscu naszej sceny (świata gry) mają zostać namalowane wszystkie obiekty (niektóre dodatkowo mogą zostać przeskalowane, inne mogą podlegać obrotom).

Operacje na obiektach W przestrzeni dwuwymiarowej (w grach 2D) będziemy chcieli wykonywać pewne podstawowe operacje na naszych obiektach, takie jak: translację (przesunięcie o wektor); skalowanie; obrót.

Translacja - przesunięcie o wektor Macierz translacji powoduje przesunięcie punktu o pewną wartość. Translacja p = [p x p y p z] T punktu p = [p x p y p z ] może być opisana przez dodanie dwóch wektorów: źródła p = [p x p y p z ] T i translacji (przesunięcia) t = [t x t y t z ] T. Wówczas otrzymujemy: p = p + t = p x p y p z + t x t y t z = p x + t x p y + t y p z + t z

Współrzędne homogeniczne Niektóre gry trójwymiarowe używają wektorów 4D. Współrzędne 4D używane w przestrzeni 3D noszą nazwę współrzędnych homogenicznych. Czwartą współrzędną określa się jako w. W wielu przypadkach współrzędna w wynosi albo 0, albo 1. Gdy w = 0, to oczywiście oznacza, że współrzędne homogeniczne reprezentują wektor 3D. Jeśli w = 1, to oznacza, że współrzędna reprezentuje punkt w przestrzeni 3D.

Operacje na macierzach i wektorach 4D Mnożenie wektora z przestrzeni 4D przez macierz o wymiarze 4 4 wygląda następująco: x y z w = x y z w a b c d e f g h i j k l m n o p x = x a + y e + z i + w m y = x b + y f + z j + w n z = x c + y g + z k + w o w = x d + y h + z l + w p

Macierz przekształcenia jest macierzą, która umożliwia przekształcenie wektora lub punktu w specyficzny sposób. Ta macierz pozwala na przekształcenie współrzędnych przestrzeni modelu do współrzędnych przestrzeni świata. Macierze przekształceń są reprezentowane w układzie wierszowym. Jeśli używamy biblioteki, która oczekuje układu kolumnowego (jak OpenGL), to należy wykonać transpozycję tej macierzy.

Następująca macierz T przesuwa punkt p = [p x p y p z ] o wektor t = [t x t y t z ]: T = 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 W konsekwencji otrzymujemy: p = p + t = 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 p x p y p z 1 = p x + t x p y + t y p z + t z 1

Załóżmy, że środek modelu znajduje się w punkcie [5, 10, 15] w przestrzeni świata. Wówczas macierz translacji przyjmuje postać T (5, 10, 15) = 1 0 0 5 0 1 0 10 0 0 1 15 0 0 0 1

Skalowanie Załóżmy, że przygotowaliśmy (np. w zewnętrznym programie) model naszego gracza. Ale w samej grze chcemy, żeby nasza postać była dwukrotnie większa. W praktyce to oznacza, że musimy pomnożyc każdy wierzchołek w modelu przez pewną macierz skalowania, która przeskaluje wektor lub jego pozycję wzdłuż współrzędnych.

Poniższa macierz S przeskaluje punkt p = [p x p y p z ] o wartość s x względem osi X, o wartość s y względem osi Y i o wartość s z względem osi Z: S = s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 Jeśli s x = s y = s z (czyli gdy mamy jednakową skalę), to oznacza, że wektor zostanie przekształcony o tę samą wartość wzdłuż wszystkich współrzędnych. Jeśli zatem skala wynosi dwa, to nasz obiekt w przestrzeni świata będzie dwukrotnie większy.

W konsekwencji otrzymujemy: p = s x 0 0 0 0 s y 0 0 0 0 s z 0 0 0 0 1 p x p y p z 1 = s x p x s y p y s z p z 1

Obrót Macierz obrotu umożliwia obrót wektora względem osi układu współrzędnych. Istnieją trzy różne macierze obrotu, jedna dla każdej osi kartezjańskiego układu współrzędnych. Macierze obrotu noszą nazwę obrotów Eulera. W poniższych macierzach zakładamy, że obrotu dokonujemy o kąt α.

Obrót w przestrzeni dwuwymiarowej Jeśli w przestrzeni 2D chcemy dokonać obrotu punktu p = [p x p y ] o kąt α, to macierz obrotu przyjmuje postać: W konsekwencji otrzymujemy: obrótxy = cos α sin α sin α cos α. p = cos α sin α sin α cos α p x p y = p x cos α p y sin α p y cos α + p x sin α

W przestrzeni trójwymiarowej obrotu dokonujemy w następujący sposób: obrótx = 1 0 0 0 0 cos α sin α 0 0 sin α cos α 0 0 0 0 1 obróty = cos α 0 sin α 0 0 1 0 0 sin α 0 cos α 0 0 0 0 1 obrótz = cos α sin α 0 0 sin α cos α 0 0 0 0 1 0 0 0 0 1

Macierz obrotu o kąt 45 względem osi Y przyjmuje postać: obróty = cos 45 0 sin 45 0 0 1 0 0 sin 45 0 cos 45 0 0 0 0 1

Zapamiętanie postaci powyższych macierzy może wydawać się trudne. Zauważmy jednak, że w każdej z powyższych macierzy ostatni wiersz i ostatnia kolumna są takie same. Zwróćmy też uwagę, że w przypadku obrotu względem osi X jedynka i zera znajdują się w pierwszym wierszu, w przypadku obrotu względem osi Y - w drugim, a w przypadku obrotu względem osi Z - w wierszu trzecim. Jeśli uda nam się zapamiętać położenie zer i jedynek (co jak widzimy jest łatwe), pozostaje nam zapamiętanie układu i znaków funkcji trygonometrycznych, które występują w macierzach przekształceń.

Często istnieje potrzeba wykonania kilku operacji na naszym obiekcie, np. i skalowanie, i obrót. Aby wykonać taką operację wystarczy pomnożyć odpowiednie macierze. Kolejność, w jakiej wykonuje się te działania jest niezwykle istotna, gdyż mnożenie macierzy nie jest przemienne. Ogólnie, w przypadku wierszowej reprezentacji macierzy otrzymujemy: macierz świata=macierz skalowania macierz obrotu macierz translacji.

Przestrzeń kamery Załóżmy, że mamy już poukładane obiekty na scenie, tj. po wykonaniu skalowania, po obrotach i translacji. Zauważmy, że cała scena może być zupełnie statyczna. Zmieniać może się natomiast położenie kamery. W tym przypadku mówimy o przestrzeni kamery lub przestrzeni widoku. Rysunek: Przestrzeń kamery

Wobec powyższego potrzebujemy kolejnej macierzy, która powie karcie graficznej w jaki sposób przekształcić obiekty z przestrzeni świata do przestrzeni współrzędnych, które są relatywne względem kamery. Dla wierszowego układu współrzędnych macierz przyjmuje następującą postać: macierzkamery = L x U x F x 0 L y U y F y 0 L z U z F z 0 T x T y T z 1,

gdzie L jest osią x, U osią y, F osią z, a T translacją. Żeby wyznaczyć macierz kamery, trzeba najpierw wyznaczyć powyższe cztery wektory. Większość bibliotek 3D ma zaimplementowane funkcje, które automatycznie wyznaczają macierz kamery. Do skonstruowania powyższej macierzy potrzebne są trzy dane wejściowe: pozycja kamery (nasze oczy); pozycja celu, na który spogląda kamera; górny wektor kamery.

Mając powyższe informacje jesteśmy w stanie wyznaczyć cztery wektory potrzebne do stworzenia macierzy kamery: function StworzWidokKamery(Vector3 oczy, Vector3 cel, Vector3 gora) { Vector3 F = Normalize(cel-oczy); Vector3 L = Normalize(iloczynWektorowy(gora, F)); Vector3 U = iloczynwektorowy(f, L); Vector3 T; T.x = -iloczynskalarny(l, oczy); T.y = -iloczynskalarny(u, oczy); T.z = -iloczynskalarny(f, oczy); } Na tym etapie świat gry został przetransformowany tak, aby mógł zostać pokazany przez kamerę. Wciąż jednak pozostaje światem trójwymiarowym i musi zostać przekonwertowany do obrazu 2D.

Przestrzeń projekcji Przestrzeń projekcji lub przestrzeń ekranu jest przestrzenią współrzędnych, w której trójwymiarowa scena jest przekształcana do sceny dwywymiarowej. Najbardziej powszechne są dwa - znane nam już - rzutowania: równoległe i perspektywiczne.

Macierz rzutowania równoległego W przypadku rzutowania równoległego do stworzenia jego macierzy potrzebne są cztery parametry: szerokość widoku; wysokość widoku; najkrótsza odległość pomiędzy kamerą, a najbliższą płaszczyzną; najkrótsza odległość pomiędzy kamerą, a najdalszą płaszczyzną.

macierzrzutowaniarownoleglego = 2 szerokość 0 0 0 2 0 wysokość 0 0 1. 0 0 0 0 dalszyplan-bliższyplan 0 bliższyplan bliższyplan-dalszyplan 1

Macierz rzutowania perspektywicznego W porównaniu z macierzą rzutowania równoległego, macierz rzutowania perspektywicznego posiada dodatkowy parametr, którym jest pole widzenia. Pole widzenia jest kątem wokół kamery, który jest widoczny w rzutowaniu. Zmieniając ten kąt decydujemy jaki fragment świata gry będzie widoczny. Znając ten kąt możemy utworzyć macierz rzutowania w następujący sposób:

przy czym skalay = ctg macierzrzutowaniaperspektywicznego = skalax 0 0 0 0 skalay 0 0 dalszyplan, 0 0 dalszyplan-bliższyplan 1 0 0 ( ) polewidzenia 2, skalax = skalay wysokość szerokość. bliższyplan dalszyplan dalszyplan-bliższyplan 0

Oświetlenie i cienie Na podstawie powyższych informacji jesteśmy w stanie rysować czarno-białe szkielety trójwymiarowych obiektów do bufora kolorów. Oczywiście taka grafika absolutnie nie jest atrakcyjna. Potrzebujemy m.in. palety kolorów, tekstur oraz oświetlenia.

Kolory Najprostszy sposób reprezentowania kolorów na trójwymiarowej scenie polega na użyciu przestrzeni kolorów RGB. Następnie należy ustlić głębię kolorów, tj. liczbę bitów przypadających na dany kolor. Jeśli przyjmiemy 8 bitów na kolor, to oznacza, że mamy 256 możliwych wartości dla kolorów czerwonego, zielonego i niebieskigo, co całkowicie daje około 16 milionów różnych kolorów. W zależności od gry może istnieć czwarty komponent, którym jest kanał alfa, który determinuje przezroczystość pikseli. Wartość kanału alfa równa 1 oznacza, że piksel jest nieprzezroczysty, natomiast wartość kanału alfa wynosząca zero ozacza, że piksel jest niewidoczny.

Rysunek: Przezroczystość pikseli przy różnych wartościach kanału alfa

Atrybuty wierzchołków Żeby dodać do obiektu kolor musimy mieć informację o każdym z wierzchołków. W mapowaniu tekstur obiekty dwuwymiarowe są mapowane na trójwymiarowe. W każdym wierzchołku współrzędna tekstury określa jaka część tekstury odpowiada wierzchołkowi. Najbardziej znanymi współrzędnymi tekstury są współrzędne UV, gdzie współrzędna x tekstury jest nazywana u, a współrzędna y nosi nazwę v. Rysunek: Odwzorowanie tekstur we współrzędnych UV

Oświetlenie Gra bez oświetlenia wygląda nudno i ponuro dlatego wiele gier 3D musi implementować jakieś formy oświetlenia. Istnieją różne typy oświetlenia, które są powszechnie używane w grach: niektóre oświetlają całą scenę, inne tylko jej fragment.

Oświetlenie otoczenia Przez oświetlenie otoczenia rozumiemy jednakową ilość światła, stosowaną do każdego pojedynczego obiektu. Ilość oświetlenia otoczenia może być różna w różnych poziomach gry. Inną ilość światła zastosujemy do sceny, na której akcja dzieje się w ciągu dnia, a inną do sceny, gdy gra toczy się nocą. Ponieważ oświetlenie otoczenia zapewnia taką samą ilość światła, to każdy obiekt na scenie jest oświetlony tak samo. Rysunek: Przykład oświetlenia otoczenia

Oświetlenie kierunkowe Oświetlenie kierunkowe nie ma określonej pozycji, ale jest emitowane z określonego kierunku. Podobnie jak w przypadku oświetlenia otoczenia, także oświetlenie kierunkowe wpływa na całą scenę. Ponieważ oświetlenie kierunkowe generowane jest z określonego kierunku, oświetla jedną stronę obiektów jednocześnie pozostawiając nieoświetloną drugą stronę. Rysunek: Przykład oświetlenia kierunkowego

Gry używające oświetlenia kierunkowego często mają tylko jeden punkt świetlny dla danego poziomu gry (np. słońce, bądź księżyc). Ale np. gra, która toczy się wieczorem na oświetlonym stadionie posiada wiele oświetleń kierunkowych.

Oświetlenie punktowe Oświetlenie punktowe znajduje się w określonej pozycji na scenie gry i rozchodzi się we wszystkich kierunkach. Ponieważ światło emitowane jest z określonego punktu, to również oświetla tylko jedną stronę obiektu. W wielu przypadkach nie chcemy, żeby punkt świetlny emitował światło nieskończenie daleko z tą samą siłą we wszystkich kierunkach. Jako przykład rozważmy żarówkę świecącą w ciemnym pomieszczeniu. Chcielibyśmy mieć silnie świecący punkt (żarówkę) i światło delikatnie zanikające wraz z oddalaniem się od źródła światła. Żeby osiagnąć ten efekt w grach, należy dodać promień zanikania.

Rysunek: Przykład oświetlenia punktowego

Reflektor Reflektor jest typem oświetlenia podobnym do oświetlenia kierunkowego z tą różnicą, że tutaj światło nie rozchodzi się we wszystkich kierunkach, tylko jest skupione w stożku. W tym przypadku konieczne jest podanie dodatkowego parametru, którym jest kąt, pod jakim ustawiony ma być reflektor. Podobnie jak w przypadku oświetlenia punktowego, także reflektor oświetla jedynie jedną stronę obiektów. Typowym przykładem reflektora jest reflektor oświetlający scenę w teatrze. Innym przykładem może być świecąca w ciemności latarka.

Rysunek: Przykład reflektora

Model odbicia światła Po umieszczeniu światła na scenie gry, potrzebujemy obliczyć w jaki sposób światło ma oddziaływać na obiekty znajdujące się na tej scenie. Obliczenia mogą zostać wykonane dzięki funkcji dwukierunkowego rozproszonego rozbicia (BRDF - bidirectional reflectance distribution function). Istnieje wiele różnych typów funkcji BRDF. Najbardzej znaną funkcją jest model Phonga.

Model Phonga Model Phonga jest uważany za lokalny, gdyż nie uwzględnia wtórnego odbicia światła. Oznacza to, że każdy obiekt jest oświetlony tak, jakby był jedynym obiektem na całej scenie. W świecie fizycznym, jeśli na białą ścianę padnie czerwone światło, to czerwone światło odbije się i wypełni resztę pokoju czerwonym kolorem. Takiej sytuacji nie obejmuje jednak lokalny model oświetlenia Phonga. W modelu Phonga światło jest rozbite na trzy odrębne składniki: otoczenia, rozproszenie i odbicie lustrzane. Te wszystkie trzy składniki uwzględniają zarówno kolor obiektu, jak też kolor światła wpływającego na obiekt.

Składnik otoczenia związany jest z całkowitym oświetleniem sceny i może być bezpośrednio związany z otaczającym światłem. Ponieważ jest on równomiernie stosowany do całej sceny, to składnik otoczenia jest niezależny od położenia światła i kamery. Rozproszenie jest podstawowym składnikiem odpowiedzialnym za odbijanie światła od powierzchni. Ostatnim składnikiem jest odbicie lustrzane, które reprezentuje błyszczące punkty na powierzchni.

Rysunek: Model Phonga

Nakładanie cieni Nakładanie cieni na obiekty jest czymś innym, niż oświetlanie obiektów. Najprostszy sposób nakładania cieni, czyli tzw. cieniowanie płaskie polega na nałożeniu jednego koloru na cały obiekt. W tym przypadku model odbicia światła oblicza się raz na każdy z trójkątów (zazwyczaj bierze się środek trójkąta) i tak wyliczony kolor jest nakładany na cały trójkąt. Obiekty z tak nałożonym cieniem nie wyglądają jednak szczególnie dobrze.

Cieniowanie Gourauda W cieniowaniu Gourauda model odbicia światła jest obliczany dla każdego wierzchołka. Takie podejście powoduje wyznaczenie potencjalnie innego koloru dla każdego wierzchołka. Pozostałe części trójkąta wypełnia się mieszając kolory użyte na wierzchołki. Jakość cieniowania Gourauda zależy bezpośrednio od liczby trójkątów użytych w modelu. Mała liczba trójkątów może powodować powstawanie wielu ostrych krawędzi. Z drugiej strony obiekt składający się z dużej liczby trójkątów będzie wyglądał dobrze, ale zwiększy się zapotrzebowanie na pamięć. Cieniowanie Gourauda było przez wiele lat bardzo popularne i często stosowane w grach komputerowych.

Rysunek: Cieniowanie Gourauda

Cieniowanie Phonga W cieniowaniu Phonga model odbicia światła jest obliczany dla każdego pojedynczego piksela w każdym trójkącie. Jak łatwo można sobie wyobrazić, cieniowanie Phonga jest zdecydowane bardziej złożone obliczeniowo od cieniowania Gourauda, szczególnie w przypadku dużej liczby wykorzystywanych w scenie świateł. Jednak nowoczesny sprzęt w łatwy sposób może sobie poradzić ze wzrostem obliczeń.

Rysunek: Cieniowanie Phonga

Buforowanie Z (buforowanie głębi) W buforowaniu głębi podczas renderowania sceny wykorzystywany jest dodatkowy bufor, który przechowuje informacje dla każdego piksela z danej sceny. Ale w przeciwieństwie do bufora koloru, który przechowuje informacje o kolorach, bufor Z zawiera informacje o odlegości od kamery lub głębi. Na początku renderownia ramki z użyciem bufora Z, bufor ten jest opróżniany, wobec czego głębokość każdego piksela jest ustawiana na nieskończoność. Wówczas, podczas renderowania, przed narysowaniem piksela, głębia jest obliczana dla tego piksela. Jeśli głębia danego piksela jest mniejsza od aktualnej głębi przechowywanej w buforze Z (czyli gdy piksel znajduje się bliżej kamery), to wówczas dany piksel jest rysowany i nowa wartość jest zapisywana do bufora.

Wykorzystując bufor głębi scena może być rysowana w dowolnej, ustalonej kolejności. Dopóki na scenie nie pojawią się przezroczyste obiekty, widok będzie poprawny. Załóżmy, że mamy półprzezroczystą wodę i pod nią kamień. Jeśli zostałoby użyte buforowanie Z, narysowanie wody jako pierwszej mogłoby spowodować, że kamień w ogóle nie zostałby narysowany. Żeby zapobiec takiemu efektowi najpierw renderowane są wszystkie nieprzezroczyste obiekty używające normalnego bufora Z. Następnie możemy zablokować zapis do bufora Z i renderować wszystkie przezroczyste obiekty.