Wybierz styl

Pojedynek P4X266,SiS645,i845,i850

 Menu

  News

  Sterowniki

  Artykuły

  Fun - Humor

  Board

  Gielda

  Linki

  Chat (0)

  Archiwum

  Ankieta

  Komentarze

  Sondy

  Pliki

  Wyszukiwarki

  RejestratorWWW

  ZaDarmo

  Redakcja

  Reklama

43 - Aktywnych uzytkowników
z których 1 jest w tym dziale
6 - Ściąga pliki zobacz co

 Szukaj we Frazirze





7361065


21-10-2000 - Drukuj poniższy tekst


Grafika 3D - krok po kroku

Tajniki grafiki trójwymiarowej

Autor: Paweł Pilarczyk

Karty graficzne są jednymi z najważniejszych komponentów każdego peceta. Bez nich niemożliwe (lub skrajnie utrudnione) byłoby korzystanie z komputera. Praktycznie każda nowoczesna karta graficzna wyposażona jest w funkcje akceleracji grafiki przestrzennej. Funkcje te mają wspomagać, lub nawet wyręczać procesor komputera w tworzenu trójwymiarowych animacji, coraz częściej wykorzystywanych w najnowszych programach multimedialnych czy grach.

W prasie oraz Internecie publikuje się dziesiąki recenzji najnowszych dopalaczy 3D. Autorzy artykułów posługują się takimi pojęciami, jak "anizotropowe filtrowanie tekstur", "jednostka T&L" czy "mapowanie wybojów". Czy jedak wszyscy wiemy, co oznaczają te pojęcia? Czy znane nam są zasady, według których powstaje obraz trójwymiarowy? Niniejszy artykuł ma za zadanie rozwiać większość tego typu wątpliwości.

Dwuwymiarowy obraz przestrzenny

Głównym problemem, z jakim musi się zmierzyć nasz komputer przy tworzeniu trójwymiarowych światów, to przedstawienie ich na płaskim kineskopie monitora. Wszystkie bryły muszą być na tyle sprytnie pokazane, by pokazywane na monitorze - oszukując nasz wzrok - sprawiały wrażenie trójwymiarowych. Istnieją dość proste wzory, według których można przeliczyć położenie wierzchołków brył w przestrzeni na ich imitację na płaszczyźnie. Na tym jednak nie kończą się problemy.

Obraz 3D powstaje w wielu krokach, zaś im więcej tych kroków wykona akcelerator 3D, tym wierniejszy będzie wynik jego pracy.

Krok 1 - ustawianie geometrii (geometry setup)

Ustawianie geometrii to najważniejszy krok w tworzeniu trójwymiarowej sceny na ekranie komputera. Podczas tej fazy obiekty trójwymiarowe (zbudowane z wielokątów) są umieszczane w przestrzeni w wyznaczonym dla siebie miejscu. W tym celu poddaje się je trzem operacjom, znanym pod wspólną nazwą "transformacji": skalowania, translacji i rotacji. Skalowanie to zmiana rozmiaru obiektu tak, że staje się on większy bądź mniejszy. Translacja to przesunięcie tego obiektu w wyznaczone dla niego miejsce. Rotacja to odpowiednie obrócenie obiektu, by znalazł się on w wymaganej pozycji.

Gra czy aplikacja 3D będzie musiała tak manipulować wszystkimi obiektami, by sprawiać wrażenie prawdziwego, ruchomego świata trójwymiarowego.

Ustawianie geometrii do niedawna dokonywane było wyłącznie przez procesor komputera (CPU - Central Processing Unit). Przy okazji przez CPU liczone było też natężenie światła padającego na bryły przy zadanym położeniu źródeł tego światła (może być ono monochromatyczne lub kolorowe).

Najnowsze układy graficzne wyposażone są w tzw. jednostki T&L (Transform & Lighting Engine - jednostka transformacji i oświetlenia), zwane też "procesorami geometrii". Ich zadaniem jest liczenie także wstępnych faz tworzenia grafiki trójwymiarowej: transformacji i oświetlenia. Jako że układy wyposażone w procesory geometrii całkowicie odciążają procesor komputera przy tworzeniu grafiki 3D, więc przyjęło się nazywać je procesorami GPU (Graphics Processing Unit - jednostka przetwarzania grafiki).


Obiekt 3D.

.najpierw poddawany jest skalowaniu.

.następnie translacji.

.a na końcu rotacji

Krok 2 - ustawianie trójkątów (triangle setup)

Jest to kolejna faza po transformacjach i oświetleniu. Starsze akceleratory 3D wkraczają dopiero w tym kroku (RIVA TNT, TNT2, Vanta, cała rodzina Voodoo do Voodoo5 włącznie, Savage3D, Savage4 itp). Program (np. gra) generujący obraz 3D, poprzez odpowiedni interfejs programowania aplikacji (API - Application Programming Interface), np. Direct3D czy OpenGL, wysyła współrzędne wszystkich wierzchołków sceny z kroku pierwszego do tzw. układu ustawiania trójkątów (triangle setup engine). Jest to specjalna jednostka, będąca częścią chipu graficznego. Grupuje ona wszystkie trójki wierzchołków (punktów w przestrzeni) w trójkąty. Proces grupowania punktów w trójkąty zwany jest teselacją (lub triangularyzacją).

