Ambient Occlusion a jeden trik, jak osvětlit interiér - 3D grafika - 3Dscena.cz: 3D grafika jako na dlani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



3D grafika

Ambient Occlusion a jeden trik, jak osvětlit interiér

29. května 2008, 00.00 | Poměrně často používám shader Ambient Occlusion (okolní prostředí), ale nikdy mi nepřišlo pěkné, jak se tento shader projevuje ve směru proti hlavnímu světelnému zdroji scény. Před drahnou dobou jsem se tedy pokusil uvedenou situaci vyřešit v rámci multipass renderingu a post-produkce, ale otázka alespoň dílčího odstranění tohoto jevu mi nedala spát a přemýšlel jsem nad jiným, elegantnějším řešením. A nakonec jsem jej našel. Tak říkajíc pod svícnem je tma, nazývá se Lumas, jako obvykle…

A zase ten Lumas

Ano, zase, on to je prostě shader extremně šikovný a mohu stoprocentně slíbit, že se nad tímto shaderem nesetkáváme naposledy. Prostě informace osvětlení povrchu, chcete-iluminace je informace nadmíru užitečná v mnoha ohledech a efekt Ambient Occlusion/Okolní prostředí je jen jedním z nich.

Idea

Efekt AO jde často, jak jsme si již řekli i v perexu, trochu proti předpokladům diváka. Ono to vychází již z principu tohoto efektu, prostě on takhle pracuje.

Poznámka: jen krátce k popisu principu AO efektu. V zásadě se jedná o systém, který je založen na vzájemném krytím sousedících objektů. Z místa objektu je vyslán paprsek (ve směru normály, přesněji svazek paprsků v definované kulové výseči, ale to není nyní podstatné) a ten se šíří v prostoru do maximální vzdálenosti od místa vyslání, definované v parametru maximální délky paprsku. Jakmile paprsek zasáhne sousedící povrch, je podle délky paprsku bodu, ze kterého paprsek vyšel, definována barva, která odpovídá přechodu nastaveném v efektu AO. Výsledkem je většinou velmi měkké difusní stínění, které scéně přidává na plasticitě, ale které není ve svém principu schopno reagovat na systém osvětlení scény, protože světla se v tomto systému de facto nezapočítávají.

Tedy pokud bychom chtěli efekt AO trochu více přiblížit realitě, potřebovali bychom do něj implementovat informaci o osvětlení scény. O tom, kam dopadá světlo, jak je intenzivní a podobně. A to je přesně ona úloha, kterou nám pomůže vyřešit kdo jiný než Lumas.

Příprava shaderu

Příprava uceleného systému je poměrně jednoduchá. Stačí nám pro to jen dvě věci. Shader Lumas a také shader Fůze či vrstvy. Vytvoříme si tedy v novém materiálu v kanálu Barva shader Fůze a do tohoto shaderu do pokladového kanálu vložíme shader Ambient Occlusion/Okolní prostředí. K nastavení tohoto shaderu se ještě vrátíme, ale teď k tomu zajímavějšímu a celému tomu kouzlu. To je totiž vskutku jednoduché, ale velmi účinné. Do krycího kanálu vložíme shader Efekty/Lumas. Tento Lumas bude nastaven velmi jednoduchým způsobem. Samozřejmě že barva bude bílá (míra krytí bude řízena v samotné Fůzi), jas 100% a všechny odlesky budou vypnuté. Nemají pro nás smysl. Co nás ale zajímat potenciálně může, je parametr Kontrast, protože ten řídí míru osvětlení podle úhlu normály a dopadajícího paprsku světla. Můžeme ale tuto hodnotu ponechat jak je, zatím mám z testování tu zkušenost, že není potřeba to nějak zásadně měnit.

Pokud se podíváme na nastavení shaderu AO, tak zde je nastavení řekněme klasické. Tedy délka tohoto efektu je závislá na velikosti, či přesněji výšce scény. Pokud tedy je naše scéna vysoká (v interiéru) řekněme 260 jednotek, pak maximální délka paprsku by mohla být někde okolo 260<>360 jednotek. Samozřejmě je vhodné pro dobrý výsledek použít dostatečnou hodnotu vzorků, ale to již skutečně závisí na Vaší scéně a také velikosti výstupu.

