Az Ambient Occlusion (AO) technika egy sugárkövetésen alapuló művelet, ami azt nézi meg, hogy az egyes renderelt képpontok texeljei mennyire vannak takarásban a jelenet objektumai által. Az eljárás egyszerű, a texelekből több sugarat kell elindítani a lehető legtöbb irányba. Ha egy sugár beleütközik valamely jelenetbeli objektumba, akkor a texel egyszerűen takarásban van, így a fényességét vissza kell venni. Természetesen ez az algoritmus rendkívül erőforrás-igényes, így nem is igazán alkalmazzák a játékfejlesztők, ugyanakkor nem elhanyagolható, hogy ha egy felület közelében különböző tárgyak vannak, akkor kisebb az esélye, hogy az adott felületet fény éri, így mindenképp árnyék keletkezik. Az Ambient Occlusion technika alapvetően a sarkokban vagy a résekben próbál árnyékos hatást szimulálni, ahol a fény jellemzően szóródik.
Far Cry 3 HDAO kikapcsolva és bekapcsolva
Mivel az Ambient Occlusion technika félelmetes számításigénnyel rendelkezik, így a mai megoldások csak a kamera nézőpontjából vizsgálják a problémát. Ennek megfelelően a fejlesztők inkább a Screen Space Ambient Occlusion (SSAO) felé fordítják a figyelmet, mely a mélységpuffer értékeit figyelembe véve analizálja a jelenetet. Az algoritmus az adott pixel körül mintavételezéseket végez és ez alapján határozza meg az egyes pontok árnyékolását. Bár az erőforrást a Screen Space alapú megvalósítás kevésbé terheli, a jó eredményhez rengeteg minta szükséges a pixel körül, így a valósidejű megoldások számos optimalizációt alkalmaznak. Ennek megfelelően a Screen Space algoritmusok csak szimulált hatást keltenek, de kellő minta megléte mellett igen jó eredmények is születhetnek, így a minőség kifejezetten közel állhat a valósághoz.
Az SSAO-nak számos megoldása létezik. Az első jól használható implementációval a Crytek állt elő a Crysis című játékhoz. Ez nem volt túl jó minőségű, de akkoriban igazán nagy áttörésnek számított, és számos kutatás indult el a sebesség növelése érdekében, hogy az algoritmus több mintával dolgozhasson, így pontosabb eredményt adjon.
A Crytek SSAO algoritmusát modernizálta az AMD által kidolgozott High Definition Ambient Occlusion (HDAO), ami alapvetően arra törekedett, hogy az új hardverek képességeit kihasználva (Gather4 mintavétel és helyi adatmegosztás a compute shader futószalagon) jelentősen felgyorsítsa a számításokat, egységnyi idő alatt sokkal több mintát dolgozva fel. Azonos minőségi szint mellett a HDAO hétszer gyorsabban dolgozik a Crytek SSAO-jánál, így a projekt elérte célját. A fejlesztők az AMD implementációját jellemzően igen sok mintával táplálják, így nagymértékben csökken a hamis árnyékok megjelenésének esélye.
Az NVIDIA az SSAO kérdéskörét más irányból közelítette meg, és egy Horizon-Based Ambient Occlusion (HBAO) elnevezésű algoritmussal álltak elő, ami a Screen Space megoldást annyiban egészíti ki, hogy minden egyes mintához egy úgynevezett horizont szöget számol, amelynek szinuszából kivonja a tangensvektor által bezárt szög szinuszát. Ennek a módszernek az előnye, hogy aránylag kevés mintavétel szükséges egy alapvető minőségi szint eléréshez, a szögfüggvények számítása cserébe erősen megdolgoztatja a grafikus processzort, de sok esetben ez még mindig jobb alternatíva lehet.
A HBAO igazi előnye akkor kezd el kibontakozni, ha a fejlesztő sok mintával látja el az algoritmust, mivel ilyenkor kimagaslóan jó képminőségre képes. Sajnos azonban ebben az esetben a sebesség erősen visszaesik, így a mai programokban jellemzően kevés mintából dolgozik a technika, ami azt eredményezi, hogy rengeteg hamis árnyékot hoz létre.
Az igazán jó minőségű és emellett még relatíve gyors megoldás a HBAO és a HDAO előnyeinek keresztezéséből születhetne, és erre már vannak is kísérletek. Emellett ez kiegészíthető per-pixel normálokkal, ami még tovább javíthatja a minőséget, de ehhez erős hardverek szükségesek.
Az SSAO, a HBAO és a HDAO összehasonlítására a Far Cry 3 tűnik manapság a legalkalmasabbnak, így az alábbi három képen megtekinthető, hogy mi is a különbség a három megvalósítás között.
A Far Cry 3 SSAO, HBAO és HDAO implementációja
Látható, hogy a HDAO rendkívül letisztult, és hamis árnyékoktól mentes képet ad, de ismét fontos megjegyezni, hogy ez pusztán abból fakad, hogy ez egy rendkívül gyors megvalósítása a kamera pozíciójából számolt AO-nak, így a fejlesztők rendkívül sok mintával etethetik. Az SSAO és a HBAO megfelelő minta megléte mellett képes lenne ugyanerre, vagy a HBAO esetén akár jobb minőségre, de ekkor a teljesítményigény a HDAO sokszorosa lenne.