Wielka woda to finezyjne połączenie w ruchu harmonii i chaosu, prostoty i złożoności. Renderowanie dobrze wyglądającego morza czy oceanu stanowi spore wyzwanie w realistycznej trójwymiarowej grafice komputerowej w grach oraz filmach. Jest kosztowne obliczeniowo, a recepta na jego wiarygodność zawiera sporo składników.

Falowanie mórz i oceanów napędzane jest głównie siłą wiatru. Załóżmy, że mamy piękną bezwietrzną pogodę i akwen płaski jak stół, czyli znienawidzoną przez żeglarzy flautę. Zaczyna wiać umiarkowany wiatr, dla uproszczenia przyjmijmy, że tylko w kierunku poziomym. W jaki sposób powoduje on falowanie, skoro nie ma gdzie się „zaczepić” na gładkiej powierzchni? Gdyby wiatr generowany był przez wielką dmuchawę o stałej sile, to byłby z tym kłopot. Jednak prawdziwy wiatr rzadko kiedy jest tak stabilny, z reguły zachowuje się mniej lub bardziej turbulentnie. Porywy wiatru wytwarzają różnice ciśnień, które tworzą pierwsze zmarszczki na gładkiej wodzie, wiatr rozpędza te małe fale, a potem jest już z górki. Oczywiście im większy wiatr, tym większe fale, ale większa siła wiatru powoduje kolejne zjawiska. Najpierw na szczytach fal pojawia się piania, potem białe grzebienie, dalej pojawiają się bryzgi i sprej wodny, wreszcie same fale zaczynają się zawijać i załamywać, a przy najsilniejszym wietrze jest już tylko rozszalała, wściekła kipiel, fale jak góry, pełno bryzgów, nic nie widać, ratuj się kto może.

Tak morze postrzega większość ludzi: wizualnie, kontemplacyjnie, a nie przyczynowo-skutkowo. Fizyk powie, że ruch powierzchni morza opisuje zestaw równań Naviera-Stokesa opisujących zasadę zachowania pędu dla poruszającej się cieczy. Równania eleganckie, zmieszczą się na jednej kartce, jednak ich rozwiązanie numeryczne jest potwornie pracochłonne. Matematyk spojrzy na ocean i stwierdzi, że pojedyncza fala jest cykloidą lub trochoidą, a kształt powierzchni morza to superpozycja wielu fal o różnych częstościach i amplitudach, przynajmniej dla małych natężeń fal. Prawdziwe lecz niekoniecznie praktyczne. Grafik komputerowy czerpie ze wszystkich trzech poglądów na temat, by stworzyć możliwie  przekonującą iluzję rzeczywistości.

Nowożytna era w realistycznym renderingu oceanu rozpoczęła się w roku 1997, kiedy na ekranach kin pojawił się film „Titanic”. Reżyser James Cameron nie szczędził pieniędzy na realizm. Na potrzeby filmu zbudowany został 236-metrowy model statku, który umieszczono w gigantycznym basenie z wodą morską o pojemności 64 milionów litrów. Jednak na potrzeby filmowania scen w szerokim planie czy najazdów kamery na statek z powietrza i z rozległym oceanem w tle, potrzebne było inne rozwiązanie. Wypracował je, teoretycznie oraz praktycznie. bo w postaci dedykowanego oprogramowania, naukowiec specjalizujący się w grafice i dynamice cieczy, Jerry Tessendorf.

Metoda Tessendorfa opierała się na dwóch fundamentach. Pierwszym było zastosowanie statystycznego modelu oceanu zamiast dokładnego liczenia wprost z zasad fizyki oddziaływania wiatru na wodę. Pierwsze proste widmo fal autorstwa Piersona i Moskovitza, wypracowane na bazie pomiarów dokonanych na brytyjskich statkach na północnym Atlantyku, zostało opublikowane w 1964. Pokazuje ono gęstość widmową fal w zależności od częstotliwości i prędkości wiatru. Jeśli chcemy wytworzyć realistycznie wyglądającą powierzchnię oceanu dla danej siły wiatru, to wiemy, jakie częstotliwości składowe fal powinniśmy generować. Drugi fundament to wykorzystanie algorytmu szybkiej transformaty Fouriera (FFT). Transformata Fouriera pozwala rozłożyć między innymi złożony kształt fali na morzu funkcji czasu na wszystkie częstotliwości składowe tejże fali. Rozwiązywanie zagadnień matematycznych w domenie częstotliwości mocno się upraszcza. Odwrotna transformata Fouriera umożliwiła złożenie z powrotem wszystkich częstotliwości do wynikowej fali, którą zobaczymy na ekranie.

