Podróż do wnętrza

Obsługa tekstur trójwymiarowych najprawdopodobniej zostanie włączona do ósmego wydania pakietu Microsoft DirectX, a Nvidia zapowiedziała model kompresji “przestrzennych bitmap”. Czy tekstury 3D istnieją od niedawna? Jakie efekty można za ich pomocą uzyskać?

Techniki tekstur trójwymiarowych nie są niczym nowym, ani tym bardziej zaskakującym. Z obrazów przestrzennych (zwanych również warstwowymi lub wolumetrycznymi) od dłuższego czasu korzystają np. lekarze wykonujący tomografię komputerową np. mózgu pacjenta. Zabieg ten polega na prześwietleniu badanej osoby w celu uzyskania przekroju jej organów: specjalna głowica przemieszcza się wzdłuż ciała pacjenta i co pewien czas wykonuje zdjęcie, na którym zostaje zapisana jedna “warstwa” prześwietlanego narządu. Następnie po złożeniu ze sobą tak powstałych obrazów powstaje przestrzenny model, na podstawie którego lekarz może określić przyczynę dolegliwości chorego. Model ten w świecie projektantów grafiki 3D nazywa się właśnie teksturą wolumetryczną.

Dodać bitmapie wymiaru

Posługując się językiem bardziej zrozumiałym dla użytkowników komputerów, teksturę trójwymiarową można zdefiniować, rozszerzając pojęcie klasycznej, płaskiej bitmapy. Wiadomo, że obraz nakładany na obiekty w przestrzeni jest prostokątem zbudowanym z kolorowych pikseli, a każdy taki punkt ma przypisane dwie współrzędne (s, t). Jeżeli do tych dwóch współrzędnych dodamy trzecią – opisującą, którą warstwę tworzy dany prostokąt – powstanie tekstura wolumetryczna. Trzecia zmienna oznaczana jest symbolem “r”.

Nakładanie tradycyjnej tekstury 2D na obiekt trójwymiarowy – mówiąc najbardziej obrazowo – polega na dokładnym “owinięciu” generowanej bryły kolorową “płachtą”, czyli płaską bitmapą. Wyobraźmy sobie kulę owijaną arkuszem gazety. Nie istnieje idealny sposób na równe, szczelne obłożenie tej bryły papierem – zawsze w którymś miejscu arkusz będzie musiał ulec niepożądanemu zgnieceniu. Wspomniane zniekształcenie dla zapewnienia jakości generowanego obrazu trzeba zniwelować, wykorzystując różne matematyczne operacje.

W przypadku zastosowania tekstur warstwowych unika się potrzeby wykonywania matematycznych przekształceń. Tutaj wystarczy umieścić odpowiednio wymodelowany obiekt 3D (niech będzie nim użyta wcześniej kula) bezpośrednio w bloku zawierającym teksturę wolumetryczną. Obrazowo technika ta zbliżona jest do rzeźbienia. Dysponujemy przygotowanym wcześniej blokiem materiału (np. granitu, marmuru, drewna), z którego przez zdejmowanie niepotrzebnych fragmentów wyrzeźbiona zostanie przykładowa kula. Podczas pracy nie powstaną zniekształcenia, o których mowa była wcześniej, ponieważ kula nie jest uzupełniana teksturą, ale z niej budowana! Taka metoda tworzenia daje grafikom 3D szerokie pole do popisu.

Praktyczne zastosowanie tekstur 3D: w Instytucie Zastosowań Matematyki i Informatyki w Medycynie (Institute of Mathematics and Computer Science in Medicine) na uniwersytecie w Hamburgu opracowano trójwymiarowy model człowieka z wykorzystaniem systemu VOXEL-MAN.

