Rendering dla opornych (część 3)

MBI
2006/07/27 16:00
0
0

Jeszcze raz krok po kroku.

Jeszcze raz krok po kroku. Omówiliśmy już większość efektów graficznych stosowanych podczas tworzenia sceny 3D. Skoro mamy to już za sobą, spójrzmy na proces renderingu całościowo. Jeśli mielibyśmy go podsumować w jednym zdaniu i pół żartem, można pokusić się o stwierdzenie iż to zadanie karty graficznej mające na celu oszukanie naszego wzroku tak abyśmy uwierzyli, że to co dwuwymiarowe wcale takie nie jest. Trójwymiarowa scena przedstawiana jest przecież na płaskim ekranie monitora. Wszystkie lub spora część obiektów, mimo iż tak naprawdę składają się jak w grafice rastrowej po prosu z różnokolorowych pikseli, sprawiają wrażenie wielowymiarowych brył o różnej fakturze wirtualnego materiału z którego są stworzone. Zanim jednak powstanie efekt końcowy, czyli płaski obraz sprytnie udający świat 3D, akcelerator graficzny musi wykonać kolejne kroki procesu renderingu z zastosowaniem omówionych wcześniej technik i wzbogacając często obraz o kolejne efekty graficzne jak chociażby mgła. Jak to przebiega krok po kroku? Zapraszamy do lektury.

Na początek siatka z trójkątów. Pierwszym krokiem w powstawaniu sceny 3D jest stworzenie trójwymiarowych modeli oraz odpowiednie ich umieszczenie w wirtualnej przestrzeni (geometry setup). Siatka modeli powstaje z połączenia wierzchołków o trzech współrzędnych (wysokość, szerokość i głębia). Tak stworzony obiekt zostaje poddany transformacji, składającej się z trzech etapów: skalowaniu, translacji i rotacji. Skalowanie to, jak sama nazwa wskazuje, zmiana wielkości obiektu. Zadaniem translacji jest przesunięcie, a rotacji odpowiednie obrócenie bryły tak aby znalazła się w pożądanej pozycji. Dane wszystkich wierzchołków wysyłane są następnie do odpowiedniego układu akceleratora (triangle setup engine) i grupowane w trójkąty - figury najczęściej używane w aplikacjach czasu rzeczywistego. Proces ten nazywamy teselacją. Na tym etapie stosuje się też techniki mające na celu zmniejszenie wielkości macierzy opisujących współrzędne i odciążenie karty graficznej. Jest to możliwe gdyż praktycznie każdy wierzchołek należy zwykle do więcej niż jednego polygona. Rendering dla opornych (część 3)

Zabawy z teksturami. Mamy już obiekt 3D, odpowiednio umiejscowiony w scenie i podzielony na trójkąty. W tym momencie następuje etap powlekania każdego z polygonów za pomocą tekstury czyli mapowanie. Zanim to nastąpi, tekstury wycinane są w trójkąty (clipping) odpowiednio dopasowane do mapowanej powierzchni.

Rzadko kiedy tekstura odpowiada wielkością mapowanemu obiektowi. Tu wkraczają techniki opisane w poprzednich częściach artykułu. Jeśli teksturowana powierzchnia jest większa, akcelerator wykorzystuje próbkowanie punktowe. Jego efekt znamy dobrze ze starych tytułów jak Doom, gdzie popularną „pikselozę” mogliśmy podziwiać na każdym kroku.

W przypadku gdy tekstura jest większa od powlekanej powierzchni, akceleratory używają Mip mappingu. Zamiast każdorazowo zniekształcać i interpolować teksturę bazową, GPU wykorzystuje osiem wcześniej przygotowanych i przechowywanych w pamięci karty mipmap.

W celu pozbycia się „pikselozy” i aby obiekty wyglądały pięknie i gładko, karty graficzne korzystają z technik filtrowania tekstur, których częścią składową są wspomniane wyżej próbkowanie punktowe oraz Mip mappowanie. Filtrowanie, czyli interpolacja obszarów o jednakowych kolorach powstałych z pojedynczych tekseli, dzielimy na izotropowe i anizotropowe. Do izotropowego zaliczamy filtrowanie dwuliniowe i trójliniowe, które operują na czterech punktach, otaczających jeden teksel i mogących być jedynie kwadratem.

Filtrowanie anizotropowe będące najbardziej zawansowaną metodą filtrowania, wykorzystuje się do interpolacji tekseli układających się w inne kształty niż kwadraty. Dzięki temu na ścianach widzianych po kątem, tekstury nie ulegają zniekształceniu tak, jak byłoby to w przypadku filtrowania izotropowego. Oczywiście ta technika jest najbardziej obciążającym GPU rodzajem filtrowania.

Samo nałożenie i przefiltrowanie tekstury jednak nie wystarcza. W celu nadania tworzonym obiektom większego realizmu do dzieła wkracza Bump mapping, czyli mapowanie wybojów, które dokładnie omówiliśmy w poprzedniej części artykułu. Złudzenie nierówności powierzchni uzyskane tą metodą prezentuje się bardzo dobrze, ale warto zwrócić uwagę, że krawędzie obiektu pozostają gładkie.

