Wykład kolejny, o rysowaniu po ekranie
Tym razem odpuścimy sobie sprawy związane z historią i typami gier, bynajmniej nie uważając tematu za zamknięty całkiem i na zawsze. Najważniejsze już chyba jednak zostało powiedziane, możemy więc przejść dalej – a tym dalej będzie tym razem małe co nieco o grafice – a konkretnie o technicznej stronie jej generowania.
W najdawniejszych czasach, kiedy każdy bit wydawał się być cudem świata (zwłaszcza ósmy), praktycznie cała grafika w grach tworzona była za pomocą sprite’ów. Sprite to po angielsku duszek, w komputerach zaś nazwano w ten sposób mały obrazek wyświetlany w dowolnym miejscu ekranu, na ogół na pierwszym planie.
Czasem sprite’y były generowane sprzętowo (np. na C64), czasem musiał je rysować w pamięci ekranu procesor (np. na Spectrum), czasem dla wytworzenia wrażenia ruchu sprite’y miały kilka klatek, wyświetlanych po kolei. Ta technologia miała jedno, bardzo wyraźne ograniczenie – sprite’y zawsze były tej samej wielkości, a nawet jeśli dawały się skalować, to tylko w sposób nieciągły – można je było powiększyć dwukrotnie, trzykrotnie, inaczej w pionie, a inaczej w poziomie, ale nie dawało się zmienić ich rozmiaru o 37% i jeszcze obrócić o 13 stopni. Na to technologia nie pozwalała. Co więcej, obraz generowany za pomocą sprite’ów zawsze był płaski, nigdy nie mógł mieć głębi, toteż o ile dawało się sprite’ami obsłużyć platformówki i przygodówki, w przypadku symulatorów ta technologia nie zdawała egzaminu.
Pod tym względem znacznie elastyczniejsza jest następna technika generowania obrazu – składanie go z jednokolorowych wieloboków. Całkiem zgrabny samochód albo samolot można zbudować z kilkunastu wieloboków, a jeżeli jeszcze wybierze się tylko te, które są skierowane swoją widoczną powierzchnią w stronę gracza i narysuje je poczynając od tych znajdujących się najdalej, a kończąc na tych najbliższych, uzyska się obraz w miarę przypominający rzeczywisty świat. Wprawdzie algorytmy pozwalające na wybór odpowiedniej kolejności rysowania wieloboków są dosyć skomplikowane, a co za tym idzie wymagają dość szybkiego komputera, jednak położenie wierzchołków wieloboków można (opierając się na kilku podstawowych wzorach z geometrii analitycznej) bardzo łatwo wyliczyć, co pozwala na stosunkowo proste uzyskanie pseudotrójwymiarowego świata.
Następnym krokiem okazało się być – dość nieoczekiwanie – zastosowanie skalowanych sprite’ów. Okazało się, że można je dowolnie skalować (37%) i obracać stosunkowo tanio, nie obciążając w tym celu procesora jakimiś niestworzonymi obliczeniami. Wprawdzie skalowane w ten sposób sprite’y wyglądają dość obrzydliwie, jednak dzieje się tak tylko wtedy, gdy każdy z nich ogląda się pojedynczo. W ruchu (zwłaszcza szybkim) deformacje i zniekształcenia powstające przy każdym skalowaniu znikają (a dokładniej ulegają uśrednieniu, dzięki temu, że za każdym razem są trochę inne). W ten sposób udało się uzyskać znacznie lepszy obraz niż w przypadku wieloboków, obiekty zaczęły sprawiać wrażenie wypukłych – i choć było to tylko złudzenie optyczne, jakość obrazu była lepsza. Warto dodać, że ta technologia wymaga znacznie więcej miejsca w pamięci – trzeba bowiem dysponować sprite’ami, na których będzie obiekty widać z różnych stron.
Miłośnicy technologii wieloboków też nie dawali za wygraną i poprawili jakość obrazu stosując cieniowanie techniką Gourauda. Pomysł jest bardzo prosty – zamiast zamalowywać całą powierzchnię wielo-boku jednym kolorem, kolor ten po trochu się zmienia – zaczynając od jednej wartości na jednej krawędzi wieloboku, a kończąc na innej na drugiej krawędzi. Oczywiście trzeba umiejętnie dobrać kolory krawędzi, ale nie stanowi to wielkiego problemu (o dziwo, najefektywniejszy algorytm wyznaczania koloru punktu w obrębie wieloboku jest niewielką modyfikacją tego, który posłużył do skalowania sprite’ów). A efekt – znacznie lepszy od wszystkich dotychczasowych.
W tym momencie aż się prosi o pójście po rozum do głowy i zauważenie, że między skalowaniem i obracaniem sprite’ów, a rysowaniem wypełnionych jakimś wzorem wieloboków właściwie nie ma wielkiej różnicy. Jeżeli sprite będzie akurat wielobokiem i zostanie odpowiednio przeskalowany, efekt (z geometrycznego punktu widzenia) będzie dokładnie taki sam, jak w przypadku narysowania wieloboku, na który została nałożona faktura. I to był następny, jak na razie ostatni (?) etap ewolucji. Jeżeli lecący na Ciebie samolot ma okna, przez które widać członków załogi, jeżeli widać namalowane na jego bokach numery, a hen, daleko na powierzchni ziemi widać drobną siateczkę różnokolorowych pól uprawnych, poprzecinanych drogami i rzekami, to najprawdopodobniej masz właśnie do czynienia z wielo-bokami z nałożoną fakturą („teksturowanymi”, jak się czasem mówi). I – nie zgadniecie – zastosowany do sprawnego nakładania faktury algorytm jest mniej więcej tym samym, o którym była już w tym wykładzie kilka razy mowa.
Warto jeszcze pokrótce wspomnieć o dwóch innych technologiach, które znalazły zastosowanie w generowaniu grafiki w grach. Jedna z nich to voxel space – czyli ta technika, którą posłużono się przy rysowaniu świata w „Comanche” i wszystkich grach pochodnych. Latające śmigłowce i inne obiekty są tam po prostu skalowanymi sprite’ami, ale technika generowania krajobrazu jest zupełnie inna niż wszystkie dzisiaj opisane. Druga technologia to wykorzystanie wieloboków do tworzenia płaskich obrazów, z którą mieliśmy do czynienia w „Another World” – nie użyta jak na razie nigdzie indziej.
Te kilka akapitów bynajmniej nie wyczerpuje całego tematu, jednak dotyczy około 95% wszystkich gier dostępnych na rynku, często jedynie wzbogaconych o różne drobiazgi, na które pozwala moc obliczeniowa dzisiejszych procesorów. A pozostałe pięć procent? Ha, to będzie zapewne temat wykładu który pojawi się w Uniwersytecie za następne kilka lat…
Borek
<- Uniwersytet Gracza 45 | Uniwersytet Gracza 47 -> |