Każdemu wierzchołkowi każdego trójkąta przypisuje się trzy współrzędne w przestrzeni: X (współrzędna w pionie), Y (współrzędna w poziomie) oraz Z (współrzędna "w głąb" ekranu). Każda trójka takich współrzędnych powinna być zapamiętana w oddzielnej macierzy. Jako że praktycznie każdy wierzchołek należy nie do jednego, a do dwóch lub nawet więcej trójkątów, więc stosuje się pewne techniki, które mają zmniejszyć ilość macierzy opisujących współrzędne wierzchołków. Techniki te to tzw. pasy (strips) i wachlarze (fans) -patrz ramka poniżej.

Pasy i wachlarze
Świat tworzony przez wszystkie akceleratory 3D (z wyjątkiem PowerVR) składa się z trójkątów. Trójkąt ma trzy wierzchołki. Każdy ma trzy współrzędne - X, Y i Z. Jeśli zechcemy stworzyć prostokąt, będziemy musieli wykorzystać w tym celu dwa trójkąty. Zatem prostokąt, który normalnie ma cztery wierzchołki, akcelerator 3D jest zmuszony opisać sześcioma wierzchołkami.

Zauważmy jednak, iż dwa wierzchołki są wspólne (2 = 5 i 3 = 4) - gdyby wykorzystać ten fakt, możliwa byłaby redukcja liczby wierzchołków z sześciu do czterech. Powoduje to zmniejszenie ilości danych do obliczania, a co za tym idzie - zwiększenie szybkości animacji.
Technika wykorzystywania wspólnych wierzchołków zwana jest pasami i wachlarzami (strips and fans). Pasy pozwalają na tworzenie długich ścian (np. w grach FPP). Do postawowego trójkąta dokładamy nowy wierzchołek i z wykorzystaniem dwóch wybranych wierzchołków tego trójkąta tworzymy nowy trójkąt. Następnie dodajemy kolejny wierzchołek i - tym razem z pomocą nowego trójkąta - tworzymy kolejny.

Z kolei wachlarze polegają na tworzeniu nowych trójkątów ciągle z wykorzystaniem jednego z wierzchołków trójkąta bazowego.


Krok 3 - nakładanie tekstur (texture mapping)

Kolejnym, niezmiernie ważnym krokiem w tworzeniu trójwymiarowego obrazu jest nakładanie (mapowanie) tekstur na wszystkie trójwymiarowe obiekty. Tekstura jest zwykłym płaskim obrazkiem (mapą bitową), przy czym każdy punkt, z którego się składa, nazywa się tekselem (od "Texture Element" - element tekstury lub "Texture Cell" - komórka tekstury). Nakładanie tekstur polega na "oblepianiu" teksturą przestrzennych przedmiotów w taki sam sposób, jak np. zawijamy kanapkę w folię aluminiową. Tekstura przedstawiająca zdjęcie fragmentu ceglanej ściany, nałożona na ścianę budynku, powoduje wrażenie, iż ściana ta jest z cegieł.


Tekstura i obłożony nią obiekt 3D

Oczywiście teksturuje się poszczególne trójkąty składające się na przestrzenne obiekty. Tekstura podlega operacji wycinania (clipping) - wyodrębniany jest z niej trójkąt. W tym celu określane są współrzędne trzech punktów na teksturze (która zazwyczaj jest kwadratowa), a następnie wybrane wierzchołki przyporządkowywane są odpowiednim wierzchołkom teksturowanego trójkąta. Każdemu punktowi teksturowanego trójkąta przyporządkowuje się kolor odpowiadającego mu teksela tekstury.


Wycinanie trójkąta z kwadratowej tekstury


Niestety po nałożeniu "ceglanej" tekstury, nadal będziemy mieli wrażenie, że ściana budynku jest idealnie gładka. Najnowsze układy 3D, w celu dalszego zwiększenia realizmu, stosują technikę zwaną mapowaniem wybojów (bump mapping). W tym celu dla każdej tekstury tworzone są mapy wybojów (bump maps). Są one także płaskimi mapami bitowymi, jednak wartość poszczególnych pikseli tych map określa wysokość odpowiednich tekseli nad płaszczyzną tekstury. Naturalnie mapa wybojów odpowiada teksturze rozmiarami. Po nałożeniu jej na teksturę otrzymujemy dodatkową daną - położenie (wysokość) każdego teksela tekstury w stosunku do płaszczyzny tej tekstury. Akcelerator 3D, odwzorowując efekt mapowania wybojów, przy oświetlaniu tekstury bierze pod uwagę wartość wysokości każdego teksela. Dzięki temu teksele znajdujące się wyżej są jaśniejsze niż te znajdujące się niżej. Praktyczne wrażenie tego zjawiska to chropowatość powierzchni tekstury - jej poszczególne fragmenty rzucają cienie!


Mapowanie wybojów pozwala odwzorować rowki i chropowatości w teksturach

Mapowanie wybojów pozwala stworzyć takie efekty, jak "rowki" między cegłami, chropowaty asfalt na jezdni czy wypukłą dachówkę na dachu.

