InformacjeFelieton

Proceduralna generacja - światy matematycznym wzorem tworzone

... Bartłomiej Nagórski

Wielokrotnie słyszymy o proceduralnie generowanych poziomach w grach, niekiedy także o tworzonych w ten sposób teksturach, modelach czy całych światach. Ale czy wiemy co tak naprawdę kryje się za tym terminem?

W grudniu na wszystkie portalach growych przeczytać można było o zapowiedzianej podczas VGX grze No Man's Sky, której slogan reklamowy brzmi: każda planeta / każda roślina / każdy atom generowany proceduralnie. Trzeba przyznać, że gra zapowiada się ciekawie. Zademonstrowane ujęcia przedstawiają światy różnorodne, jak Cienie Amberu z cyklu powieści Rogera Zelaznego: czerwone lasy nad błękitnymi oceanami, śnieżne i pustynne krajobrazy, a także całe ekosystemy obcych stworzeń. Jak to się dzieje, że komputer jest w stanie przedstawić taką wielość pięknych miejsc?

Odpowiada za to właśnie wspomniana generacja proceduralna, czyli losowe (lub nie) tworzenie poziomów i elementów grafiki przez grę w trakcie jej działania. Mechanizm ten wykorzystywany jest w bardzo wielu tytułach: od staruteńkiej Elite, przez nieco mniej wiekowe Diablo, po zupełnie współczesne Frozen Synapse czy Minecraft, by wymienić zaledwie kilka. Na czym on jednak polega? Przed nami nie lada wyzwanie: wytłumaczyć pojęcie proceduralnej generacji osobom, które nie mają na co dzień do czynienia z technikaliami powstawania grafiki, gier wideo czy też programowania. Zacznijmy zatem od metafory: zamiast gotowego ciastka do zjedzenia, gra dostaje przepis i robi sobie ciastko sama. To przybliżenie nie wyjaśnia za wiele, ale wprowadza podstawowe rozróżnienie: w pierwszym przypadku elementy gry stworzone są przez jej autorów, w drugim - generowane przez program na podstawie zadanych formuł.

.kkrieger

Jakie mogą to być elementy? Na przykład tekstury, czyli dwuwymiarowe obrazki, nakładane na płaszczyzny trójwymiarowego modelu, by nadać mu barwę i fakturę, a tym samym iluzję rzeczywistości. W większości gier stosujących klasyczne podejście tekstury są pieczołowicie przygotowane przez grafików. Natomiast w grach posiłkujących się generacją proceduralną, obrazki te tworzone są na podstawie zapisanych wcześniej regułek podczas wykonywania kodu gry. Skąd wziąć odpowiednią formułę? Cóż, duża część pracy polega tu na eksperymentach, by znaleźć pasujący wzór, ale często punktem wyjściowym są wykresy matematycznych funkcji jedno- i dwuwymiarowych, w tym tak podstawowych jak sinus i cosinus. Wykorzystuje się też losowo tworzone obrazy szumu, turbulencji i fraktali.

Nie zawsze zresztą generowane muszą być całe obrazy, niekiedy wystarczy losowe, acz przestrzegające pewnych zasad dobranie barw. Przykładem może być niezależna produkcja Rescue The Beagles, w której ratujemy tytułowe pieski. Każdy etap składa się tam z trzech planów na różnych poziomach, a także z tła - gra dobiera ich kolory tak, by się nie gryzły. Z kolei w The Elder Scrolls III: Morrowind zaprzęgnięto generację proceduralną do tworzenia zmarszczek na wodzie - odpowiada za to technika opracowana przez firmę NVidia, przez co na innych kartach graficznych woda wyglądała znacznie mniej ciekawie.

Rescue The Beagles

Podobnie jak obraz w dwóch wymiarach, można też stworzyć model trójwymiarowy. Odbywa się to następująco: zamiast zapisywać w programie dokładny opis obiektu w przestrzeni, to znaczy wierzchołki, płaszczyzny, tekstury, zapisujemy tylko przepis na obiekt, czyli reguły według których ma on powstać. Te reguły to właśnie tytułowe procedury, czyli matematyczne wzory. Na ich podstawie gra tworzy trójwymiarowy model w trakcie działania, w odróżnieniu od sztywno zapisanych danych, uprzednio przygotowanych przez grafika. Znowu czas na metaforę: to jak danie grze ryby bądź danie wędki. Ryba - podczas ładowania poziomu gra wczytuje sobie gotowy obiekt. Wędka - gra generuje go sobie na podstawie wzoru.

Z poprzednich dwóch paragrafów można wywnioskować podstawowe różnice między klasycznym podejściem, a generacją proceduralną. To pierwsze wymaga większego nakładu pracy grafików w procesie produkcji, a także więcej miejsca na nośniku gry, by umieścić tam wszystkie informacje o obiektach i teksturach. To drugie natomiast wymaga uprzedniego obmyślenia odpowiednich procedur, a później obliczenia ich na bieżąco - tym samym nie potrzeba aż tyle miejsca na dane gry, za to konieczna jest odpowiednia moc obliczeniowa docelowej maszyny. Dobrze ilustruje to .kkrieger, darmowa strzelanina FPS, w której wszystko (postaci wrogów, tekstury, geometria poziomów) tworzone jest proceduralnie. Jej ściągnięcie z internetu trwa ułamek sekundy, ponieważ plik wykonywalny ma rozmiar zaledwie 96kB - dla porównania, niektóre obrazki na tej stronie są większe niż ta cała gra. Wizualnie .kkrieger reprezentuje poziom gdzieś pomiędzy Quake III, a Unreal Tournament 2004. Pierwsza z nich dystrybuowana była na płycie CD i zajmowała kilkaset megabajtów, druga zaś na płycie DVD i zajmowała dwa gigabajty, czyli ponad 20.000 razy więcej miejsca niż .kkrieger. Uruchomiwszy jednak maleńką grę trzeba uzbroić się w cierpliwość, gdyż najpierw musi ona przeprowadzić stosowne obliczenia i przygotować sobie wszystkie elementy.

