Karta graficzna, aby wyświetlić na
ekranie gotowy obraz, musi najpierw
wykonać szereg następujących po sobie
czynności na danych, które otrzymała
chwilę wcześniej od aplikacji 3D. Te
realizowane kolejno kroki obliczeniowe
nazywane są strumieniem graficznym
(ang. 3D Graphics Pipeline).
Wyróżniamy w nim trzy główne fazy
obliczeń.:
Operacje geometryczne (skalowanie
obiektów) i kalkulacje (modelowanie)
oświetlenia);
Rendering (m.in. procesy nakładania
tekstur i cieniowania);
Rasteryzacja
(przygotowanie
gotowego obrazu do wyświetlenia).
Aplikacja graficzna na początku musi
utworzyć kompletny plan generowanej
sceny.
Na
owej
„mapie”
zostają
wyznaczone
dokładne
położenia
wszystkich
występujących
na
niej
obiektów.
Do
opisu
położenia
przedmiotów
w
przestrzeni
wykorzystuje
się
zestaw
trzech
współrzędnych X, Y, Z.
Co więcej, posługując
się współrzędnymi X,
Y, Z dla kilku lub
kilkunastu
punktów
charakterystycznych
(tzw.
węzłów)
wziętych
z
każdej
bryły tworzącej scenę
3D, można nie tylko
wyznaczyć, w którym
miejscu w przestrzeni
znajduje
się
dany
obiekt, ale również
bardzo
dokładnie
opisać jego kształt i
wielkość.
Dla
bardziej
skomplikowanych
kształtów, takich jak np. kula lub
twarz, węzły wyznaczone zostają w
kilku, kilkudziesięciu lub kilkuset
punktach na powierzchni bryły. Tworzą
one wówczas wektorowy opis obiektu
na scenie 3D – wszystkie operacje
związane z umieszczeniem obiektów i
przypisaniem im współrzędnych na
scenie 3D wykonuje się raz w operacji
wstępnego
przetwarzania
obrazu
(ang. preprocessing).
Aplikacja graficzna 3D przekazuje
do
sterowników
karty
ową
„kropkowaną” mapę sceny z
zaznaczonymi
węzłami,
należącymi do poszczególnych
obiektów.
W
tym
miejscu
akcelerator
3D
rozpoczyna
proces nazywany teselacją lub
triangularyzacją (ang. triangle
setup processing). Operacja ta
polega
na
grupowaniu
należących
do
każdej
bryły
węzłów (wierzchołków) w trójki.
W ten sposób cała generowana
scena,
w
tym
powierzchnie
sferyczne, podzielona zostaje na
mniejsze lub większe płaszczyzny
utworzone wyłącznie z trójkątów.
Wybranie
trójkąta,
jako
elementarnego
wielokąta
budulcowego
trójwymiarowej
sceny
spowodowane
zostało
względami
praktycznymi, związanymi z przyspieszeniem
obliczeń. Kalkulacje przeprowadzane na
trójkątach są łatwiejsze w implementacji niż
rachunki prowadzone na innych wielokątach.
Ponadto usprawnione zostają dalsze etapy
generowania sceny 3D, takie jak obliczenia
natężenia światła, cieniowanie i wypełnianie
obszarów
teksturami.
Należy
jednak
pamiętać, że prędkość, z jaką są realizowane
dalsze przekształcenia, zależy od liczby
trójkątów tworzących scenę – im jest ich
mniej,
tym
szybciej
prowadzone
są
obliczenia, ale uzyskane efekty będą mniej
realistyczne.
Wszystkie obecne na scenie
3D bryły należy zatem (w
wypadku
starszych
kart
odbywa się to po procesie
teselacji,
a
w
nowych
przed) poddać skalowaniu,
translacji i rotacji. Mają one
za zadanie ustawić obiekty
na swoim miejscu (stąd
nazwa:
ustawianie
geometrii)
oraz
odpowiednio
je
przeskalować.
Na tym etapie odbywa się też
kadrowanie sceny, czyli usunięcie z
niej fragmentów niewidocznych dla
obserwatora. Dzięki temu zmniejsza
się liczba obiektów przetwarzanych w
kolejnych
fazach
w
strumieniu
graficznym.
Po ustawieniu geometrii i skadrowaniu
sceny przychodzi czas na jej oświetlenie.
Kalkulacje te polegają na wprowadzeniu
do obliczeń współrzędnych położenia
oraz typów źródeł światła: punktowe,
rozproszone czy ruchome i jego barwy –
monochromatyczne lub kolorowe. W
rachunkach uwzględniane zostają też
znajdujące się poza kadrem źródła
światła. Każdemu węzłowi przypisane
zostają wektor opisujący natężenie
światła w danym miejscu oraz informacja
o wypadkowym kolorze światła. W
obliczeniach tych pod uwagę brane są
też odbicia od powierzchni metalicznych,
luster i tym podobnych obiektów,
również tych, których bezpośrednio nie
widać.
Możliwość wykorzystania dynamicznego
bądź statycznego sposobu generowania
trójwymiarowej sceny związana jest z
mocą
obliczeniową
procesora
graficznego. Operacje statyczne nie
potrzebują
bardzo
wydajnych
akceleratorów.
Tutaj
wszystkie
elementy znajdujące się na scenie
opisane są wyłącznie za pomocą trzech
współrzędnych (X, Y, Z) we względnym
dla
danego
„obrazka”
układzie
odniesienia. W obliczeniach statycznych
każda klatka animacji jest przeliczana
oddzielnie,
a
obsługa
interakcji
pomiędzy przesuwającym się obiektem
a otoczeniem spoczywa na jednostce
centralnej komputera.
Bardziej zaawansowany obliczeniowo
model
dynamiczny
wykorzystuje
jedną
przygotowaną
w
procesie
preprocessingu scenę 3D oraz krótkie
programy zawierające ciąg instrukcji
modelujących zachowanie się obiektu
na kilku lub kilkunastu kolejno
generowanych klatkach. Sam proces
przetwarzania
programów
opisujących zachowanie się obiektów
realizowany jest w karcie graficznej,
dzięki czemu CPU komputera może w
danej
chwili
zająć
się
innymi
zadaniami.
Rendering podzielić można na cztery
główne fazy:
Teksturowanie;
Modyfikacje nałożonych tekstur;
Cieniowanie;
Dodawanie
efektów
„atmosferycznych”
(dym,
mgła,
różnego rodzaju rozlane plamy oleju).
Faza ta zazwyczaj pochłania ponad 60%
czasu
potrzebnego
na
przygotowanie
każdej sceny 3D. Sama tekstura to płaska
bitmapa o z góry zadanej przez programistę
wielkości. Najczęściej wykorzystuje się
tekstury o rozmiarze 256×256, 512×512
oraz 1024×1024 pikseli. Można rzec, że ta
mapa bitowa po nałożeniu na elementy
szkieletu
sceny
3D
jest
cyfrowym
odpowiednikiem spotykanych w realnym
świecie powierzchni – np. udaje drewno lub
skórę. Proces nakładania tekstur, który
nazywany jest mapowaniem, sprowadza się
do „obwijania” brył teksturami.
Aby nie wpędzić się w niepotrzebne
obliczenia, już w latach pięćdziesiątych
ubiegłego
wieku
wymyślono
technologię MIP mappingu (Multum in
Parvo – wiele w niewielu). Polega ona
na utworzeniu z podstawowej tekstury
kilku (zazwyczaj ośmiu) wzorców,
które są następnie wykorzystywane do
pokrywania elementów sceny. Wzorce
te, nazywane poziomami mapy MIP, to
nic innego jak przeskalowane bitmapy,
z których każda jest czterokrotnie
mniejsza od poprzedniej.
Sama metoda MIP mappingu nie rozwiązuje jednak
problemu dopasowania tekstur do trókątów –
tekstury są kwadratowe. Aby sobie z tym poradzić,
najlepiej „wyciąć” odpowiedniej wielkości trójkąt.
Operacja
wyodrębnienia
trójkąta
o
żądanej
wielkości z kwadratowej tekstury nazywa się
clippingiem. Z punktu widzenia akceleratora polega
ona na określeniu współrzędnych trzech punktów
na teksturze, a następnie przyporządkowaniu ich
(rozpięciu)
trzem
stosownym
wierzchołkom
teksturowanego
trójkąta.
Jest
to
czynność
stosunkowo prosta i nie angażuje ona dużej mocy
obliczeniowej układu.
Przy clippingu i określaniu punktów
zaczepienia należy także pamiętać o
odpowiedniej orientacji trójkątnych
fragmentów tekstur, by znajdujące
się
obok
powycinane
trójkątne
kawałki idealnie do siebie pasowały,
tworząc jedną całość. Gdy jednak
kwadratowa tekstura okazuje się ciut
za mała, by wyciąć odpowiedni
trójkąt, a innej mapy MIP nie można
użyć, stosuje się dwa rozwiązania.
Pierwsze polega na włożeniu tekstury
w
trójkąt
i
„dosztukowaniu”
brakujących fragmentów, w podobny
sposób jak robi to krawiec. Operacja
ta realizowana jest zazwyczaj przez
procesor komputera.
Drugą,
prostą
techniką
„sztukowania” dziur jest próbkowanie
punktowe
(ang.
point
sampling
texturing).
Związane
jest
ono
bezpośrednio
ze
sposobem
nanoszenia tekstur, polegającym na
kopiowaniu punkt po punkcie tekseli
z bitmapy na mapowany tójkąt. Jeśli
powierzchnia trójkąta jest większa od
tekstury, to powiela się wówczas
niektóre
teksele
na
kilka
sąsiadujących ze sobą punktów.
Niestety,
wadą
próbkowania
punktowego jest to, że powielanie
tekseli objawia się efektem pixelizacji.
Jest on szczególnie wyraźny wtedy, gdy
tekstura musi pokryć obszar znacznie
większy niż ona sama Teksele widać
wyraźnie, gdy bohater gry podejdzie do
ściany. Wówczas dobrze wyglądające z
daleka elementy zamienią się w duże,
rozmazane kwadraty.
Podczas generowania sceny 3D
przetwarzane obiekty opisane są w
trójwymiarowej przestrzeni. Później
jednak będą one wyświetlone na
płaskim ekranie monitora. Podczas
odwzorowania
dużych,
płaskich
powierzchni, które składają się ze
sporej
wielkości
trójkątów
ustawionych niemal prostopadle do
płaszczyzny ekranu, pojawiają się
problemy
z
zachowaniem
odpowiedniej
perspektywy.
Elementy
sceny
„rozłażą
się”,
tworząc
dziwnie
powykrzywiane
wzory.
Efekt
ten
wynika
z
przesunięcia
się
współrzędnych
trójkątów
względem
punktów
zaczepienia wyciętych w trójkąty
tekstur.
Każdy nowoczesny akcelerator w celu
wyeliminowania
tych
niepożądanych
efektów stosuje tzw. algorytmy korekcji
perspektywy (ang. perspective correction).
Metoda ta polega na stworzeniu na
horyzoncie wirtualnego punktu. Każda linia
poprowadzona z dowolnego miejsca sceny
3D musi zbiec się w wyznaczonym punkcie
odniesienia. Następnie karta graficzna
nakłada
odpowiednio
dopasowane,
zorientowane i przycięte tekstury, ale już
bez przestrzennych deformacji.
Mimo nałożenia na szkielet sceny 3D nawet
najlepszych tekstur, nasz wirtualny świat
ciągle będzie wyglądał dość sztucznie. Za
to niekorzystne wrażenie odpowiadają
gładkie, płaskie bitmapy. Dlatego też musi
zostać użyta technika bump mappingu,
tworząca
złudzenie
rzeczywistej,
chropowatej
struktury
przedmiotów.
Stosuje ona dodatkową bitmapę (ang.
bump maps – mapa wybojów). Jest to
płaska bitmapa w odcieniach szarości,
gdzie jasność każdego punktu oznacza
stopień jego wypukłości.
Po złożeniu mapy wybojów z teksturą
podstawową
otrzymujemy
dodatkową
informację o wzajemnym usytuowaniu
każdego
punktu
w
odniesieniu
do
płaszczyzny tekstury. Przy obliczaniu
oświetlenia teksele znajdujące się wyżej
są jaśniejsze od tych położonych niżej.
Dzięki temu cała oświetlona tekstura
bardzo dobrze imituje chropowatości i
wgłębienia
powierzchni.
Metoda
ta
sprawdza
się
jednak
tylko
przy
nieruchomych i prostopadłych względem
obserwatora powierzchni.
Jeśli przedmioty widać pod niewielkim kątem lub
tekstury
nakłada
się
na
poruszające
się
przedmioty, wówczas stosuje się drugą z metod
bump mappingu – tzw. tłoczenie wybojów (ang.
emboss bump mapping). Odbywa się ona w trzech
etapach. W pierwszej fazie z mapy opisującej
wygląd wypukłości (mapy wybojów) akcelerator
tworzy dwa monochromatyczne obrazy. Jeden
wykorzystywany
jest
do
przedstawienia
jaśniejszych obszarów, a drugi odpowiada za
fragmenty zacienione. W drugim kroku obie
bitmapy przesuwane są o kilka pikseli względem
siebie (jedna do tyłu, druga do przodu) wzdłuż
kierunku padającego światła. Ostatnią fazą
tłoczenia jest złączenie rozsuniętych bitmap i
połączenie ich z podstawową teksturą obiektu. Do
„klejenia” obu map wypukłości używa się
technologii alpha-blendingu.
Trzecią, jeszcze bardziej zaawansowaną
metodą bump mappingu jest mapowanie
wypukłości połączone z mapowaniem
środowiskowym
(ang.
environment
mapping). Mapa środowiskowa (ang.
environment
map)
to
tekstura,
zawierająca w sobie informacje m.in. o
refleksach na powierzchni przedmiotu. W
tym przypadku uzyskanie odpowiednich
efektów możliwe jest dzięki nałożeniu na
jeden teksel trzech bitmap: podstawowej
tekstury, mapy wypukłości oraz mapy
środowiska.
Czwartą metodą odwzorowania wypukłości
jest Dot3. Łączy ona szybkość obliczeniową
tłoczenia wybojów z dokładnością techniki
EMBM. Dla każdego wielokąta sceny 3D
obliczany jest kąt odbicia padającego na
niego światła lub wypadkowy wektor
zawierający
zbiorcze
informacje
o
refleksach z wielu źródeł. Następnie
otrzymaną wartość wektora modyfikuje się
zgodnie z danymi zapisanymi w tzw. mapie
odbić, w której umieszczono informacje o
połyskujących fragmentach powierzchni. Na
końcu otrzymaną bitmapę Dot3 łączy się z
właściwą teksturą obiektu.
Ostatnią używaną metodą bump mappingu
jest
opracowane
przez
firmę
Matrox
mapowanie
przemieszczeń
(displacement
mapping). Technika ta polega na nadaniu
płaskim obiektom prawdziwych, a nie – jak do
tej
pory
–
symulowanych
wypukłości.
Fragment bryły, który chcemy zmodyfikować,
dzielony jest na mniejsze trójkąty. Następnie
jednostka Vertex Shader modyfikuje (wygina)
powierzchnie
bryły
zgodnie
z
mapą
przemieszczeń (odpowiednik mapy wybojów).
Na końcu na taki „zwichrowany” fragment
bryły nakłada się podstawową teksturę, którą
wygina się zgodnie z zadanymi uprzednio
„zagnieceniami”.
W większości wypadków na jeden obiekt
nakładanych jest co najmniej kilka różnych
bitmap. Oczywiście są one mapowane
równolegle
w
wielu
jednostkach
wykonawczych karty. Akcelerator nie czeka
też, aż będzie miał do dyspozycji wszystkie
gotowe tekstury, proces teksturowania
rozpoczyna od razu od takich elementów
sceny, które są już zgromadzone w pamięci,
stopniowo dodając później przygotowywane
bitmapy, np. mapy wypukłości.
Z procesem wypełniania sceny teksturami
związany jest też alpha-blending. Służy on do
zarządzania przezroczystościami i dzięki
temu ułatwia nakładanie jednej tekstury na
drugą.
Technika
alpha-blendingu
wykorzystuje tzw. kanał alpha, określający
stopień przezroczystości nakładanej tekstury.
Przyjmuje on wartości od zera (obiekt
zupełnie
transparentny)
do
255
(powierzchnia
nieprzezroczysta).
Wartość
kanału
alfa
ukryta
jest
w
czterech
parametrach opisujących punkt bitmapy. W
wypadku korzystania z 32-bitowego koloru 24
bity opisują barwy RGB, a brakujące osiem
bitów to właśnie kanał alfa.
W trakcie teksturowania akcelerator
wykonuje także filtrowanie tekstur. Ma
ono zapobiec efektowi pikselizacji
i rozmyć niekiedy zbyt wyraźne granice
pomiędzy
trójkątami,
na
których
nałożono dwa kolejne poziomy map
MIP. Filtrowanie przeciwdziała też
gubieniu
detali
związanemu
ze
skalowaniem map MIP – szczegóły,
takie jak np. spojenia cegieł, mogą stać
się niewidoczne, gdyż karta nie wie,
jakie punkty na teksturze są istotne.
Najprostsza i najstarsza technika filtrowania
tekstur to tzw. filtrowanie dwuliniowe (ang.
bilinear filtering). Metoda ta polega na
przyporządkowaniu każdemu filtrowanemu
tekselowi koloru otrzymanego w wyniku
interpolacji czterech sąsiednich punktów
tekstury. Jej wadą jest to, że na przejściach
pomiędzy poszczególnymi mapami MIP wciąż
widoczne
są
krawędzie.Bardziej
zaawansowanym sposobem jest filtrowanie
trójliniowe (ang. trilinear filtering). Tutaj do
ujednolicenia barwy oddalonych obiektów
używa się dwóch kolejnych map MIP. Najpierw
metodą dwuliniową interpoluje się barwy
wynikające z pierwszej mapy MIP, później zaś
z drugiej. Uśredniony wynik uzyskuje się
zatem na podstawie wartości ośmiu tekseli.
Kolejną, bardziej skomplikowaną metodą
filtrowania
tekstur
jest
filtrowanie
anizotropowe (ang. anisotropic filtering).
Tutaj przy uśrednianiu koloru bierze się
pod
uwagę
orientację
przestrzenną
tekseli względem obserwatora. Dzięki
temu obszary, z których interpolowane są
brakujące wartości, układają się w kształt
elipsy, prostokąta lub rombu (są to tzw.
figury anizotropowe), gdzie długa oś
figury
wyznacza
kierunek
procesu
filtrowania.
Do
metody
filtrowania
anizotropowego wykorzystuje się obecnie
zazwyczaj od ośmiu (poziom filtra 1x) do
128 tekseli (16x).
Po przeprowadzeniu filtrowania tekstur, stosuje
się moduły Pixel Shader, które są w stanie
zmodyfikować nałożone już na obiekty bitmapy.
Co ciekawe, programy obsługujące shadery mogą
w niemal dowolny sposób łączyć ze sobą tekstury
składowe. Dzięki temu sposób mapowania zależeć
może wyłącznie od wyobraźni i umiejętności
programisty. Można więc pominąć wszystkie
wymienione wcześniej metody teksturowania i
zaimplementować
swoją
własną,
która
da
niespotykane dotąd realistyczne efekty. Niestety,
programiści piszący gry nie wykorzystują w pełni
potencjału,
jaki
niosą
ze
sobą
programy
shaderowe, gdyż takie programowanie nie jest
proste. Niemniej teksturowanie shaderowe i
ewentualne
modyfikowane
nałożonych
już
obiektów daje niesamowite efekty.
Nawet najlepsza tekstura nie jest w stanie
odtworzyć
gry
świateł
i
cieni,
jaką
obserwujemy w codziennym życiu. To właśnie
odpowiednie „oświetlenie” sceny sprawia, że
przedmioty nabierają głębi i stają się
„przestrzenne”.
Wówczas,
tak
jak
w
rzeczywistości, blisko położone obiekty będą
jaśniejsze, a te oddalone ciemniejsze.
Oczywiście nie wolno też zapomnieć o
refleksach światła pochodzących od gładkich,
wypolerowanych powierzchni oraz wielu
różnorodnych jego źródłach (np. punktowych,
rozproszonych czy wielokolorowych), które
znajdują się na całej scenie – nie tylko na
widocznym dla obserwatora kadrze.
Tu właśnie potrzebne jest cieniowanie.
Polega ono na zamianie wektorów
natężenia
światła,
obliczonych
dla
każdego trójkąta już na etapie kalkulacji
oświetlenia na teksele o odpowiedniej
jasności i kolorze, które należą do
tekstury wypełniającej dany trójkąt. Jak
można się domyślić, od dokładności
obliczeń, sposobu wyboru rozjaśnianych
bądź przyciemnianych punktów oraz
metody zmieniającej pierwotną barwę
tekstury (modyfikacja składowych RGB) w
zależności od natężenia światła zależy
efekt, jaki zobaczymy na ekranie.
Jest najstarszą i najprostszą metodą cieniowania.
Polega ono na przyporządkowywaniu kolejnym
powierzchniom jednego poziomu jasności oraz
jednej barwy. Są one określone przez wektor
przypisany
do
jednego
z
wierzchołków
przetwarzanego trójkąta. Zazwyczaj do operacji
cieniowania płaskiego wybiera się te wierzchołki,
które znajdują się najbliżej obserwatora. Innymi
słowy,
każdemu
trójkątowi
przypisuje
się,
niezależnie od otaczających go wielokątów, jeden
ściśle określony odcień. Niestety, cieniowanie
płaskie daje dość nieciekawy efekt „kanciastości”
obiektów,
wynikający
z
gwałtownych
zmian
jasności przylegających do siebie trójkątów. Widać
to
szczególnie
wyraźnie
na
okrągłych
przedmiotach, takich jak np. kula czy torus.
Daje ona znacznie lepsze rezultaty, bez efektu
„kanciastości”. Tutaj korzysta się z wersora
oświetlenia przypisanego do środka trójkąta. Powstaje
on z uśrednienia trzech wektorów oświetlenia
pochodzących z trzech wierzchołków trójkąta. Dzięki
temu
uwzględniona
zostaje
również
jasność
sąsiednich wielokątów. W efekcie w jednym trójkącie
mamy kilka obszarów o różnym natężeniu światła i w
ten sposób zachowane zostają płynne przejścia
poziomów
jasności
pomiędzy
poszczególnymi
wielokątami. Co ciekawe, cieniowanie Gourauda daje
też złudzenie gładkości sferycznych obiektów
złożonych nawet z niewielkiej liczby wielokątów. Gdy
jednak na przedmiot pada prostopale światło –
zachowuje się ono nienaturalnie (na skutek liniowej
interpolacji światła
Jedną z najczęściej stosowanych metod cieniowania,
pozbawioną opisanych wad, jest cieniowanie Phonga (ang.
Phong shading), często nazywane też techniką per-pixel
lighting. W metodzie tej natężenie światła i odpowiadającą
mu modyfikację koloru przypisuje się oddzielnie każdemu
punktowi sceny 3D. Operacje tę przeprowadza się na
pikselach, a nie na tekselach. Obliczenia przypominają te z
poprzedniej metody, ale zamiast interpolacji wyłącznie
wersorów opisujących natężenie światła w danym punkcie,
wyznacza się wektory normalne. Zawierają one oprócz
informacji o natężeniu również dane o kolorach oraz
orientacji padającego i odbitego światła. Innymi słowy, w
metodzie Phonga oblicza się nie tylko wypadkowe
oświetlenie punktu, ale też orientację odbitego od
powierzchni promienia światła.
Jest znacznie bardziej zaawansowaną
metodą obsługi oświetlenia. Polega ona
na śledzeniu promienia światła. Jest ona
bardzo czasochłonna, ale daje najlepsze
efekty wizualne. W ten sposób we
współczesnych grach odwzorowuje się
m.in. lustra, odbicia przedmiotów od
powierzchni błyszczącego lakieru, a
przede wszystkim powierzchnię wody.
Minimalna
liczba
promieni,
które
powinny zostać zbadane w metodzie
ray-tracingu, równa się liczbie pikseli, w
jakiej generowana jest scena 3D.
Najpopularniejszą metodą tworzenia cieni
na trójwymiarowej scenie jest technika
korzystająca z map cieni (ang. shadow
maps). Są to przygotowane wcześniej w
odcieniach
szarości
bitmapy,
odpowiadające
konturom
wszystkich
znajdujących się na scenie przedmiotów.
Wystarczy teraz odpowiednio je zaczepić
na scenie i ewentualnie zdeformować, tak
aby cień układał się pod odpowiednim
kątem wzdłuż linii prowadzącej do źródła
światła. Często używa się też kilku map, w
wypadku gdy na generowanej scenie
znajduje się więcej głównych źródeł
światła.
Inną
metodą
jest
algorytm
cieni
szablonowych (ang. stencil shadow). Do
ich
nanoszenia
wykorzystuje
się
ośmiobitowy bufor szablonów. Metoda ta
polega na „przykryciu” przygotowanymi
uprzednio cieniami sceny 3D jeszcze
przed przystąpieniem do teksturowania.
Te obszary, które zasłania cień, są
wyłączone z obliczeń, co znacznie
przyspiesza
proces
renderowania.
Później w to miejsce przenosi się z
bufora gotowy obraz cienia.
Ostatni etap renderingu to dodawanie tzw.
efektów
atmosferycznych
(ang.
atmospheric effects). Nazwa ta nie najlepiej
oddaje sens tej operacji, gdyż oprócz
typowych
zjawisk
atmosferycznych,
obejmuje też dym, ogień, refleksy świetlne,
ogniskowanie kadru, efekty cząsteczkowe,
zmętnienie lustra wody czy rozmycie ruchu.
Realizacja wszystkich tych funkcji odbywa
się wfazie postprocessingu, wykonywanej
już po zakończeniu procesu tworzenia
sceny 3D.
Najczęściej
stosowanymi
efektami
atmosferycznymi są mgła i dym, które rysuje się
za pomocą czterech odmiennych technik:
Mgła liniowa: liniowo, wraz ze wzrostem
odległości obiektów od obserwatora nakłada się
coraz gęstszą mgłę.
Tablica
mgieł
-
stopień
zamglenia
dla
poszczególnych obiektów i odległości zapisany
zostaje w przygotowanej wcześniej tablicy.
Mgła wykładnicza - bardzo przypomina efekty
uzyskiwane za pomocą tablicy mgieł, lecz nie
wymaga on predefiniowania stopni zamglenia.
Oblicza się je na bieżąco, korzystając z
zaprogramowanej funkcji wykładniczej.
Mgła
wolumetryczna
-
do
jej
tworzenia
wykorzystywane są półprzezroczyste tekstury
trójwymiarowe
Efektem bazującym na algorytmie mgły
wykładniczej jest głębia ostrości (depth
of field). W realnym świecie, nawet
przy
najlepszej
pogodzie,
odległe
obiekty, jak np. góry na horyzoncie,
zawsze są dosyć niewyraźne. Aby
odtworzyć to zjawisko, karta graficzna
zmienia wykładniczo kolory i odcienie
przedmiotów w zależności od dystansu
dzielącego przedmiot od obserwatora –
im większa odległość, tym mniej
wyraźnie widać nawet duże obiekty.
Eekty cząsteczkowe (ang. particle
effects) otrzymuje się nakładając na
gotową scenę 3D lub jej fragment
bitmapy
zawierające
animację
deszczu, padającego śniegu czy np.
płomieni. Taką animację odwraca się
zawsze przodem do obserwatora. Co
ważne, efekty cząsteczkowe nie
wymagają
praktycznie
żadnego
nakładu obliczeniowego, a uzyskane
rezultaty są wyjątkowo realistyczne.
Ostatnim
efektem
postprocessingowym
jest
motion
blur,
czyli
kierunkowe
rozmycie
szybko poruszających się obiektów,
np. lecącej w naszym kierunku piłki,
bądź rozpędzonego samochodu.