Mapowanie wybojów
Mapowanie wybojów powoduje złudzenie, że obiekt nie jest gładki, a chropowaty. Gdy na niego patrzymy, zdaje nam się, że widzimy wyboje, rysy, czy rowki.
Z jednej strony wybój (wypukłość) będzie jasny, z drugiej ciemny. Należy pamiętać, że mapowanie wybojów to efekt manipulujący wyłącznie grą światła, a nie wielokątami.
Najprostszym rodzajem mapowania wybojów jest mapowanie prekalkulowane (Pre-Calculated Bump Mapping). Podczas pisania kodu aplikacji 3D, liczona jest mapa oświetlenia i cieni. Mapę tę nakłada się na teksturę. Technika mapowania prekalkulowanego pozwala uzyskać dość wierne wyboje, jednak wyłącznie na obiektach statycznych (nieruchomych). W niektórych sceneriach można ją jednak z powodzeniem stosować.
Najłatwiejszym do uzyskania i dość praktycznym mapowaniem wybojów jest tłoczone mapowanie wybojów (emboss bump mapping), znane też pod nazwą mapowania wichrowatego zlewanego (perturbed blend bump mapping). Mapa wybojów to "szary odpowiednik" tekstury. Akcelerator przesuwa ją nieco względem tekstury właściwej i przy pomocy addytywnego zlewania alfa (additive alpha blending) odejmuje ją od tej tekstury. Następnie przesuwa ją z powrotem i wtapia w ową teksturę. W zasadzie tłoczone mapowanie wybojów jest wyłącznie trikiem bazowanym na zlewaniu, więc - jak nietrudno się domyśleć - można je uzyskać praktycznie na każdym układzie 3D.


Tłoczone mapowanie wybojów. Od lewej: obiekt 3D obłożony zwykłą teksturą, obiekt 3D obłożony mapą wybojów, obiekt 3D obłożony mapą wybojów i teksturą


Znacznie bardziej zaawansowaną metodą jest środowiskowe mapowanie wybojów (Environment-Mapped Bump Mapping, EMBM), znane też jako wichrowate środowiskowe mapowanie wybojów (Perturbed Environment Bump Mapping). Technika ta stosuje trzy tekstury: właściwą, środowiska i wybojów. Najpierw mapa wybojów aplikowana jest na mapie środowiska, dzięki czemu powstaje tzw. wichrowata mapa środowiska (Perturbed Environment Map). Następnie nakłada się ją na właściwą teksturę.
Środowiskowe mapowanie wybojów pozwala uzyskać wiele ciekawych efektów, jak np. falującą powierzchnię wody, w której odbijają się góry, "lustra" na powierzchni rozgrzanego asfaltu itp. Ten typ mapowania wybojów jak do tej pory wspierany jest wyłącznie przez rodzinę układów G400 i G450 firmy Matrox, a także przez ATI Radeon 256 i PowerVR Kyro.


Woda uzyskana dzięki środowiskowemu mapowaniu wybojów

Jak widać, na mapowaniu jednej tekstury się nie kończy. Na każdy obiekt można bowiem nakładać wiele tekstur. Podstawowa to materiał obiektu, zaś kolejne to wspomniana mapa wybojów, mapa światła (lightning map) oraz mapa środowiska (environment map). Mapowanie środowiska polega na nakładaniu na obiekt tekstury przedstawiającej otoczenie tego obiektu. Efekt ten powoduje, iż obiekt sprawia wrażenie refleksyjnego, "metalicznego". Wykorzystany został np. w grze Need for Speed III, gdzie dzięki mapowaniu środowiska uzyskano efekt odbijania się drzew na maskach samochodów.


Skały odbijające się w wodzie (mapowanie środowiska)

Im więcej tekstur nakłada się na jeden obiekt, tym większa moc obliczeniowa jest wymagana od akceleratora. Starsze układy graficzne posiadały tylko jeden potok teksturujący składający się tylko z jednej jednostki mapującej tekstury (TMU - Texture Mapping Unit). Nowoczesne chipy 3D posiadają dwa, trzy lub nawet cztery potoki teksturujące; w każdym z nich znajduje się jedna, dwie lub trzy jednostki mapujące tekstury. Układy takie potrafią mapować nie jedną, a dwie lub nawet trzy tekstury w jednym cyklu zegara.

Przy nakładaniu tekstur akcelerator powinien zadbać o zachowanie odpowiedniej perspektywy. Jeśli tego nie zrobi, tekstury na pochyłych powierzchniach mogą ulec nieprzyjemnym zniekształceniom. Wszystkie obecne akceleratory 3D oferują algorytmy korekcji perspektywy (perspective correction).

Korekcja perspektywy
Podczas teksturowania ścian w grach FPP (First Person Perspective, patrzy się oczyma bohatera), akceleratory często mają problemy z zachowaniem odpowiedniej perspektywy. Tekstury się rozjeżdżają, łamią i powodują niemiły wizualnie efekt.
W celu jego zniwelowania stosuje się algorytm korekcji perspektywy (perspective correction): tworzy się wirtualny punkt "nieskończoność". Teraz każda linia poprowadzona z dowolnego punktu ekranu musi przechodzić przez ten punkt. Dopiero zgodnie z zasadą linii o wspólnym punkcie chip nakłada teksturę, już bez niepożądanych deformacji.