Podczas mapowania karta graficzna musi zadbać także o zachowanie odpowiedniej perspektywy, aby tekstury na pochyłych powierzchniach nie ulegały deformacji. W tym celu stosowane są algorytmy korekcji perspektywy. Polega to na stworzeniu wirtualnego „punktu nieskończoności” przez który musi przechodzić każda linia poprowadzona z dowolnego miejsca na ekranie. Przy zachowaniu tej zasady GPU nakłada tekstury, pozbawione dzięki temu niepotrzebnych zniekształceń. Perspektywa i fakt tworzenia obrazu z pikseli czyli po prostu małych kwadratów, dostarcza akceleratorowi kolejny problem do rozwiązania. Większość linii w scenie 3D jest prowadzona ukośnie co powoduje powstawanie „schodków”, a zwiększenie rozdzielczości obrazu i wraz z nią zmniejszenie wielkości pikseli sprawy nie załatwia. W celu uzyskania gładkich linii i krawędzi służą nam dwa rodzaje antyaliasingu: krawędziowy i pełnoekranowy.

Bez światła i cieni ani rusz. Kolejnym etapem w tworzeniu sceny 3D jest cieniowanie. Mamy już odpowiednio umiejscowione obiekty, pokryte odpowiednimi teksturami i z wygładzonymi krawędziami. Czego nam brakuje? Oczywiście oświetlenia. Najprostszym sposobem cieniowania jest cieniowanie płaskie (flat shading) polegające na określeniu poziomu jasności osobno dla każdego trójkąta tworzącego obiekt 3D z uwzględnieniem koloru oświetlenia. Wadami tego sposobu są wyraźnie odcinające się przejścia pomiędzy trójkątami oraz ten sam odcień dla polygonu zaczynającego się blisko widza a kończącego się w głębi sceny, mimo iż tam powinien być ciemniejszy.

Najczęściej używaną i znacznie lepszą metodą jest cieniowanie Gourauda (Gouraud shading) – cieniowanie wierzchołkowe. Technika ta polega na przyporządkowaniu koloru i jasność każdemu z trzech wierzchołków trójkąta. Poprzez interpolację koloru jego wierzchołków powstaje odcień wnętrza, dzięki czemu przejścia cieni pomiędzy wierzchołkami i krawędziami trójkątów są płynne.

Kolejną techniką usprawniającą cieniowanie i oświetlanie są mapy świateł. Wymagają one dodatkowego przebiegu renderingu, podczas którego na teksturę bazową nakładana jest mapa światła nadając każdemu pikselowi mapowanej powierzchni konkretną wartość oświetlenia. Bez użycia tych map, proste obiekty jak ściana oświetlona przez lampę musiałyby składać się z wielu trójkątów poddanych cieniowaniu Gourauda, co bardzo mocno obciążało by akcelerator.

Phong shading jest najbardziej zaawansowaną metodą cieniowania. Jasność i odcień przyporządkowywana jest każdemu punktowi obrazu oddzielnie. Wyliczana jest za pomocą interpolacji jak w cieniowaniu wierzchołkowym, oraz przy pomocy wektorów normalnych zawierających informacje o natężeniu, kolorach oraz orientacji padającego i odbitego światła. Mówiąc prościej - w metodzie Phonga obliczana jest nie tylko wypadkowa oświetlenia punktu, ale także orientacja odbitego od powierzchni promienia światła.

Skoro jesteśmy przy oświetleniu warto wspomnieć o HDR (High Dynamic Range), technice pozwalającej na uzyskanie bardzo realistycznego oświetlenia. nVidia działanie HDR trafnie podsumowuje w trzech punktach:

  • Jasne rzeczy są naprawdę jasne ...
  • ... ciemne rzeczy są naprawdę ciemne ...
  • ... a detale są widoczne w obydwu przypadkach.

GramTV przedstawia:

Posiadacze kart graficznych wspierających Shader Model 2.0 lub nowszy mogą się zapoznać z możliwościami HDR po poniższym linkiem: http://www.daionet.gr.jp/~masa/rthdribl/ Strona jest anglojęzyczna ale zciągnięcie i uruchomienie dema prezentującego możliwości tej techniki nie powinno przysporzyć nikomu problemów. Serdecznie polecamy. Ubarwianie wirtualnego świata. Następna faza tworzenia sceny 3d to dodanie tzw. efektów atmosferycznych (atmospheric effects) takich jak mgła, ogień czy dym. Najczęściej stosuje się efekt mgły, uzyskiwany na trzy sposoby. Mgła liniowa (Linear fog) polega na stopniowym zamgleniu obiektów wraz ze wzrostem odległości od obserwatora. Im dalej tym więcej "ścian mgły” i gorsza widoczność obiektu aż do całkowitego zniknięcia. Mgła tablicowa (Table fog) - poziom zamglenia jest opisany dowolnymi wartościami zapisywanymi w odpowiedniej tablicy. Dzięki temu rodzajowi mgły istnieje możliwość jej tworzenia w konkretnym miejscu np. w przepaści lub nad taflą jeziora. Mgła wykładnicza (Exponential fog) działa na podobnej zasadzie, co mgła tabelowa. Wartość zamglenia wyliczana jest od razu za pomocą odpowiedniego wzoru matematycznego bez konieczności tworzenia tablicy.

Innymi przykładami efektów atmosferycznych mogą być przezroczystość (transparency), zlewanie (blending) czy depth cueing – efekt zacierania się obiektu wraz ze wzrostem odległości od widza. Im dalej tym kolory stają się ciemniejsze a kształty mniej wyraźne.

I tak przynajmniej trzydzieści trzy razy. Ostatni faza renderingu nosi nazwę resteryzacji. Polega on na zamianie wszystkich współrzędnych oraz parametrów obrazu na mapę czyli po prostu zbiór kolorowych punktów wyświetlony na ekranie monitora. Taki obraz to nic innego jak jedna klatka animacji i aby scenę wprowadzić w ruch, cały proces renderingu musi zostać powtórzony. Najlepiej kilkadziesiąt razy na sekundę.

Komentarze
0



Nie ma jeszcze żadnych komentarzy. Napisz komentarz jako pierwszy!