Simulace SubSurface scatteringu - 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

Simulace SubSurface scatteringu

23. srpna 2007, 00.00 | V každé aplikaci lze hledat silné a slabé stránky. CINEMA 4D má bezesporu silnou pozici v oblasti materiálů a jejich tvorby, ale i zde se najde prvek významně zaostávající za zbytkem. SubSurfaceScattering. Proto jsem několik dní strávil tím, že jsem se pokoušel nalézt systém, který by uvedený efekt simuloval, a to v relativně dobrém čase.

Níže popsané řešení není samozřejmě skutečným efektem SubSurface scatteringu, o tom není žádných pochybností, jedná se opravdu o simulaci, ale věřím, že systém této simulace může být prospěšný v mnoha případech, kde je tento efekt zapotřebí, ale kde prostě není v jeho možnostech, aby byl skutečně dokonalým. Tedy lépe něco než nic, a to "zadarmo", tedy pokud máme modul Advanced Render. Jinak bych rád ještě odkázal na možné alternativní řešení, jako jsou alternativní renderovací systémy (fR, například) nebo pluginy (například na Vreel-3D.de).

Základní idea

Simulace, kterou chci prezentovat, je založena na následujících úvahách. SubSurface scattering simuluje prostup světla, který je nejmarkantnější při pohledu proti tomuto zdroji na objektu, kterým světlo prostupuje. Lze tedy říci, že tento efekt je nejvíce zřetelný na druhé straně, než na kterou dopadá světlo. Je to velmi zjednodušené tvrzení, samozřejmě, pamatujme na to, že se jedná o emulaci, ne o fyzikální simulaci. Existuje kanálový shader materiálu, kterým lze analyzovat prostor, který je osvětlen. Tento shader se jmenuje Lumas. Pokud jej vhodně nastavíme, můžeme získat informaci o prostoru, ve kterém by měl být náš efekt, tedy o prostoru proti vlastnímu osvětlení.

Známe základní prostor, ve kterém se nám má náš efekt objevit, je to vlastně prostor negativní hodnoty shaderu Lumas (tedy nastavíme do kanálu Svítivost Lumas a pomocí shaderu Obarvení jej znegujeme, tím získáme oblast odvrácenou od světel - prostor pro naší simulaci SSS). Tento prostor potřebujeme dále specifikovat. Efekt SSS se objevuje na okrajích objektů, samozřejmě. Tím ale získáváme do rukou další možný shader, který bychom mohli použít. Shader Fresnel. Tím přeci můžeme získat "zabarvení" vnějších hran objektu. Přesněji řečeno zabarvení ploch, ve kterých svírá normála povrchu velký úhel s normálou paprsku kamery. To je další oblast, kde by měl být efekt výrazný.

Pokud bychom postupovali jen tímto způsobem, který jsme si právě načrtli, efekt by nebyl příliš dokonalý, protože by se plně projevoval i v oblastech, ve kterých by výrazný být neměl. Jedná se zejména o oblasti různých vnitřních záhybů (spodní část vrchního rtu) a podobně. Tedy tyto oblasti můžeme maskovat pomocí efektu Ambient Occlusion. Tím efekt z těchto "sevřených" prostor vyloučíme.

Jsou ale i další oblasti, kde nám efekt Ambient Occlusion tímto způsobem nepomůže. Představme si oblast uší. Která jejich část je nejvíce prosvětlená? Je to ta část, která je pod tou tužší okrajovou chrupavkovitou "obrubou" (omlouvám se, nikdy jsem nestudoval, jak se to jmenuje). Tato část ucha je velmi tenká, a proto snadno prosvítá. Jenže efekt Fresnel nám prosvětlil jen "hrany" tvaru a nikoliv tento prostor. Ba naopak, tento prostor je proti okrajům tmavší, a tím pádem je v těchto oblastech efekt vlastně inverzní situace, které chceme dosáhnout.

Ve výše zmíněném problému nám může opět dobře posloužit efekt Okolní prostředí - Ambient Occlusion. Jenže ne sám. Potřebujeme tímto efektem dosáhnout zcela obrácené situace, než jsme zvyklí. Musíme definovat, kde se nám má náš efekt zobrazit. A proto nám velmi dobře poslouží efekt - shader Vertexová mapa, ve které budeme mít vybrané oblasti prosvětlení uší, případně některé další části modelu (vnější partie nosních dírek). Takže si můžeme připravit efekt Ambient Occlusion, který nebude ztmavovat, ale naopak, který bude zesvětlovat a obarvovat, a to jen v oblastech uší a dalších partiích, které jsou vybrané v rámci Vertexové mapy.