Scena bez korekcji perspektywy (po lewej) i z korekcją (po prawej)

Mapowanie tekstur zupełnie pokrywających (tj. zasłaniających) trójkąt to jeszcze nie wszystko. Tekstura najczęściej jest opisana czterema parametrami: trzy parametry to wartości kolorów składowych, zaś czwarty to kanał przezroczystości "alfa" (alpha channel). Dla przykładu, tekstura 8888 RGBA to tekstura dedykująca 24 bity na opis koloru każdego teksela (po 8 bitów, to jest 256 stopni jasności każdego z trzech kolorów podstawowych: czerwonego, zielonego i niebieskiego) plus 8 bitów kanału alfa. Skrót RGBA oznacza "Red-Green-Blue-Alpha", zaś "8888" to kolejne ilości bitów przyporządkowanych odpowiednio wymienionym parametetrom. Popularne chipy graficzne, jak np. RIVA TNT, obsługują tekstury 24. (888 RGB, bez kanału alfa) i 32-bitowe (8888 RGBA, z 8-bitowym kanałem alfa). Starsze układy (np. niegdyś bardzo popularne chipsety z rodziny Voodoo) obsługują najwyżej 16-bitowe tekstury: 4444 RGBA (po 4 bity na każdy kolor składowy oraz 4 bity dla kanału alfa) lub 565 RGB (po 5 bitów dla kolorów czerwonego i niebieskiego oraz 6 bitów dla zielonego). 4 bity to zaledwie 16 odcieni (24 = 16) danego koloru! 5 bitów to 32 odcienie, a 6 - 64.

Do czego służy kanał alfa? Określa on stopień przezroczystości tekstury. Jeśli jego wartość jest maksymalna (255; wartość liczona jest od zera do 255), oznacza to "zupełnie nieprzezroczysty". Jeśli jego wartość jest minimalna (0), oznacza "zupełnie przezroczysty", a więc nałożenie tekstury z kanałem alfa równym "zero" praktycznie nic nie zmienia - tekstura ta będzie niewidoczna. Jeśli wartość kanału alfa jest równa np. 120, to tekstura jest półprzezroczysta. Obłożony nią trójkąt będzie "prześwitujący" i będzie można ujrzeć obiekty przezeń zasłonięte.

Anty-aliasing
Aliasing to efekt"schodkowatości" ukośnych linii. Ekran komputera ma ograniczoną rozdzielczość, zatem rysując ukośną linię (czy granicę między dwoma kolorami), karta graficzna zapala najbliższe dostępne piksele. W efekcie tego powstaje schodkowata linia.



Oczywiście im niższa rozdzielczość, tym większy efekt schodkowatości. By się jej pozbyć, wystarczy zmienić tryb graficzny, np. z 640x480 na 1600x1200. Jest jedno "ale" - szybkość animacji spadnie wówczas drastycznie.
By pozbyć się efektu schodkowatości, karty grafiki 3D stosują algorytmy zwane anty-aliasingiem.


Anty-aliasing polega na rozmywaniu ukośnych krawędzi


Anty-aliasing dzieli się na dwa rodzaje: anty-aliasing krawędziowy (Edge Anti-Aliasing) i anty-aliasing całej sceny (Full-Scene Anti-Aliasing, FSAA).
Ten pierwszy polega na rozmywaniu krawędzi trójkątów (z których składają się trójwymiarowe obiekty). Jeśli na ekranie wyświetlany jest płaski obrazek jako tło (wielokrotnie np. w wyścigach samochodowych czy grach FPP na otwartej przestrzeni), nie zostanie on poddanyanty-aliasingowi. Ponadto anty-aliasing krawędziowy wymaga odczytania wielokąta z pamięci karty graficznej, rozmycia go i zapisania z powrotem. Proces ten znacznie spowalaniarenderowanie.
Anty-aliasing całej sceny stosuje zupełnie odmienną technikę i wymaga mniejszych nakładów obliczeniowych. Trójwymiarowa scena renderowana jest w wyższej rozdzielczości niż rzeczywiście na ekranie, a następnie zmniejszana do rozmiarów rozdzielczości rzeczywistej z użyciem specjalnych filtrów. Anty-aliasing całej sceny także powoduje spadek prędkości, gdyż wymaga obliczeń dla wyższych rozdzielczości, jednak powoduje, że cały obraz na ekranie komputera jest pozbawiony "schodków".



Przenikanie obiektów przy pomocy kanału alfa (alpha blending) pozwala na uzyskanie bardzo ważnych efektów: szkła (szyby w oknie, szklanki na stole), wody, dymu czy ognia.

