sample01

, , ,

Jako danie główne w dzisiejszej dawce informacji technicznych, serwuję Rage’a. Nie jest to już nowość, biorąc pod uwagę częstotliwość z jaką są wydawane nowe gry, ale to akurat ten rpg’o-fps urzekł mnie swoimi rozwiązaniami.

Sama gra, jak powiedział to Carmack (tak, ponieważ to ta legenda sprawowała pieczę nad rozwojem technologicznym tej produkcji) była tworzona od ładnych paru lat w czeluściach studia idSoftware. Wszystko to przez ciągłe szukanie nowych, ciekawszych i nie jednokrotnie bardziej optymalnych rozwiązań, jak na przykład nowe spojrzenie na „grafy” i to czy jest możliwe tworzenie świata gry bez powtarzalnych elementów? Okazuje się że można.

Każdy game designer prędzej czy później staje przed problemem powtarzalności- ograniczona ilość możliwych do wykorzystania modeli powoduje konieczność korzystania z tych samym obiektów kilkadziesiąt, kilkaset razy. W tej sytuacji o sukcesie będzie decydować odpowiednie, różnorodne rozłożenie tych modeli w obrębie obrabianej przestrzeni- jednak to nie wszystko.W rzeczywistości każdy obiekt jest unikatowy. Pomimo identycznego kształtu, koloru i faktury, jeden ma rysy, drugi pęknięcia, trzeci graffiti, a na  inny nasikał pies pozostawiają chlubnie mokrą plamę. Do tej pory, we wszystkich grach ( de facto nikt tej techniki nie porzucił, stosuje się to cały czas ) by nałożyć coś na już istniejący obiekt dodaje się w edytorze coś co nazywa się decal. Jest to pewne ustrojstwo, które pozwala rzutować dowolny obraz na pewną płaszczyznę.

Gdzieś tam pod spodem są trzy kule. Nie ma więc problemu by ubogacić świat gry o elementy nałożone w dowolne miejsce. Najczęściej decale stosuje się np na ścianach jako zacieki, jakieś wyszarpane fragmenty tynku, szczeliny, a także np na terenie jako kałuże ( z odpowiednim shaderem odblasków i takim tam ) czy np jakieś porozrzucane drobiazgi. Jest jednak jedna wada tego rozwiązania. Każdy obiekt decal’a musi posiadać własną siatkę na której będzie on rozłożony. Czyli im więcej decali, tym mamy więcej trójkątów na ekranie, co jak nikomu nie trzeba tłumaczyć skutkuje spadkiem wydajności. Jest jeszcze jedna rzecz, co z tego, że możemy nałożyć sporo bubli na inne obiekty, jak i tak ogranicza nas ilość tekstur? – Tym sposobem wracamy do punktu wyjścia.

Dodatkowo nie fajnie jest ( z punktu wydajności chociażby ) rysować dane miejsce kilka razy. A tak dokładnie jest w przypadku decali. Mamy obiekt, potem decal, potem może jeszcze jeden, aż w końcu dane miejsce jest wypełniane po naście razy, aż wkońcu dochodzi do fillrate bottleneck.

Więc co mamy ? Ograniczoną ilość obrazów, które możemy zobaczyć. Do tej pory nie było to problematyczne, ale hej, przecież mamy XXI w i wypadałoby pokazać coś bardziej naturalnego w grach. W tym momencie jest pewne nowatorskie rozwiązanie. Do tej pory graficy, by obmalować dany obiekt tworzyli tekstury przypisane do tego modelu. W akcie miłosierdzia dla programistów i tech guy’ów jedna tekstura była np wykorzystywana wielokrotnie na wielu modelach. Co zatem robi idTech 5 ? Dokładnie tak- odwraca kota ogonem. Obiekt umieszczony na mapie zostaje przypisywany do danej części wielgaśnej tekstury, która jest jedna na całą planszę. Dla uzmysłowienia gabarytów :

Na klasyczne modele stosuje się tekstury o wymiarach 512 do 2048 piskeli. Jest to wystarczająco dużo by zmieścić sporo obrazu. Tekstury wykorzystywane w idTech 5 mają po 128k x 128k piskeli . . . .

