Ambient occlusion

Ačkoliv se počítačové grafice věnuju už pěkných pár let, byla (a jsou) témata, kterým jsem se vyhýbal a díval se na ně s nedůvěrou. Jedním z nich bylo i ambient occlusion, u kterého ale v posledních letech probíhal dost intenzívní výzkum a proto je tato technika dnes docela dobře použitelná i v real-time plně dynamických scénách.

Obecně se osvětlovací modely rozdělují na globální a lokální. Lokální jsou ty, které berou v úvahu jen vlastnosti aktuálně osvětlovaného bodu a světla. Tzn. pracují s barvou materiálu, jeho lesklostí, se vzdáleností od světla, barvou světla atp. Nejznámější a nejpoužívanější lokální osvětlovací metodou je Phongův osvětlovací model, resp. Blinnův-Phongův osvětlovací model.

Globální osvětlovací metody využívají k určení výsledné barvy bodu navíc další parametry scény, především informace o ostatních objektech. Když si to domyslíme do důsledku, tak obecně bychom pro globální osvětlovací model potřebovali v pixel shaderu (krátký prográmek běžící na GPU sloužící k výpočtu barvy pixelu) mít přístup k celé scéně, což není nic moc pro dnešní grafický HW.

Ambient occlusion je jedna z velmi jednoduchých (a do jisté míry nepřesných) metod globálního osvětlení. Pracuje tak, že z osvětlovaného bodu jsou vrhány paprsky a počítá se, kolik z těchto paprsků narazilo na nějaký objekt. Čím více takových paprsků bylo, tím se bod vyhodnotí jako tmavší. Tím se vlastně simuluje vliv ambientního (všudypřítomného) světla a je zřejmé, že jako nejvíce tmavé se vyhodnotí rohy, což je docela odpovídá realitě (už jste určitě slyšeli o temných koutech 😉 ).

Paprsky se vrhají jen v polokouli ve směru normály povrchu a někdy se tato polokoule ještě zmenšuje, aby nedocházelo ke ztmavení mírně zvlněných povrchů – tato redukce paprsků je vyjádřena pomocí úhlu vůči povrchu objektu a jeho hodnota může být klidně 30°.

(obrázky jsou z tohoto paperu)

Díky ambient occlusion jsou tak zvýrazněny hrany a člověk má pak lepší představu o tvaru předmětu.

(obrázky jsou odtud)

Vrhat paprsky až do nekonečna a testovat jejich kolizi vůči všem objektům ve scéně by bylo samozřejmě velice náročné a v pixel shaderech prakticky nerealizovatelné. Ambient occlusion proto nepracuje s explicitním popisem objektů scény (to by bylo příliš neefektivní), ale jen s depth-bufferem, z kterého je triviální zrekonstruovat výškovou mapu, jejíž každý bod představuje plošku nejbližší kameře v daném směru. Metoda dále pracuje s normálami těchto plošek (abychom dokázali určit správně orientaci polokoule), takže při klasickém renderingu scény je nutné zároveň vykreslit do zvláštní textury tyto normály. Protože často není možné bindovat depth-buffer přímo jako texturu, bývá běžné vykreslovat zároveň ještě do jedné další textury, kam si ukládáme vzdálenost od kamery. Celkem vykreslujeme tedy až do třech cílů – primární back-buffer (nebo textura) s barvou, textura s normálama a textura s hloubkou.

Takže máme vše vyrenderováno a co dál? Teď vrhneme pár paprsků a otestujeme kolizi s objekty scény. Zde existuje několik přístupů, které nejsou úplně triviální. Jeden z nich např. rekonstruuje pro pár sousedních pixelů jejich pozici ve world space a na této pozici vytvoří malinkou kouli, vůči níž pak počítá kolizi paprsku. De facto tedy rekonstruuje povrch pomocí koulí. Naproti tomu metoda split horizon neprovádí transformaci do světového souřadného systému, takže je efektivnější. Split horizon ale už nepracuje tak, že by počítala počet kolizí, ale pouze zjišťuje největší úhel mezi povrchem a testovanou pozicí (jakoby zostřuje angle bias) – čím je tento úhel (horizon angle) větší, tím je povrch tmavější.

(obrázek z této prezentace)

No není to celé úplně jednoduché, že? Ale jeden chytrý člověk vymyslel, jak ambient occlusion implementovat velice jednoduše a efektivně. Stačí vzít texturu obsahující údaje o hloubce, rozostřit ji a vypočítat pro každý pixel rozdíl mezi rozmáznutou a původní texturou. Čím je tento rozdíl větší, tím více bude pixel tmavší. Sice to není úplně přesné a nemá to žádný fyzikální základ, ale dává to docela pěkné výsledky. Více informací zde.

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google+ photo

Komentujete pomocí vašeho Google+ účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s

Tento web používá Akismet na redukci spamu. Zjistěte více o tom, jak jsou data z komentářů zpracovávána.