Przy nakładaniu tekstur pojawia się kolejny problem. Tekstura zawsze jest określonego rozmiaru. Może to być np. kwadratowy obrazek o rozmiarach 512x512 punktów. Z kolei oblepiany nią trójkąt może być albo niezmiernie malutki, albo olbrzymi. W przypadku trójkątów mniejszych od tekstury, gubi się z niej większość tekseli. Jeśli trójkąt jest większy od tekstury, odpowiednie teksele są po prostu powielane. Aby usprawnić proces dobierania rozmiaru tekstury do trójkąta, akceleratory 3D stosują technikę mapowania MIP (MIP mapping; MIP, "Multum in Parvam" - z łac. "wiele w niewielu"). Przed renderowaniem trójwymiarowej sceny, z każdej tekstury tworzone są mapy MIP. Najczęściej tworzy się ich osiem. Mapy MIP to nic innego, jak zmniejszone tekstury utworzone na podstawie tekstury wzorcowej. Każda następna mapa MIP jest czterokrotnie mniejsza od poprzedniej (tj. każdy z jej boków jest dwukrotnie krótszy). Jeśli pierwsza miała rozmiary 512x512 punktów, to następna będzie miała rozmiary 256x256 punktów, kolejna 128x128 punktów itd. Przy nakładaniu tekstury na trójkąt ze zbioru map MIP wybierana jest taka, która rozmiarami najbardziej zbliżona jest do mapowanego trójkąta. Mapowanie MIP znacznie przyspiesza proces renderowania, gdyż przy nakładaniu tekstury o rozmiarach np. 512x512 na mały trójkąt, wystarczy użyć jej mapę MIP o rozmiarach np. 32x32.

PoziomRozdzielczośćRozmiar rzeczywistyMapa po powiększeniu
0
128x128
1
64x64
2
32x32
3
16x16
Kolejne poziomy map MIP


Mimo stosowania techniki mapowania MIP, praktycznie nigdy mapowany trójkąt nie będzie równy rozmiarami teksturze. Dlatego przy teksturowaniu teksele powielane są z jednego punktu do wielu punktów, w wyniku czego powstają całe "kwadraty" (czy "romby") o jednakowym kolorze. Technika przyporządkowywania każdemu punktowi przestrzennego trójkąta tylko jednego teksela tekstury, z powielaniem go w razie potrzeby, nazywana jest próbkowaniem punktowym (point sampling) i występuje w starszych grach DOS-owych (Wolfenstein 3D, Doom, Duke Nukem 3D). Te nie wykorzystywały jeszcze sprzętowych dopalaczy 3D. Układy 3D wprowadziły metody tzw. filtrowania tekstur, a więc odpowiedniej interpolacji obszarów o jednakowych kolorach powstałych z pojedynczychtekseli.

Najprostszą techniką filtrowania tekstur jest filtrowanie dwuliniowe (bilinear filtering). Polega ona na przyporządkowaniu każdemu punktowi teksturowanego trójkąta koloru nie jednego teksela tekstury, ale koloru otrzymanego w wyniku interpolacji czterech sąsiednich tekseli tekstury. Obecne przy próbkowaniu punktowym jednokolorowe "placki" teraz przechodzą płynnie kolorami jeden w drugi. Dzięki filtrowaniu dwuliniowemu efekt "kwadratowości" próbkowania zanika, jednakże obraz staje się trochę rozmyty.


Próbkowanie punktowe (po lewej) i filtrowanie dwuliniowe (po prawej)


Dalsze polepszenie jakości obrazu można uzyskać stosując jednocześnie filtrowanie dwuliniowe i mapowanie MIP, przy czym obie te techniki pracują niezależnie od siebie. Jeśli jednak jedną w odpowiedni sposób połączy się z drugą, otrzyma się kolejny sposób filtrowania - trójliniowy.

Filtrowanie trójliniowe (trilinear filtering) polega na stosowaniu dwóch kolejnych map MIP przy teksturowaniu - jedna jest mniejsza od teksturowanego trójkąta, zaś druga większa. Najpierw poddaje się interpolacji dwuliniowej mapę pierwszą, potem drugą, a następnie uśredniony wynik tych operacji nakłada się na trójkąt.

Filtrowanie trójliniowe powoduje usunięcie efektu raptownie zmieniających się tekstur przy zmianie odległości, niestety wymaga operacji na ośmiu tekselach jednocześnie (dwukrotnie więcej niż w przypadku filtrowania dwuliniowego). Jest zatem metodą bardziej pracochłonną niż filtrowanie dwuliniowe. Starsze układy potrzebowały dwóch cykli zegara w celu dokonania filtrowania trójliniowego. Dopiero najnowsze układy 3D, dzięki dwóm (lub więcej) jednostkom teksturującym, potrafią filtrować trójliniowo w jednym cyklu zegara (w jednym przejściu - tzw. single-pass trilinear filtering).

Filtrowanie dwuliniowe vs trójliniowe



Porównanie filtrowania dwuliniowego z mapowaniem MIP (u góry) z filtrowaniem trójliniowym (u dołu). Gdy się przyjrzy górnemu obrazkowi, widać granicę między dwoma mapami MIP.

Wymienione metody filtrowania tekstur należą do tzw. izotropowych (od "izotropic"; izo = jodnolity, tropic = kształt), gdyż interpolują zawsze cztery teksele układające się w kwadrat 2 na 2.