Istnieje także druga strona medalu. Zamiast w opisany sposób modelować obiekty trójwymiarowe, można wykorzystać w tym celu informacje o przezroczystości, zapisane w teksturze przestrzennej. Mówiąc innymi słowy – teksturę 3D można tylko częściowo wypełnić danymi o kolorze, resztę pozostawiając pustą. Wtedy po nałożeniu na prostopadłościan informacji o kolorze oraz obszarach, w których obiekt ten ma być przezroczysty, może powstać np. kula. Dzięki opisanej metodzie do zbudowania skomplikowanych obiektów nie trzeba wykorzystywać bardzo szczegółowej geometrii, a tym samym dużej mocy obliczeniowej komputera. Z drugiej jednak strony zaleta ta może stać się jednocześnie wadą generowania modeli 3D, zwłaszcza kiedy obiekt będzie prezentowany w dużych zbliżeniach. W takiej sytuacji informacja zawarta w teksturze może okazać się niewystarczająca do zapewnienia bryle wymaganej szczegółowości.

Ponieważ współrzędne ze świata 3D nie będą się pokrywały ze współrzędnymi określającymi położenie punktu na teksturze 2D (na ogół nie można wybrać konkretnego punktu z tekstury, który odpowiadałby określonemu punktowi na obiekcie 3D), stosuje się różne metody doboru pikseli z bitmapy. Najprostsza z nich – próbkowanie punktowe – polega na wybraniu wyłącznie jednego piksela, ten sposób jednak jest najgorszy pod względem wizualnym. Dlatego najczęściej z tekstury pobiera się kilka punktów sąsiednich, a następnie “zlewa się” je ze sobą w procesie filtrowania. W przypadku tekstur 3D punkty sąsiednie nie wybiera się z jednej, ale z kilku najbliższych płaszczyzn i przeprowadza podobne obliczenia, których celem jest “przefiltrowanie” sąsiadujących ze sobą pikseli.

Czy aby nie za dużo?

Problemem, któremu muszą sprostać współczesne karty graficzne, jest konieczność pomieszczenia w ograniczonym obszarze pamięci wszystkich wykorzystywanych do renderowania danej sceny tekstur. Zagadnienie to nie jest bynajmniej błahe. Łatwo policzyć, że bitmapa o wielkości 512×512×32 bity zajmuje dokładnie megabajt, a do stworzenia sceny potrzebnych jest 20 obrazów o podobnych parametrach. Do tego dochodzi pamięć zarezerwowana dla bufora ramki oraz Z-bufora. Robi się naprawdę ciasno. Kiedy używane są tekstury 3D, każda o wymiarach 512×512×512×32 bity zajmie aż 512 megabajtów! Obsługa takich pojemności przerasta możliwości praktycznie każdego współczesnego akceleratora grafiki 3D. Problem rozwiązuje się dwojako: po pierwsze, stosowane są tekstury o mniejszych wymiarach, po drugie, każda taka tekstura 3D jest dodatkowo kompresowana, co łącznie powinno zapewnić rozsądny stosunek objętości do jakości obrazu. W tym celu można zastosować jedną z już istniejących technik kompresji: S3TC (S3 Savage4 i Nvidia GeForce), FXT1 (3dfx VSA-100) lub VQ (VideoLogic PowerVR). Nowością jest VTC (Volume Texture Compression), jednak opracowany przez Nvidię schemat kompresji tekstur warstwowych nie został jeszcze udokumentowany, dlatego niemożliwe jest przedstawienie sposobu jego działania.

Innym rozwiązaniem jest zastosowanie tekstur proceduralnych. Ich istota polega na tym, że tradycyjna wielokolorowa bitmapa została zastąpiona wzorem matematycznym, który zapisany zajmuje zdecydowanie mniej pamięci nawet od skompresowanego obrazu. Dzięki teksturom proceduralnym uzyskuje się np. regularny obraz marmuru, drewna czy szachownicy. Technika ta jest często stosowana w aplikacjach przeznaczonych do modelowania i renderingu 3D, np. 3D Studio MAX.

Efektownie, kolorowo