Jeśli idzie o grafikę trójwymiarową, to generacji proceduralnej najczęściej używa się do tworzenia obiektów naturalnych, takich jak góry, roślinność, fale i tak dalej. Dzieje się tak dlatego, że są one bardziej nieregularne, podobnie jak efekty działania wspomnianych wcześniej funkcji. Doskonałym przykładem na to jak realistycznie mogą one wyglądać jest Elevated, zaledwie czterokilobajtowe (tak!) demo, stworzone przez trzech młodych ludzi z grupy koderskiej RGBA. W tej produkcji kamera sunie nad ośnieżonymi górami i fjordami do wtóru elektronicznej muzyki, a naturalizm odwzorowania przyrody jest po prostu porażający. Za stronę wizualną i zakodowanie Elevated odpowiada Hiszpan, Inigo Quilez - warto zapamiętać to nazwisko, ponieważ pojawi się ono jeszcze dalej.

Generacja proceduralna nie musi jednak ograniczać się wyłącznie do skał i przyrody. Technikę tę można również zaprząc do kreowania obiektów bardziej kanciastych, jak ściany czy wręcz całe budynki. Udowadnia to Shamus Young, programista, którego pasją są właśnie projekty z zakresu generacji proceduralnej. Projekt Pixel City, czyli pikselowe miasto, demonstruje, jak Shamus mierzył się z zastosowaniem tego podejścia do stworzenia wirtualnego miasta w trójwymiarze. Kolejne wpisy na blogu pokazują kolejne etapy powstawania różnych typów budynków, złożonych z nich dzielnic, animowanego ruchu drogowego - aż do kompletnej iluzji żyjącej tkanki miejskiej. Brak zbyt wielu szczegółów tylko wzmacnia wrażenie realizmu, ponieważ, jak mówią twórcy Left 4 Dead, wyobraźnia graczy skuteczniej zapełnia luki niż najlepszy algorytm. Dlatego też widniejąca w oddali bryła szpitala w pierwszym epiodzie tej gry jest tylko obrysem z kilkoma oknami.

Wracając do tematu generacji proceduralnej, nasuwa się pytanie: skoro w ten sposób można wyczarować realistyczne krajobrazy i wiarygodne miasta, to czemu nie poziomy gier? Odpowiedź brzmi - wiele gier wykorzystuje już to podejście do tworzenia lochów, plansz, a nawet całych światów. We wspomnianym wcześniej Rescue The Beagles każdy etap zostaje wygenerowany losowo w trakcie rozgrywki. Podobnie dzieje się też w Spelunky, popularnej platformówce dla masochistów autorstwa Dereka Yu - jeśli ktoś jest zainteresowany szczegółami, ta aplikacja w przystępny sposób wyjaśnia zawiłości algorytmu. Z kolei we flaszowym hicie Canabalt etapy budowane są na bieżąco, a dalszy ciąg poziomu jest uzależniony od tego, jak akurat radzi sobie gracz. Gra sprawdza to dwa razy na sekundę, dokładając kolejne budynki w taki sposób, by nie doprowadzić do sytuacji niemożliwej do przejścia.

Podbijamy stawkę: a gdyby tak stworzyć nie pojedynczy poziom, ale cały świat? To pytanie zapewne zadał sobie Markus "Notch" Persson, czemu zawdzięczamy generowane proceduralnie kwadratowe kontynenty w Minecrafcie, za każdym razem inne. Tak samo jest też ze światem w Terraria i rozlicznymi planetami w Starbound - gracz dostaje swoje unikatowe uniwersum i musi sobie radzić w nim sam. Ekstremalnym przypadkiem zastosowania generacji proceduralnej jest natomiast Dwarf Fortress. W tej powstającej od wielu lat grze niezależnej na początku rozgrywki tworzony jest olbrzymi świat wraz z jego historią, procesami geologicznymi (erozja, rzeki lawy), ekosystemami, cywilizacjami, a wszystkie te elementy wpływają na siebie nawzajem. Proces ten trwa do pół godziny, a jego rezultaty przechowywane są w olbrzymim pliku, wczytywanym przy każdym załadowaniu gry.

Canabalt

Jak wyglądać będzie przyszłość proceduralnej generacji? Jej przebłyski zaobserwować możemy już teraz, choćby patrząc na zapowiedź No Man's Sky, które obiecuje nieskończoność kosmicznych światów do eksploracji - i to światów pełnych żywych istot, tak inteligentnych, jak i nieco mniej. Mały wgląd w przyszłość daje też zajrzenie za kulisy animowanego filmu Merida Waleczna. Studio Pixar zatrudniło przy jego produkcji wspomnianego wcześniej Inigo Quileza, by zastosował swoje proceduralne kung-fu do tworzenia grafiki. Hiszpan był odpowiedzialny m.in. za roślinność, w tym rozmaite mchy i porosty, których pełno na drzewach i kamieniach. Tak, zielony żywioł w tej animacji nie powstał "na piechotę", a został wygenerowany przez program Quileza. Napisane przez niego procedury nie są jeszcze tak wydajne, by pozwolić na renderowanie równie realistycznej przyrody w czasie rzeczywistym, ale za parę lat - kto wie?