Hogyan találtam fel az SSAO effektet?

Hogyan találtam fel az SSAO effektet?


Ezt az írást eredetileg annak a szellemében akartam megírni, hogy “nem, nem akarok senkit kritizálni vele”. De aztán rájöttem, hogy inkább annak a szellemében írom meg, hogy “de, kritizálni akarok vele egyeseket”. :)

Ez egy szakmai jellegű írás, szóval a 3d grafikában járatos embereknek szól.

Szóval… én grafikusként dolgozom a játékfejlesztésben. A játékfejlesztés egyik lényege, hogy “realtime” grafikát kell csinálni, azaz olyat, amit az adott eszközök “valós időben” jelenítenek meg. Az ilyen grafika lényege, hogy mindenféle trükköket kell alkalmazni, hogy megfelelő látványt érjünk el. A trükkök lényege pedig az, hogy nem tökéletesek, de gyorsak, azaz használhatók valós idejű képalkotásban.
Az SSAO effekt lényege, hogy a “sarkokba” kevesebb fény érkezik (ambient occlusion). A fény szimulálása az egyik legnehezebb feladat a 3d grafikában, főleg igaz ez a szórt fényre. A valósidejű grafikában a mai napig nem nagyon lehet használni olyan szórt fényt, ami “rendes” számításokon alapszik, azaz sugárkövetésen (raytrace). (Kivéve, ha bake-lt fényekről beszélünk, amelyek szerencsére egyre inkább kihalnak az iparból.)

Kb. 15 éve egy AAA játék enginen dolgoztunk, én mint “technikai grafikus” együtt dolgoztam a programozókkal. Nagyon hiányzott ez a bizonyos “ambient occlusion” fényhatás, de sajnos valós időben nem volt megoldható. Ezért kezdtem gondolkodni azon, hogy hogyan lehetne trükközni… Minden szakmabeli ismeri a zbuffer nevű dolgot. Ennek ügybár az a lényege, hogy a kép minden pixelére eltároljuk a távolsági értékét, amit aztán fel lehet mindenféle célra használni. Nagyjából olyan ez, mintha köd lenne, és minél távolabb van valami, annál inkább ködös. (Közbevetés, tessék megkapaszkodni: a zbuffert egy 1884-es scifi regényben említik először. Annyit segítek, hogy az írója matematikus volt. Lényegében ő találta fel a zbuffert!)

Íme egy zbuffer:

Szóval adott a zbuffer, amiből egyből adódik a megoldás: ez alapján kiszámítható, hogy hol vannak a képen “konkáv” részek! Tehát ha ott egy kicsit elsötétítjük a képet, akkor az ambient occlusion-höz hasonló hatást érünk el! A kérdés már csak az volt, hogy ezt a trükköt meg lehet-e valós időben jeleníteni. Nos, mint kiderült, bár akkoriban még ehhez a trükkhöz se voltak általában elég erősek a videókártyák, azért erősebb gépeken működhetett a dolog!

Na, ezen a felfedezésemen felbuzdulva el is meséltem az ötletemet a programozóknak (akik amúgy szerettek engem, és jó kapcsolatom volt velük. :)) Nos, elég lehangoló volt a hozzáállásuk. Egy részük nem is igazán akarta megérteni, de nem azért mert hülye volt, hanem valszeg nem nagyon érdekelte a dolog. Másik részük megértette, de azt mondta, hogy “ááá, ez nem jó, mert nem ad jó eredményt”. Egyetlen kóder volt, aki megértette, és azt mondta, hogy meg is oldható a dolog, bár ő meg máson dolgozott, úgyhogy ő se foglalkozott vele.

Íme egy SSAO:

Ezután pár hónapra jött ki a Crysis című játék, amelyben először használtak SSAO effektet (ha jól emlékszem egy ruszki kóderük találta ki). Mondanom sem kell, ennek hatására a mi enginünkbe is pár hét alatt bekerült az SSAO… Hát igen, senki sem lehet próféta a saját hazájában… :) (Érdekesség: az említett programozó, aki felfogta amit mondtam neki, pár hónap múlva már a Crytek-nél dolgozott…).
A tanulság: a magyar fejlesztők egyik legnagyobb betegsége, a tökéletesre törekvés… Inkább ne legyen semmi, ha nem tökéletes! :(

Kiegészítés: amúgy nem igaz hogy a Crytek találta fel az SSAO-t, két okból. Egyrészt én találtam fel :), másrészt amikor annak idején keresgéltem a neten hasonló dolgot, találtam egy tudományos vizualizációs módszert, ahol molekulák megjelenítésénél használták, igaz, ez nem realtime volt, de ténylegesen SSAO volt, azaz a zbuffer alapján dolgozott.

Ma az SSAO szinte minden játékban ott van, a komolyabbakban kb. mindben, és minden enginben is. Ráadásul ma már olyan erős videókártyák vannak, hogy marha jó minőségben tudják megcsinálni. Én amúgy nagyon szeretem az ilyen trükköket.

Hát, ennyi. :)