Wiadomo już, czym są tekstury 3D i jakie mają wymagania. Teraz kilka słów o możliwościach ich zastosowania w “prawdziwym 3D” – w grach komputerowych. Przede wszystkim mapy wolumetryczne pozwalają na proste stworzenie wirtualnego świata, który wchodzi w interakcje z użytkownikiem komputera. To nieco zagadkowe sformułowanie można lepiej opisać za pomocą przykładu. Wyobraźmy sobie ścianę pokrytą teksturą wielowarstwową: na pierwszej warstwie znajduje się obraz tapety, na drugiej podkładu, na ostatniej ceglanego lub betonowego muru – całkiem jak w rzeczywistości. Po oddaniu strzału i niewielkiej modyfikacji tekstury – nadaniu części pikseli atrybutu przezroczystości – zobaczyć będzie można odprysk z widocznymi wszystkimi trzema warstwami. Inny przykład nawiązuje do wcześniejszego opisu rzeźbienia w bloku z teksturą. Kiedy w wirtualnym świecie częściowemu zniszczeniu (zburzeniu) ulegnie obiekt zbudowany z jednolitego materiału, np. granitu, cegieł lub drewna, podczas dokładnego oglądania zgliszczy będzie widać “wnętrze” uszkodzonego modelu – bez konieczności tworzenia osobnej bitmapy, która musiałaby być użyta do pokrycia nowo odsłoniętych partii obiektu.

Nieco bardziej spektakularnym efektem, dostępnym dzięki zastosowaniu tekstur warstwowych, jest mgła wolumetryczna. Dotychczas w grach można było zobaczyć jedynie mgłę jednolitą, równomiernie wypełniającą całe pomieszczenie lub jego część. Mgła wolumetryczna jest zbudowana z wielu warstw o różnej gęstości. Przy gruncie jest ona bardzo gęsta, przez co ukryte w niej obiekty pozostają niewidoczne dla obserwatora. Im wyżej od ziemi, tym mgła jest bardziej przepuszczalna, co sprawia, że kontury umieszczonych w niej modeli stają się bardziej zarysowane. Ten rodzaj mgły występuje często w lasach i wilgotnych pomieszczeniach. Dzięki warstwowej strukturze tekstur 3D doskonale nadają się one do reprezentacji mgły wolumetrycznej, mającej dość zbliżoną budowę.

Przykłady zastosowania tekstur 3D ograniczone są tylko wyobraźnią twórcy gry lub możliwościami programu graficznego.

Tekstury przestrzenne można również użyć do animacji np. płonących pochodni. Na każdej warstwie umieszczana jest jedna klatka animacji. Następnie już w trakcie gry zmieniany jest po prostu numer wyświetlanej warstwy. Inne zastosowania tekstur 3D są ograniczone – jak to zwykle bywa w takich przypadkach – wyobraźnią grafików 3D pracujących nad grą czy programem wizualizacyjnym. Na przykład na uniwersytecie w Hamburgu powstał projekt Wirtualna mumia, dzięki któremu można się zapoznać “warstwa po warstwie”, jak wygląda owinięte w bandaże ciało zmarłego faraona.

Kończąc, warto wspomnieć, że technika tekstur warstwowych została zaimplementowana jako rozszerzenie w bibliotekach OpenGL oraz – o czym była mowa na początku – najprawdopodobniej zostanie wprowadzona do DirectX 8. Dzięki temu programiści uzyskają wygodny dostęp do nowych efektów, które z pewnością będą wykorzystane w grach komputerowych w ciągu najbliższych lat.

Info
Grupy dyskusyjne
Uwagi i komentarze do artykułu:
#
Pytania techniczne do zagadnień poruszanych w tekście:
#
Internet
Tekstury 3D:
http://beyond3d.com/articles/3dtextures/
Tekstury 3D – wersja polska:
http://www.benchmark.ceti.pl/artykuly/tekstury3d.html
Nakładanie tekstur:
http://www.sgi.com/chembio/resources/texture/ index.html
Uniwersytet w Hamburgu:
http://www.uke.uni-hamburg.de/institute/imdm/idv/gallery/ movies_profroentgen.en.html
Więcej:bezcatnews