03

04

Nastavení v materiálu

Pokud byla v kanálu Barva nastavena jen barva pomocí základního nastavení, vložil jsem připravený shader Fůze (kopírovat/vložit) do pole pro texturu a nastavil krytí na Násobení s intenzitou 100%.

Pokud byl v kanále Barva nějaký sofistikovanější obsah, například shader či textura, použil jsem shader Vrstvy a do tohoto shaderu jsem opět vložil uvedený shader Fůze, kterému jsem opět, s podivem, nastavil krytí Fůze. Tento shader byl vždy nejvýše, tedy měl vliv na vše, co je pod ním. Krytí bude opět nastavené na násobení…

Osvětlení interiérové scény - postup

Uvedený systém jsem si otestoval na jednoduché interiérové scéně, kterou jsem zaplnil objekty pocházejícími z knihovny Architecture Edition, tedy nejsem jejich autorem a to ani jejich materiálů. Jen jsem tyto materiály, pokud to bylo zapotřebí, mírně upravil a to následujícím způsobem.

Pokud je ve scéně přirozený světelný zdroj ve formě okna, vždy je dobré se pokusit tento zdroj světla simulovat. Pro tyto simulace jsou vynikající plošná světla, která vždy upravíme tak, aby odpovídala svým tvarem i velikostí otvoru, kterým světlo (difusní) přichází. I já tedy takové světlo ve scéně mám (všechna světla našeho testovaného příkladu budou popsána později, nyní se budeme zabývat jen principem konstrukce). Světlo v okně by mělo mít nastavený přirozený úbytek, který odpovídá jeho užití. Tímto úbytkem by mohl režim Inverzní/Inverzní kvadratický. Potíž však je, že v takovém případě dojde u samotného okna k masivní přeexpozici a to není dobře. Tyto dva úbytku jsou výtečné zejména v případě, že bychom chtěli simulovat svítidlo u stěny, které vytváří přeexponovanou stopu, difusní světlo přicházející oknem ale takto agresivně působí jen zřídka. Tedy použil jsem úbytek inverzní oříznutý, který uvedené přeexpozice nevytváří (mimochodem, první dva uvedené úbytky bychom použít mohli, ale pak bychom museli aktivovat mapování barvy, které by tyto přeexpozice eliminovalo). Světlo v okně mívá zásadně plošné stíny (oblast).

Dalším světlem ve scéně je světlo Vzdálené – tedy Slunce. I toto světlo by mělo mít pro větší přesvědčivost nastavené plošné stíny.

Pokud bychom si scénu nyní vyrenderovali zjistili bychom, že je stále velmi tmavá. Řešení je ale prosté, musíme scénu „prosvětlit“. To můžeme udělat dvěmi způsoby. První z nich spočívá v objektu Prostředí, druhý na speciálně připraveném světlu. Osobně objekty Prostředí v případě využití efektu AO nepoužívám protože mají jeden zásadní nedostatek. Mají neomezenou působnost a to mi nevyhovuje. Z tohoto pohledu jsou podstatně výhodnější světla.

Ve scéně jsou tedy ještě dvě (tedy v podstatě jedno světlo jednoho typu dvakrát) světla, která mají na hlavní stránce aktivní volbu Svítivost okolí. Co tato volba způsobí? Jednoduchou věc. Světlo v takovém případě neanalyzuje úhel normály povrchu a paprsku dopadajícího světla a prosvětluje tělesa bez ohledu na tento úhel. Prosvětlení je monolitické, jenže při vhodném nastavení a také využití efektu AO se dají s tímto nastavením dělat divy…

Tedy první světlo tohoto typu je u okna, někde v prostoru, kterýže v interiéru asi nejvíce osvětlen. Toto světlo má aktivní volbu Svítivost okolí a má vypnuté odlesky. A co dále? Má nastavený úbytek – tedy světlo se v prostoru postupně zeslabuje a to je obrovská výhoda proti monolitickému působení objektu Prostředí. A co více. My můžeme také řídit změnu barvy se vzdáleností! Tímto drobným trikem můžeme simulovat přirozené šíření světla a jeho „odrazy“ v prostoru, kdy čím dále od míst vstupu světla jsme, tím je celkové osvětlení prostoru nižší a také může být trochu jinak barevné.

Abychom scéně trochu pomohli, je v ní ještě druhé světlo s efektem Svítivost okolí. Toto světlo je ponecháno v původních souřadnicích, tam kde vzniklo. Ani nemá úbytek a i jeho jas je poměrně nízký, jen pomáhá prvnímu z uvedené dvojice s prosvětlením scény. A to je vše…

Nastavení světel ukázkové scény

01

02

Okno

Plošné světlo nastaveným stínem typu oblast/plochý, obdélník s velikostí odpovídající oknu. Po dobrý výsledek je vhodné učinit také následující. Zvýšit počet vzorků, které plošné světlo tvoří. Aby se náhodou netvořili světelné stopy jednotlivých vzorků (v případě odlesků například), je vhodné aktivovat na stránce detaily volbu „Přidat zrno“.

Jak jsme se již zmínili, je nutné použít úbytek. Ten jsem nastavil na poměrně vysokou hodnotu délky (cca 180% délka objektu), ale mohl jsem si to dovolit proto, že jsem využit Inverzně oříznutý úbytek. Pokud bychom použil Inverzní/Inverzně kvadratický, měl bych zásadní potíže s velkou přeexpozicí v místě okna a to by nebylo pěkné… Jas tohoto světla byl cca 125%.

07

Slunce

Sluncem je prosté vzdálené světlo s plošným stínem a jasem 100%. Vskutku prosté zadání. Je zde vlastně jen proto, aby nám scéna trochu zdramatizovala.

Svítivost okolí, hlavní

Toto světlo má, na rozdíl od následujícího, dvě zvláštnosti. Za prvé je u něj podstatná poloha a za druhé má nastavený úbytek, což u těchto světel není tak časté…

Poloha tohoto světla je opravdu důležitá. Použil jsem pozici před oknem (z prostoru interiéru), ve střední výšce okna.

Světlo má aktivní volbu Svítivost okolí, vypnuté generování odlesků a opět je nastaven i úbytek. Ten je nastaven na typ Inverzní oříznutý, opět z toho důvodu, aby světlo působilo měkce a nevytvářelo přeexponované plochy.

Délka úbytku není nějak velká, použil jsem hodnotu okolo 200 jednotek. Musíme ale pamatovat na to, že mimo tohoto světla použijeme ještě jedno a navíc je tu další fakt, všechny inverzní/inverzně kvadratické úbytky díky své definici světlům umožňují, aby působily i za definovanou hranicí své působnosti (malou a stále se snižující intenzitou, ale přesto působí).

08

Využil jsem také toho, že toto světlo dokáže scénu „tónovat“ a to tak, že jsem nastavil z,měnu barvy se vzdáleností.

Opomenul jsem zmínit jas tohoto světla. Byl nastaven na hodnotu 70%.

Svítivost okolí, pomocné

Poslední světlo systému, které vždy nastavujte ve spolupráci s výše zmíněným světlem, kterému jen pomáhá. Opět je nastavena Svítivost okolí a vypnuté generování odlesku. Jas světla je 20%.

Závěrem

krytí Lumasu 0%, 20%, 40%, 60% a 80%

05

Testovací soubor

Věřte mi, že se nedomnívám, že můj postup je jediný správný, ale po několika testech mám pocit, že jsme sto takto docílit poměrně pěkných výsledků a to bez nějakého velkého testování a ladění. Jedná se o z větší části univerzální systém, který věřím že lze použít u většiny interiérových scén. Pokud narazíte na možnost nějakého vylepšení, dejte vědět, ostatní to jistě také ocení.

01

02

Tématické zařazení:

 » 3D grafika  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: