22. února 2011

Smoothing, stínování

Dnes se pokusím vysvětlit některé principy, které bude potřeba vědět pro další díl článků o normal-mappingu. Povíme si něco o vyhlazování, jakým způsobem se vytváří ostré hrany modelu a něco málo o stínovacích modelech.

Nejdříve se zmíním o možnostech výpočtu vlivu osvětlení na objekt. Když pominu flat shading (bez vyhlazování), je nejjednodušším a nejrychlejším modelem osvětlení Gouraudovo. Gouraudův systém vypočítá podle normály barvu každého vertexu a každý další pixel na polygonech mezi vertexy dopočítá bilineární interpolací. Přesnou skutečnou barvu tak mají pouze vertexy, zbytek pixelů je pouze "odhad". Velkým problémem tohoto modelu je především specular odlesk na modelu s nižším množstvím vertexů, zvláště při rotaci objektu jsou nepřesnosti velmi znatelné - odlesk částečně mizí a zase se objevuje.

Naproti tomu trochu výpočetně náročnější phongův model stínování neinterpoluje výsledné barvy, místo toho nejdříve lineárlně interpoluje normálové vektory vertexů pro každý pixel, potom pro každý bod vypočítá výsledné osvětlení podle právě vypočteného vektoru. Pozor ale na zavádějící označení atributu např. v programu Cinema4D nazvané phongovo stínování, které vyhladí objekt do určitého úhlu hrany, tento atribut pouze upraví normály vertexů (viz. dále), Cinema4D však používá phongovo (nebo gouaurdovo) stínování i bez přiřazení tohoto atributu.



Dobře, teď víme jak se osvětlení počítá, jak ale vytvořit ostrou hranu bez vyhlazování? V 3dsmaxu se to dělá pomocí tzv. smooth groups, v Maye se vytváří hard edge a soft edge a Cinema využívá buď omezení do určitého úhlu nebo označení určité hrany jako ostré. Všechny programy ale interně dělají to samé, modifikují normály. Pokud vytvoříme objekt kompletně vyhlazený, bude mít každý vertex jednu normálu která se bude interpolovat s ostatními pro výpočet barvy pixelů (pokud používáme phongovo stínování):



Když ale vytvoříme ostrou hranu, normála každého vertexu ležícího na této hraně se rozdělí a pro interopolaci každé strany hrany se použije jedna z nich.





A pokud vyhlazování nepoužijeme vůbec, bude mít na takovémto meshi každý vertex 4 normály:



Nakonec ještě dodám, že herní enginy pro renderování ostrách hran musí každý vertex u ostré hrany zkopírovat tolikrát, kolik má normál. Proto se doporučuje s množstvím ostrých hran ve hrách šetřit a raději řešit stínování pomocí normal map.

Žádné komentáře:

Okomentovat