Najbardziej zaawansowaną metodą filtrowania jest filtrowanie anizotropowe (ani = nie) - anisotropic filtering. Polega na interpolacji tekseli układających się w różne kształty (nie tylko kwadraty, ale także prostokąty czy elipsy), zależnie od położenia obiektu względem ekranu. Jeśli obiekt nie leżał równolegle do płaszczyzny ekranu (tj. nie patrzyliśmy na niego z góry), a był ukośny, to w wyniku filtrowania dwu- czy trójliniowego mogą powstawać zniekształcenia obrazu. Dla wprawnego oka efekt ten widoczny jest praktycznie w każdej dzisiejszej grze, gdyż przecież wszystkie ściany w Quake'u czy Unreal'u są ukośne. Filtrowanie anizotropowe pozwala zachować oryginalny kształt tekstur także na obiektach ukośnych. Niestety ten rodzaj filtrowania wymaga największej mocy obliczeniowej.

Krok 4 - cieniowanie (shading)

Mamy już świat złożony z wielu poteksturowanych obiektów. Tekstury są przefiltrowane, więc obraz wygląda ładnie i gładko. Brakuje mu jednak jednej, niezwykle istotnej rzeczy - oświetlenia. Oświetlenie powoduje znaczne zwiększenie wrażenia głębi. Obiekty położone bliżej nas ("obserwatorów") są bowiem jaśniejsze, zaś te położone w oddali, są ciemniejsze. Cieniowanie pozwala także na stosowanie źródeł światła w przestrzeni. Obiekt 3D może być zatem oświetlony nie tylko z przodu, ale także z boku. Pierwsze układy 3D pozwalały na stosowanie jedynie monochromatycznych (jednokolorowych) źródeł światła (konkretnie światła białego). Wszystkie nowe chipsety radzą sobie bez problemu z wielokolorowym światłem, czego piękne efekty możemy podziwiać w grach Forsaken czyUnreal.

Najprostszą metodą cieniowania jest cieniowanie płaskie (flat shading). Polega ono na przyporządkowywaniu określonego poziomu jasności (z ewentualnym uwzględnieniem także zabarwienia wybranym kolorem - w przypadku kolorowego źródła światła) każdego całego trójkąta. Każdy trójkąt (z którego składa się scena 3D), niezależnie od trójkątów otaczajacych go, otrzymuje określony odcień. Efektem tego jest kanciastość większości obiektów, szczególnie obiektów okrągłych (jak np. piłka), wynikająca z gwałtownych zmian jasności trójkątów. Nawet jeśli jeden z trójkątów obiektu 3D jest bardzo długi i zaczyna się blisko nas, a kończy w głębi ekranu, będzie miał takie samo nasycenie światła.


Cieniowanie płaskie (po lewej) i Gourauda (po prawej)


O wiele lepszą i obecnie najpopularniejszą metodą cieniowania jest cieniowanie metodą Gourauda (Gouraud shading). Technika ta przyporządkowuje kolor i jasność każdemu z trzech wierzchołków każdego trójkąta. Odcień wnętrza tego trójkąta powstaje poprzez interpolację (uśrednienie) odcieni jego wierzchołków. W ten sposób powstaje płynne przejście cieni między wierzchołkami, a zatem i krawędziami sąsiadujących trójkątów. Zupełnie zanikają bowiem granice między trójkątami położonymi obok siebie. Cieniowanie Gourauda powoduje złudzenie, iż nawet obiekty złożone z niewielu trójkątów nie są "kanciaste", ale gładkie.

Najbardziej zaawansowaną metodą cieniowania jest cieniowanie Phonga (Phong shading), zwane także operowaniem światłem z dokładnością do pojedynczego piksela (per-pixel lighting). Jasność i odcień przyporządkowywana jest każdemu punktowi obrazu 3D (nie tekselowi tekstury!) oddzielnie! Ten typ cieniowania (czy raczej operowania światłem) zaimplementowany jest dopiero w najnowszych układach graficznych - GeForce2 GTS (dzięki jednostce NSR - NVIDIA Shading Rasterizer) oraz Radeon 256.

Krok 5 - efekty atmosferyczne (atmospheric effects)

Ostatnią fazą tworzenia obrazu 3D jest dodanie efektów atmosferycznych. Należą do nich przede wszystkim mgła, dym, ogień i woda.

Najpowszechniej stosuje się efekt mgły (fog). Nie trzeba tłumaczyć, na czym polega, gdyż jest to dokładnie taki sam efekt, jaki znamy z rzeczywistości. Pokrywanie mgłą w ogromnym stopniu zwiększa realizm gier (zwłaszcza symulatorów lotu, gdzie występują duże odległości od obserwatora; także zwykłych gier FPP na "świeżym powietrzu"). Odciąża ponadto w znacznym stopniu akcelerator 3D, gdyż odległe obiekty wystarczy pokryć mgłą i. nie potrzeba ich już więcej liczyć.

Depth cueing
Na otwartych przestrzeniach dużo daje efekt zacierania obiektu wraz ze wzrostem jego odległości od obserwatora (depth cueing). W miarę, jak obiekt się przemieszcza względem nas, akcelerator zmienia jego kolor i odcień. Krzywa zmiany koloru i odcienia jest najczęściej krzywą wykładniczą.



Mgła w grze Turok

Także mgła tworzona jest przy pomocy trzech różnych technik. Najprostsza to mgła liniowa (linear fog), polegająca na stopniowym, liniowym zamgleniu obiektów wraz ze wzrostem ich odległości od obserwatora. Dużo lepsze efekty daje mgła tablicowa (table fog). W jej przypadku stopień zamglenia w zależności od odległości zapisany jest w odpowiedniej tablicy. Wartości wpisywane do tej tablicy mogą być zupełnie dowolne, dlatego mgła tablicowa pozwala na tworzenie takich efektów, jak mgła w określonym miejscu, np. nad powierzchnią jeziorka. Efekt ten uzyskuje się wpisując do tablicy niewielką wartość zamglenia dla odległości np. od 0 do 10 metrów od obserwatora (zakładając, że 13 metrów od nas jest jeziorko), następnie stopniowo zwiększa się wartość zamglenia od 10 do 17 metrów i ponownie zmniejsza się tę wartość po 17 metrach. Efekt mgły tablicowej znakomicie prezentuje gra Unreal.

Bardzo wierne efekty daje także mgła wykładnicza (expotential fog). Nie wymaga ona tworzenia tablicy wartości zamglenia, bowiem wartość ta jest wyliczana drogą matematyczną.

Ostatnie efekty to przezroczystość (transparency) i zlewanie (blending). Nie wymagają one zbyt wielu obliczeń, gdyż polegają na porównaniu wartości kanałów alfa dla dwóch nakładających się obiektów, a następnie zlaniu ich ze sobą. Wynikowy kolor wylicza się albo po dodaniu czy odjęciu kolorów składowych (additive alpha blending), albo po ich pomnożeniu przez siebie (multiplicative alpha blending).

Krok 6 - rasteryzacja

Ostatnią fazą tworzenia obrazu 3D jest rasteryzacja, a więc zamiana wszystkich parametrów obrazu na zbiór (mapę) kolorowych punktów (jedną klatkę obrazu). Każdemu punktowi ekranu przyporządkowywane są trzy współrzędne: X (odległość w poziomie), Y (odległość w pionie) i Z (odległość "w głąb ekranu"). Dla 32-bitowego koloru (z czego 24 bity to opis koloru, a 8 bitów to kanał przezroczystości), jeden piksel wymaga 4 bajtów na opis (32:8 = 4).

Buforowanie Z
Większość dopalaczy 3D tworzy światy 3D z trójkątów. Podczas procesu rasteryzacji chip 3D rysuje na ekranie po kolei trójkąt po trójkącie.
Najpierw akcelerator rysuje jeden trójkąt. Zapisuje kolejne punkty tworzące wizerunek trójkąta do bufora ramki karty graficznej. Każdy punkt przyporządkowaną ma ponadto wartość głębi Z, która przechowywana jest w tzw. buforze Z (który zazwyczaj tworzony jest w obrębie pamięci lokalnej karty).
Gdy akcelerator rysuje drugi trójkąt, przed zapaleniem punktu porównuje jego współrzędną Z ze współrzędną Z odpowiadającego mu punktu pierwszego trójkąta. Jeśli nowy punkt ma niższą wartość Z, jest rysowany. W przeciwnym wypadku akcelerator nie zapala tego punktu i sprawdza kolejny punkt. I tak dla każdego trójkąta na scenie.

Na ekranie komputera przy rozdzielczości 1024x768 i 16-bitowej głębi współrzędnej Z, współrzędna X ograniczona jest do 1024 punktów, Y - do 768 punktów, a Z - do 65536 (216=65536) punktów (65536 pozycji "w głąb ekranu"). Obraz o rozdzielczości 1024x768 składa się z prawie 800 tys. punktów (1024 x 768 = 786432). Zapis samego obrazu bez użycia współrzędnej Z wymaga ponad 3 MB pamięci (4 bajty na każdy punkt, czyli 768432 x 4 = 3145728 bajtów). Do tego dochodzi jeszcze 16-bitowa (najczęściej), czyli 2-bajtowa współrzędna Z, która wymaga dodatkowego 1,5 MB (768432 x 2 = 1536864 bajtów). Obraz przechowywany jest przez akcelerator 3D w pamięci lokalnej zwanej buforem ramki (frame buffer). Tutaj także tworzona jest pamięć współrzędnej Z zwana buforem Z (Z-buffer). W grach stosuje się 16-bitowy bufor Z (czyli współrzędna Z ma rozdzielczość 16 bitów), zaś w aplikacjach profesjonalnych - 24 lub nawet 32-bitowy bufor Z. Wystarczy dodać ilość pamięci potrzebnej do przechowania ramki do pamięci potrzebnej na bufor Z, by zrozumieć, dlaczego najnowsze akceleratory 3D posiadają 32 lub nawet 64 MB lokalnej pamięci.

Bufor szablonowy
Niektóre nowe akceleratory 3D wyposażono w specjalny bufor, zwany buforem szablonowym (stencil buffer). Można go wykorzystać na kilka sposobów.
W symulatorach lotu czy samochodu tworzy się szablon wnętrza samochodu czy kokpitu samolotu. Szablon ten zapamiętywany jest w buforze szablonowym (wystarczy tylko 1-bitowy bufor, np. jedynka oznacza "tu nie wolno renderować", a zero - "tu wolno"). Następnie akcelerator renderuje grafikę 3D tylko w miejscu nie zakrytym przez szablon.


Wykorzystanie szablonu w symulatorze lotu