Jednak sam kształt połaci wody to nie wszystko. Równie ważne i złożone jest zachowanie światła na będącej w ciągłym ruchu powierzchni morza. W zależności od kąta padania światła słonecznego zachodzą jednocześnie dwa zjawiska fizyczne: refleksji i refrakcji. Refleksja to odbicie światła, a refrakcja to jego załamanie przy przejściu z powietrza do wody. Na większej rozfalowanej powierzchni refrakcje tworzą na wypukłości fal kaustykę – świetlistą siatkę, w której często dochodzi do częściowego rozbicia białego światła. Kaustyka może powstać również w wyniku odbicia – efekt można często zaobserwować na przykład na  kadłubie jachtu w marinie w pogodny dzień.  Dla poprawnego modelowania morza czy oceanu trzeba też uwzględnić kolor, który jest wypadkową kilku czynników. Z jednej strony mamy kolor samej wody, który zmienia się wraz z jej głębokością: im głębsza, tym ciemniejsza, a im płytsza, tym jaśniejsza. Przy płytszych końcach akwenu trzeba uwzględniać kolor prześwitującego dna. Dodatkowo w lustrze wody odbija się niebo, statki, przybrzeżne skały; wszystko to również ma wpływ na wynikowy kolor.

Dla poprawnego odwzorowania światła i koloru wykorzystujemy prawa fizyki. Załamanie światła można obliczyć, wykorzystując prawo Schnella. Odbicie światła i wynikowy kolor można uzyskać z równania Fresnela. Ze względu na złożoność tych obliczeń w silnikach gier komputerowych stosuje się różnego rodzaju sztuczki i drogi na skróty. Zamiast pełnego równania Fresnela używa się uproszczenia zwanego modyfikacją Schlicka. Dokładniejsze obliczenia stosowane są tylko w bliższym planie, a im dalej tym mniej przejmujemy się szczegółami. Kaustyka, która powinna być liczona mozolną metodą ray tracingu, zastępowana jest animowaną teksturą lub mocno uproszczonym raytracingiem nadającym się do obliczeń w czasie rzeczywistym.

Szalupa prawdziwa. Tygrys animowany komputerowo. Ocean został wygenerowany z wykorzystaniem oprogramowania Houdini firmy Side Effects. Przegrzewanie procesorów, kiedy komputerowo generowane futro tygrysa było zanurzane w komputerowo generowanej wodzie

Ostatnim wyzwaniem dla stworzenia wirtualnego morza jest interakcja wody z innymi obiektami. Interakcja z dnem – im mniejsza głębokość wody, tym bardziej maleje prędkość i długość fal. Interakcja z brzegiem – przy płaskim brzegu, jak na piaszczystej plaży, fala załamuje się i zachowuje turbulentnie, chaotycznie. Przy brzegu stromym i skalistym fala będzie się mocno rozbryzgiwać. Do tego dochodzi interakcja ze wszystkimi przedmiotami na powierzchni, statkami, bojami, motorówkami, pluskającymi się ludźmi. Tutaj metoda Tessendorfa, świetna przy dużych połaciach oceanu czy morza, nie sprawdzi się.

W modelowaniu interakcji wody celują systemy cząsteczkowe. Jeśli do wanny z dziecięcymi zabawkami zamiast wody wsypiemy kulki, to będzie analog takiego właśnie systemu. Upraszczamy objętość wody do kulek i liczymy coś w rodzaju trójwymiarowego bilardu. Im większe kulki, tym mniej obliczeń, ale też gorszy, bardziej ziarnisty i mniej realistyczny efekt. Im mniejsze kulki, tym wizualnie lepiej będzie wyglądała symulacja, kosztem dużego nakładu numerycznego. Systemy cząsteczkowe są również wykorzystywane do renderowania bryzgów wody. Tor każdej kropli wystrzelonej w postaci bryzgu z fali liczony jest oddzielnie zgodnie z działającymi na nią siłami – grawitacji i oporu powietrza. Aby efekt był realistyczny, potrzeba zrobić te wyliczenia przynajmniej dla kilkudziesięciu tysięcy kropel w każdej fali. System cząsteczkowy nakłada się na wcześniejsze obliczenia połaci morza, staje się jego uzupełnieniem. Podobnie przy innych fragmentach sceny, gdzie wymagana jest interakcja, mały obszar liczony systemem cząsteczkowym wklejany jest w większy obszar generowany metodą statystyczną.

Rozwój sprzętu sprawił, że to, na co piętnaście lat temu mogły pozwolić sobie tylko duże studia filmowe, obecnie zadziała na domowych pecetach i konsolach. Kiedyś morze było w grach tylko tłem, niedostępnym dla bohatera obszarem. Dzisiaj nowoczesne silniki gier coraz lepiej radzą sobie z akcją rozgrywaną na wielkiej wodzie. Nie jest to jeszcze fotorealistyczna grafika jak w filmach, ale wygląda na tyle przyzwoicie, że nie wybija ze świata gry. A że świat ten ma wyglądać jak prawdziwy, to bez wielkiej wody się nie obędzie. W końcu Ziemia w prawie trzech czwartych pokryta jest morzami i oceanami.

Morze z wielkim wirem o średnicy dwóch mil morskich zostało zasymulowane przez PhysBAM, oprogramowanie stworzone na Uniwersytecie Stanforda. Wir komplikuje i tak niełatwe obliczenia poziomego oceanu

Artykuł ukazał się w Pixelu #23, którego nakład został wyczerpany. Zapraszamy do sklepu Pixela po cyfrowe wydanie magazynu oraz inne numery Pixela.