Ta ledwo widoczna kropeczka po lewej, to własnie tekstura 512. Dla porównania tekstura wiedźmina jest raptem 8 razy większa. A to bydle po prawej, to gigantyczna tekstura do wszystkiego, co nawet w porównaniu do wiedźmina, jest przytłaczającą powierzchnią. W czym jest więc haczyk ? Mianowicie każdy model ma przydzielony unikatowy fragment tekstury, a co za tym idzie każdy piksel każdego jednego modelu na mapie jest unikatowy. Pozwala to na dowolne podmalowywanie modeli bez obawy o to, że zabraknie tekstur, coś będzie rysowane kilka razy czy będą jakieś inne dziwne rzeczy wychodzić.

Dodatkową zaletą tego rozwiązania jest możliwość wypalania na sztywno różnych efektów, które w tradycyjny sposób zarządzania teksturami byłyby niemal niemożliwe do uzyskania w grze typu realtime – Global Illumination, Soft Shadows z preumbrą z setek źródeł światłą. Wszystko to jest robione offline, czyli jeszcze w studio, a w czasie rozgrywki czy ładowania nic nie jest wstępnie obliczane. Wyzbycie się tych wszystkich rzeczy liczonych na bieżąco niesamowicie zwiększa wydajność całego wyświetlania. I to właśnie dla tego Rage śmiga na każdym sprzęcie. Dodatkowo, dzięki jednej teksturze nie występuje coś takiego jak przełączanie tekstur w locie. Coś z czym sam niedawno walczyłem w Baroku. Czyli de facto same pozytywy.

Jest jednak jeden, kluczowy problem – dynamiczne doładowywanie. Oczywistym jest, że tak gigantyczną teksturę nie da rady załadować na raz. Gra doczytuje fragmenty, tak zwane strony. I doczytuje to, co jest jej potrzebne, a to co nie, jest wywalane. Zatem to co widzimy w danej chwili jest w pewien zamotany sposób przechowywane w teksturze, zaś to od czego się odwróciliśmy jest po chwili kasowane z pamięci dając miejsce nowym fragmentom tekstur. I tu jest własnie pies pogrzebany. Na chwile obecną, dyski twarde są najwolniej rozwijaną dziedziną IT. Nie zmieniły się od ładnych paru lat. Więc te megabajty tekstur, które jak chciałoby się, ładowane byłyby w mig, stoją w kolejce. Co z kolei jest widoczne jako paskudne doczytywanie się tekstur. Trzeba poczekać na szybkie dyski.

Poniżej zestawienie uchwyconych przeze mnie doładowań wraz z obrotem kamery:

Jest jeszcze jeden szkopuł. idSoftware kiedyś wypuszczało whitepaper na temat realtime jpg dekompresing, czyli jak by usprawnić odczyt plików jpg. Tak ponieważ tym kodekiem są zapisane te gigantyczne tekstury. Gdyby chcieć przechowywać te wszytskie obrazy w postaci raw nieskompresowanej, cały Rage ważyłby grubo ponad 100GB ( biorąc pod uwagę standardowy rate kompresji ). A jak każdy wie, jpg traci wiele na jakości. Głównie to w obrazach o małym kontraście. I widać to od razu w czasie grania :

Suma summarum, jest to pewne rozwiązanie do budowania unikatowych światów i sądzę, że sporo nowych gier może zaczerpnąć pomysłu z Rage’a w ten czy inny bardziej zmodyfikowany sposób. Na chwile obecną takie silniki jak CryEngine 3 czy UE3 a nawet mój Barok korzystają z techniki virtual textures, która znacząco odbiega technicznie od sposobu w jakim to robi Rage, ale nadal jest to idea przechowywania wielu tektur na jednej współdzielonej płaszczyźnie, gdzie także możliwe jest doczytywanie dynamiczne – jest to jakiś kompromis pomiędzy ilością tekstur, jakością obrazu a optymalnością.

Na koniec załączam filmik, gdzie demonstrowana jest technologia megatextures przez Carmack’a.