Realtime Ray Tracing i Deep Learning Super Sampling. Jak tworzyć ultrarealistyczną grafikę ze wsparciem sztucznej inteligencji?
Grafika 3D to dobra rzecz. Co mam na myśli? Szeroko rozumiane 3D jest wykorzystywane wszędzie – w filmach, animacjach, wizualizacjach, reklamach, grach, aplikacjach… Ważną rolę odgrywa 3D czasu rzeczywistego, grafika renderowana/realizowana na naszych oczach. Chodzi tutaj głównie o sektor rozrywkowy (np. gry komputerowe), ale ma również zastosowanie w biznesie (np. konfiguratory produktów, interaktywne wizualizacje). Do niedawna istniał natomiast mały problem, bowiem grafika 3D w czasie rzeczywistym jest mniej realistyczna od tej prerenderowanej. Nastał jednak przełom: Realtime Ray Tracing oraz Deep Learning Super Sampling (DLSS) to technologie przyszłości w teraźniejszości. Zanim omówimy, czym dokładnie są te cuda, zobaczmy, jak to wygląda klasycznie. W wielkim skrócie.
OFFLINE
Wspomniałem o prerenderowanej grafice 3D. Rozchodzi się o wszystko to, co nie jest interaktywne, czyli o statyczne wizualizacje, animowane filmy, spoty reklamowe. Jakość tego typu grafiki jest już na tak wysokim poziomie, że trudno wyobrazić sobie, że można lepiej. Oczywiście istnieje masa plusów klasycznego offline’owego renderingu. Ba! Jestem w stanie stwierdzić, że prerenderowana grafika zawsze będzie o krok przed tą realtime’ową, jeżeli chodzi o jakość. Jest jednak pewien haczyk. Rendering offline’owy wymaga czasu produkcji. Jest ultrarealistyczny, ale wymaga cierpliwości, bo bywa, że jedno ujęcie renderujemy kilka godzin i zdecydowanie nie sprzyja to iteracji czy poprawkom. Do tego dochodzi temat interaktywności. Grafika prerenderowana z racji tego, że jest „wyryta w kamieniu”, nie jest interaktywna.
Skąd ten długi czas? W uproszczeniu oraz uchylając już trochę rąbka tajemnicy: w renderingu offline’owym od dawna znany jest Ray Tracing, czyli technika śledzenia promieni i generowania obrazu 3D na ich podstawie. Metoda ta wymaga dużej mocy obliczeniowej komputera oraz właśnie czasu potrzebnego do kolejnych iteracji algorytmu. Daje natomiast efekty fotorealistyczne.
REALTIME
Grafika 3D w czasie rzeczywistym to zupełnie inna bajka. Gry są interaktywne. Nie musimy tych obrazów tylko oglądać, możemy w nich uczestniczyć. Tutaj grafika jest rysowana na naszych oczach przynajmniej 30 razy w ciągu sekundy (odsyłam do pojęcia frames per second) albo i więcej. Wyrenderowanie obrazu zajmuje 1/30 sekundy, nie kilka godzin. Ale co z realizmem? No właśnie. W klasycznym rozumieniu realtime 3D, aby uzyskać efekty fotorealistyczne, trzeba się narobić. Trzeba używać sztuczek. W jakiś sposób dołożyć dodatkowej pracy nad sceną, aby była realistyczna, a zarazem lekka w obliczeniach. Lightmapy, cubemapy, distance fieldy i inne sztuczki pozwalają uzyskać efekty realistyczne, ale kosztują nas czas pracy nad sceną.
REALTIME RAY TRACING
A co gdyby jakoś połączyć ten offline z realtime? Żeby scena była interaktywna, a efekty realistyczne, ale bez dodatkowej pracy? Do tego właśnie służy Realtime Ray Tracing. Gdzie jest haczyk? Odpowiadam: karta graficzna. Aby pracować z Ray Tracingiem w czasie rzeczywistym, jest nam potrzebny specjalistyczny sprzęt. Konkretniej: specjalny układ karty graficznej, dzięki któremu będziemy mogli korzystać z dobrodziejstw Ray Tracingu. Aktualnie nie są to tanie zabawki i to jest chyba największy minus.
Zanim przejdziemy dalej, aby wszystko było jasne, wspomnę i nakreślę, czym są te karty graficzne.
KARTA GRAFICZNA
Za rozwojem sprzętu komputerowego podążał rozwój grafiki, a za rozwojem grafiki podążał rozwój sprzętu. Początkowo za generowanie między innymi scen 3D był odpowiedzialny procesor główny. W pewnym momencie nastała potrzeba, aby wydzielić do tego zadania specjalistyczny układ. Miał on za zadanie odciążyć procesor główny, biorąc na siebie obliczenia graficzne.
W podobnej sytuacji jesteśmy dziś. Tym razem to sama karta graficzna posiada dodatkowe układy, wydzielone specjalnie do obliczeń Ray Tracingu.
DLSS
Teraz trochę o sztucznej inteligencji. Jest to bardzo szeroki i głęboki temat i, aby zbyt daleko nie odpłynąć, wspomnimy tylko sieci neuronowe. Konkretnie zdolność uczenia się takowych na podstawie przykładów i możliwość automatycznego uogólniania zdobytej wiedzy. Istnieją automaty, które potrafią rozróżniać kontekst i gdy widzą np. zdjęcie psa, wiedzą, że to pies.
Jak się to ma do grafiki 3D?
Deep Learning Super Sampling to właśnie wyszkolony algorytm, potrafiący zwiększać w czasie rzeczywistym rozdzielczość obrazu.
Realtime Ray Tracing charakteryzuje się obliczeniami per piksel. Im wyższa rozdzielczość, tym więcej obliczeń, tym więcej potrzebnego czasu. By przyspieszyć processing, można Ray Tracing wyrenderować w mniejszej rozdzielczości i za pomocą DLSS upscalować do rozdzielczości natywnej/docelowej.
PRAKTYKA
Zebraliśmy teorię i przejdźmy do konkretów. W praktyce Realtime Ray Tracing oraz Deep Learning Super Sampling to świeże rzeczy. Jak to w branży przy nowościach bywa, nie wszystko jest takim, jakim się wydaje. Realtime Ray Tracingu nie przełączamy on/off. Ray Tracing możemy rozróżnić na kilka technik/komponentów: shadows, reflections, ambient occlusion, global illumination, caustics. Każdy z nich może zostać użyty i skonfigurowany w naszej scenie niezależnie.
Nasze rozważania oprzemy o Unreal Engine 4. Jest to silnik mocno wspierający Ray Tracing czasu rzeczywistego, jak i DLSS. Bez zagłębiania się w szczegóły: kilkoma kliknięciami jesteśmy w stanie uzyskać fotorealistyczne efekty Ray Tracingu, o ile mamy odpowiedni sprzęt. Unreal Engine 4 posiada również rozbudowaną dokumentację i community, jeżeli chodzi o Ray Tracing. Jest to bardzo dobry punkt startowy.
REALTIME RAYTRACED SHADOWS
Domyślne realtime’owe shadow mapy są płaskie. Cienie są ostre i nienaturalne. Istnieją co prawda metody „udawania” naturalnego cieniowania, ale wymagają one kilku dodatkowych kroków.
Lightmapping to sposób zapisania informacji o oświetleniu w teksturach i daje bardzo dobre efekty. Tworzy się je poprzez offline’owy rendering i zapisuje na stałe. Lightmapy mają natomiast ogromny minus – są „wyryte w kamieniu”. Trochę tak, jak klasyczne wizualizacje. Oznacza to tyle, że nie bardzo możemy oświetlenie sceny zmieniać ,jak nam się podoba.
Distance Field Soft Shadows to metoda realtime’owa, pozwalająca oszukiwać i zmiękczać cienie z dystansem od obiektu. Efekty są dobre i stosunkowo szybkie, ale wymagany jest odpowiedni setup sceny.
Realtime Raytraced shadows traktuje źródła światła raytracingowo – oznacza to tyle, że jeżeli używamy Ray Tracingu w czasie rzeczywistym, to z automatu nasze cienie będą miękkie i naturalne. Oczywiście jesteśmy w stanie robić hybrydy. Wyłączając opcję Cast Raytraced Shadow w źródle światła, przełączamy dane światło w tryb klasyczny.
REALTIME RAY TRACING REFLECTIONS
Odbicia w – nazwijmy to – klasycznej grafice realtime’owej to nie lada oszustwo. Możemy je zapisać na stałe (podobnie, jak lightmapy) czy na przykład użyć tak zwanych Screen Space Reflections, czyli odbić dobrej jakości, ale tylko tych elementów, które aktualnie znajdują się na ekranie. Odbicia to jedna z najlepszych funkcjonalności realtime’owego Ray Tracingu. Naturalne i piękne, w Unreal Engine sterowane za pomocą tak zwanych Post Process Volumes. Możemy dobrać ilość odbić i wysterować ich ogólną jakość.
RAYTRACED AO ORAZ GI
W domyśle w klasycznym realtime’owym renderingu cień jest cieniem, niestety – światło tak się nie zachowuje. Cień nie jest zerojedynkowy. Cień ma intensywność i bardzo często barwę. Jest to tak zwany efekt globalnej iluminacji oraz okluzji, światło odbija się i koloruje scenę.
Efekt Global Illumination (GI) możemy uzyskać również oszukaniem poprzez wspomniane już lightmapy czy systemy typu LPV (Light Propagation Volume), a Ambient Occlusion (AO) na przykład poprzez efekty post procesowe (Screen Space AO) czy Distance Fields. Jak zwykle jako dodatkowy setup i dodatkowe kroki.
Najlepsze dynamiczne i najbardziej realistyczne efekty da nam znów Ray Tracing, choć akurat GI oraz AO są najbardziej wymagającymi technikami Ray Tracingu czasu rzeczywistego. Co ciekawe, w przypadku samego Ray Traced Global Illumination powstają sztuczki, pozwalające przyspieszyć ten „ciężki” efekt – odsyłam do RTXGI.
W Unrealu Realtime Ray Tracing GI oraz AO również możemy wysterować, podobnie jak odbicia, w Post Process Volumes.
RTX CAUSTICS
Nie jest to jeszcze oficjalny „ficzer” Unreal Engine 4. Istnieje specjalna wersja silnika, wspierająca to zagadnienie. W skrócie: można powiedzieć, że chodzi o pryzmat. To, jak zachowuje się światło po penetracji materiału. Soczewkowanie czy efekty załamania światła pod taflą wody w czasie rzeczywistym.
UE4 DLSS
Jeżeli chodzi o Deep Learning Super Sampling w Unreal Engine 4, to jest to rzecz najświeższa. Od niedawna DLSS można włączyć jako darmowy plugin, a sterowanie jego ustawieniami odbywa się poprzez globalne zmienne, tak zwane CVars. DLSS wymaga również raytracingowej karty graficznej.
OGRANICZENIA
Jak zawsze, żeby za różowo nie było, ograniczenia muszą być i tym razem. Wspomniałem już, że są techniki „lżejsze” i „cięższe”. Oczywiście, jeżeli przesadzimy z Ray Tracingiem, to zrobimy sobie krzywdę. Musimy panować nad naszą sceną. Często potrzebne są hybrydy. Kilka efektów jako Ray Tracing, reszta klasycznie. Technologia jest na tyle nowa, choć bardzo szybko się rozwija, że jeszcze nie czas na totalne szaleństwa. Do tego wszystkiego dochodzi cena sprzętu, który na ten moment tani nie jest, a w przypadku grafiki interaktywnej nie tylko twórca musi mieć ten sprzęt, ale i również użytkownik.
PRZYSZŁOŚĆ
Pozwolę sobie w tym miejscu pofantazjować. Osobiście uważam, że Ray Tracing czasu rzeczywistego zasługuje na brawa i z niecierpliwością czekam na moment, w którym stanie się standardem w grafice 3D. Podejrzewam, biorąc pod uwagę tempo rozwoju, że w najbliższym czasie będziemy mogli pozwolić sobie na włączenie wszystkich funkcjonalności Ray Tracingu jednocześnie. Liczę na to, że niedługo będziemy mówić o lightmapach i sztuczkach, że były dawno temu/kiedyś.