Większość nowoczesnych układów graficznych wyposażono w 8-bitowe bufory szablonowe. Dzięki nim można uzyskać wiele innych ciekawych efektów - cieni wolumetrycznych (volumetric shadows), śladów po hamowaniu (symulatory samochodów), krwi na podłodze itd.


Cień wolumetryczny w Quake III Arena
.i od nowa

Całość wymienionych procesów prowadzi do wygenerowania jednej trójwymiarowej sceny ("klatki animacji"). By scenę tę wprowadzić w ruch, trzeba wszystkie fazy rozpocząć od nowa - tworzenie "drucianych" brył, obkładanie ich teksturami, cieniowanie, oświetlenie itd. By obraz na ekranie zmieniał się w sposób płynny, akcelerator musi stworzyć kompletną scenę 3D w czasie równym lub krótszym od jednej trzydziestej sekundy (by obraz mógł zmieniać się co najmniej trzydzieści razy w ciągu sekundy). Wyobraźcie sobie, że musicie trzydzieści razy w ciągu sekundy przeczytać cały ten artykuł - chyba wystarczy to, by zobrazować ogrom pracy wykonywanej przez akcelerator grafiki przestrzennej przy dzisiejszych grach czy trójwymiarowych aplikacjach. Jeśli się to dostatecznie zrozumie, można nabrać szacunku nawet dla procesora ViRGE.

Ważna jest jakość obrazu

O jakości obrazu generowanego przez akcelerator grafiki trójwymiarowej decyduje ilość wspomaganych przez niego funkcji 3D. Im więcej, tym lepiej. W dniu dzisiejszym najbogatszym układem w funkcje 3D jest ATI Radeon 256. Tuż za nim znajdują się GeForce2 GTS, GeForce2 MX oraz GeForce 256. Są one obecnie najpopularniejszymi układami 3D na rynku. Bardzo szeroką paletą funkcji 3D mogą się też pochwalić starsze układy NVIDII (Vanta, RIVA TNT, rodzina TNT2), ATI (RAGE 128) czy 3dfx (VSA-100).

Wszystkie popularne karty graficzne zbudowane są w oparciu o procesory wspomagające grafikę płaską i trójwymiarową. Karty te posiadają lokalną pamięć, którą dzielą na bufor ramki, bufor Z i bufor tekstur. Większość kart graficznych (prócz Voodoo4 i Voodoo5) potrafi przechowywać i pobierać tekstury z pamięci komputera, przez co całą swoją pamięć lokalną mogą one przeznaczyć wyłącznie na bufor ramki i bufor Z.

Dithering
Akceleratory 3D tworzą trójwymiarowe sceny z użyciem 16-bitowej lub 24-bitowej palety kolorów (nazywanej 32-bitową, aczkolwiek tylko 24 bity opisują kolor). W trybie 32-bitowego koloru dostępnych jest aż 16777216 różnych barw, jednak w trybie 16-bitowego koloru ta licza spada do 65536. Ponieważ ilość ta jest niewystarczająca do wiernego odwzorowania świata 3D, więc akceleratory stosują technikę tzw. ditheringu. Brakujące kolory tworzone są przy pomocy mieszanki pikseli o kolorach z dostępnej palety. Powstaje efekt "ziarnistości", zwany ditheringiem.


Słońce z programu 3DMark 99 (tryb demo) z zaznaczonym fragmentem do powiększenia


Fragment w trybie 16-bitowego koloru, wyraźnie widać dithering


Fragment w trybie 32-bitowego koloru, gradienty kolorów są bardzo ładne

Zła szybkość = brak animacji

Dobra jakość obrazu to jednak nie wszystko. Istotna jest także płynność animacji. Ruchomy obraz będzie sprawiał wrażenie płynnego, gdy będzie zmieniał się co najmniej 30 razy na sekundę. Teoretycznie obraz jest wówczas idealnie płynny dla człowieka. Jednak obserwowane na ekranie ruchome obiekty, renderowane z prędkością 60 klatek na sekundę wydają się być ostrzejsze niż te renderowane z szybkością 30 klatek na sekundę. Wybierając rozdzielczość do gry w grach będziemy musieli najczęściej dokonać wyboru: 60 fps i minimalnie ostrzejszy obraz, ale o gorszej jakości (np. niższej rozdzielczości), lub 30 fps, ale o obrazie lepszej jakości.

Copyright (C) 2000 by PiŁA. Kopiowanie bez zezwolenia zabronione.








Komentarze



3D - TOBI - 08-09-2001 16:41

Zajebista strona!



Super - RAF - 23-11-2001 15:55

bardzo dokladny opis. W dosc przystepny sposob odkrywa tajniki dzialania kart 3D.

Napisz Komentarz



Kto
E-mail
Temat

 Tresc :




Redakcja serwisu Frazir.Wroc.pl nie ponosi odpowiedzialności za ewentualne szkody powstałe w wyniku użytkowania materiałów
w postaci wszelkich binarnych plików, artykułów, reklam oraz innych treści ukazujących się na łamach Frazir.Wroc.pl
| Strona wygenerowana w 0.01 s | Strona zoptymalizowana pod IE,NN i Opera |
| Copyright © frazir 1997-2001 | Strona korzysta z łącz firmy livenet |