Fotorealizm 3D

W poprzedniej części naszego cyklu o sprzętowym generowaniu grafiki ($(LC123937:Trójwymiarowa rewolucja)$) opowiedzieliśmy, jak współczesne karty graficzne tworzą złożony z trójkątów szkielet trójwymiarowej sceny. Teraz zajmijmy się tym, jak na ten stelaż nałożyć realistyczną powłokę i sprawić, żeby wszystkie występujące na scenie 3D przedmioty i postacie wyglądały tak, jak w rzeczywistym świecie. Proces ten nazywa się renderingiem, a jedną z jego najważnieszych części jest teksturowanie.

Sztuka origami

Rendering realizowany przez wszystkie współczesne akceleratory 3D podzielić można na cztery główne fazy: teksturowanie, modyfikacje nałożonych tekstur, cieniowanie oraz dodawanie efektów “atmosferycznych”, do których zalicza się m.in. dym, mgłę czy różnego rodzaju rozlane plamy oleju.

Wszystkie wymienione operacje są dzisiaj wykonywane przez kartę graficzną, niemniej kości 3D całkiem niedawno “nauczyły się” modyfikować nałożone już na obiekty tekstury. Stało się to możliwe za sprawą jednostek Pixel Shader. Te moduły wykonawcze zadebiutowały wraz z kartami ATI Radeon 8500 oraz nVidia GeForce3. Ich obsługa znalazła się zaś w bibliotekach graficznych DirectX 8.0 i OpenGL 1.3.

Wróćmy jednak do pierwszego i najważniejszego etapu renderingu – teksturowania. Faza ta zazwyczaj pochłania ponad 60% czasu potrzebnego na przygotowanie każdej sceny 3D. Sama tekstura to płaska mapa bitowa (bitmapa) o z góry zadanej przez programistę wielkości. Najczęściej wykorzystuje się tekstury o rozmiarze 256×256, 512×512 oraz 1024×1024 piksele. 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ę.

Sam proces nakładania tekstur, który nazywany jest mapowaniem, sprowadza się do “obwijania” brył teksturami. Mapowanie można porównać zatem do zawijania kanapki w folię aluminiową lub bardziej obrazowo: pakowania świątecznych prezentów w kolorowy papier. W tym miejscu warto też przypomnieć, że pojedynczy punkt tekstury nazywa się tekselem (od ang. texture element). Termin ten często jest błędnie stosowany na zmianę ze słowem piksel (ang. picture element). Mając już tę podstawową wiedzę, udajmy się naszą wędrówkę po teksturowaniu. Zacznijmy ją od procesu przygotowania tekstur, jeszcze przed nałożeniem ich na szkielet sceny 3D.

1. MIP mapping, czyli jak sobie radzić z teksturami

Jak pamiętamy z pierwszej części artykułu o generowaniu grafiki 3D, gotowy szkielet sceny składa się z setek tysięcy trójkątów o różnej wielkości. Przygotowanie tekstur pasujących do każdego trójkąta znajdującego się na scenie nie jest możliwe, gdyż liczba potrzebnych bitmap musiałaby iść wówczas w setki milionów! Z takim ogromem wymienianych pomiędzy procesorem a kartą graficzną danych nie poradzi sobie nawet najszybszy komputer.

Oczywiście najprostszym sposobem na ominięcie tego problemu jest przesłanie do pamięci karty kilku podstawowych wzorów tekstur, a następnie ich przeskalowanie, tak aby każda z nich pasowała pod wzgledem rozmiaru do konkretnego użytego na scenie trójkąta. Niestety, taka operacja trwałaby strasznie długo (kilkanaście sekund na jedną klatkę animacji), nie mówiąc już o tym, że trzeba by było gdzieś te wszystkie tekstury zmieścić.

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. Jeśli pierwsza miała rozmiar 1024×1024 piksele, to następna będzie miała wielkość 512×512 punktów, kolejna 256×256 itd. Następnie do teksturowania wybiera się najbardziej zbliżone wielkością do mapowanego trójkąta mapy MIP – małe do małych, a duże do dużych trójkątów.

Więcej:bezcatnews