Při simulaci SSS bychom neměli mít za základ samotnou barvu, určitě bude lepší nějaký šum, který bude působit podstatně přirozeněji. A možnosti dalších kombinací jsou samozřejmě neomezené. Můžeme fakticky vše, přičemž místa působení můžeme řídit pomocí dvou velmi silných efektů - shaderu Vertexové mapy a efektu Okolní prostředí - Ambient Occlusion. První z této dvojice je velmi silný, druhý již nějaký ten čas stojí, ale na druhou stranu ani není potřeba příliš vysokého nastavení u efektu Ambient Occlusion, protože on ten šum v efektu nemusí být zase tak moc na škodu. Co je ale podstatné, je korektní nastavení velikosti efektu závislé na velikosti celého objektu.

Simulace

00

Model použitý při testech

V níže uvedeném příkladu je ta nejjednodušší možná forma simulace, kterou jsme zde zmínili. Vše je připravené pomocí shaderu Vrstvy, ale skutečně může být situace podstatně složitější...

01

V celé struktuře je jen šest položek a můžeme s testy začít od té nejdůležitější – základního vymezení pomocí Lumasu. Vytvoříme si tedy shader Lumas, nastavíme v něm bílou barvu a můžeme zvýšit iluminaci na více než 100% (to by samozřejmě mělo vliv v případě, že bychom tento shader použili přímo, jenže my situaci ještě troch upravíme pomocí shaderu Obarvení). Zadáme tedy Iluminaci na 130% a Kontrast na 50%. Můžeme se podívat, jak to vše bude nyní vypadat (upozorňuji ještě, že jsem v kanále Svítivost nastavil mírně růžovo-oranžovou barvu s 50% jasem, režim krytí na Násobit). Poté vytvoříme shader Obarvení, v něm ponecháme shader Lumas, přičemž obarvení provedeme negativně k Lumasu – tedy tak, aby osvětlené plochy byly černé a neosvětlené bílé. Tím získáme základní masku umístění efektu SSS.

2

01

Jsme zpět v shaderu Vrstvy. Zde vytvoříme podkladový shader Šum, změníme krytí shaderu Obarvení na Násobení a podkladový šum trochu upravíme barevně podle potřeby.

3

2

Nad shader Obarvení vložíme shader Fresnel, kterým "vymaskujeme" (černá vpravo) pomocí krytí Násobení oblasti směřující přímo ke kameře. Máme tedy základní stav hotový, efekt bude probíhat jen na námi určených plochách na okraji a tam, kde není přímé světlo.

4

03

Plochy, které jsou příliš sevřené, by také neměly mít námi generovaný efekt. Tedy vytvoříme shader Okolní prostředí (Ambient Occlusion), a tímto shaderem nastaveným ve velikosti podle velikosti modelu vymaskujeme (Násobení) tyto sevřené oblasti.

5

04

Vytvoříme si vertexovou mapu vlivu prozářených oblastí (a to vážně nebudu popisovat), přičemž by tato mapa mohla vypadat asi takto.

05

U právě vytvořené vertexové mapy nastavíme režim krytí na Maska vrstvy a vytvoříme poslední shader - Okolní prostředí alias Ambient Occlusion, opět. V tomto případě ale bude celý shader obrácený, prostor sevřený (vlevo) bude světlý a čím dále půjdeme, tím bude tmavší, chceme přeci zesílit efekt v oblasti uší. Barvy mohou jít opět přes barvy kůže. Režim krytí necháme na Závoj.

6

A to je vše, konstrukce je hotová. Jednotlivé barvy a nastavení (například AO) jsou závislé na vašem modelu, já osobně jsem pro prezentaci využil model, který je součástí knihovny Maxon C4D R10, takže doufám, že můj postup bude sto sledovat většina uživatelů na stejném modelu. Osobně většinou ladím barvu efektu ještě ve vlastním nastavení kanálu Svítivost, kde zadám intenzitu barvy okolo 40-50% a režim krytí na násobení, ale jinak je základní konstrukce shodná.

1

2

Výsledný render s GI s připraveným efektem a bez něj.

Tématické zařazení:

 » 3D grafika  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

 

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

Uživatelské jméno:

Heslo: