Stínování

Gouraudovo stínování, které vyvinul Henri Gouraud v roce 1971, bylo jednou z prvních technik stínování vyvinutých pro 3D počítačovou grafiku.

V počítačové grafice se stínováním rozumí proces změny barvy objektu/povrchu/polygonu ve 3D scéně na základě takových věcí, jako je (ale nejen) úhel povrchu vůči světlům, jeho vzdálenost od světel, úhel vůči kameře a vlastnosti materiálu (např.např. funkce obousměrného rozložení odrazivosti) pro vytvoření fotorealistického efektu.

Stínování se provádí během procesu vykreslování programem zvaným shader.

Úhel povrchu ke zdroji světlaUpravit

Stínování mění barvy ploch ve 3D modelu na základě úhlu povrchu ke zdroji nebo zdrojům světla.

Na prvním obrázku níže jsou vykresleny plochy krabice, ale všechny ve stejné barvě. Byly zde také vykresleny linie hran, což usnadňuje přehlednost obrázku.

Na druhém obrázku je stejný model vykreslený bez linií hran. Je obtížné určit, kde končí jedna strana krabice a začíná další.

Třetí obrázek má zapnuté stínování, díky kterému je obrázek realističtější a je lépe vidět, která strana je která.

Renderovaný obrázek krabice. Tento obrázek nemá na svých plochách žádné stínování, ale místo toho používá k oddělení ploch okrajové čáry (známé také jako drátěný rámec) a k oddělení objektu od pozadí tučnější obrys.

Toto je stejný obrázek s odstraněnými čarami; jediným náznakem vnitřní geometrie jsou body siluety objektu.

Toto je stejný objekt vykreslený s plochým stínováním. Barva 3 viditelných čelních ploch byla nastavena na základě jejich úhlu (určeného normálovým vektorem) ke zdrojům světla.

Typy osvětleníEdit

Efekt stínování z reflektoru pomocí ray traceru

Když shader vypočítá výslednou barvu, používá model osvětlení k určení množství světla odraženého v konkrétních bodech povrchu. Různé modely osvětlení lze kombinovat s různými technikami stínování – zatímco osvětlení říká, kolik světla se odráží, stínování určuje, jak se tato informace použije pro výpočet konečného výsledku. Může například vypočítat osvětlení pouze v určitých bodech a zbytek vyplnit pomocí interpolace. Shader může také rozhodovat o tom, kolik zdrojů světla zohlední apod.

Okolní osvětleníEdit

Okolní zdroj světla představuje všesměrový zdroj světla s pevnou intenzitou a barvou, který působí na všechny objekty ve scéně stejně (je všesměrový). Během vykreslování jsou všechny objekty ve scéně osvětleny zadanou intenzitou a barvou. Tento typ světelného zdroje se používá především pro základní zobrazení různých objektů ve scéně. Jedná se o nejjednodušší typ osvětlení, který lze implementovat, a modeluje, jak může být světlo mnohokrát rozptýleno nebo odraženo, čímž vzniká jednotný efekt.

Okolní osvětlení lze kombinovat s okolní okluzí, která představuje, jak je každý bod scény exponovaný, a ovlivňuje množství okolního světla, které může odrážet. Vzniká tak rozptýlené, nesměrové osvětlení v celé scéně, které nevrhá jasné stíny, ale uzavřené a chráněné oblasti jsou ztmavené. Výsledek je obvykle vizuálně podobný zataženému dni.

Bodové osvětleníEdit

Světlo vychází z jednoho bodu a šíří se ven do všech směrů.

Bodové osvětleníEdit

Modeluje bodové světlo: světlo vychází z jednoho bodu a šíří se ven v kuželu.

Plošné osvětleníEdit

Světlo vychází z malé oblasti v jedné rovině. (Realističtější model než bodový zdroj světla.)

Směrové osvětleníEdit

Směrový zdroj světla osvětluje všechny objekty rovnoměrně z daného směru, podobně jako plošné světlo nekonečné velikosti a nekonečné vzdálenosti od scény; existuje stínování, ale nemůže dojít k žádnému rozptylu vzdálenosti. Je to jako slunce.

Distance falloffEdit

Dva boxy vykreslené pomocí OpenGL. (Všimněte si, že barva obou čelních ploch je stejná, přestože jedna je vzdálenější.)

Tentýž model vykreslený pomocí ARRIS CAD, který implementuje falloff vzdálenosti, aby plochy, které jsou blíže oku, byly světlejší.

Teoreticky jsou dva rovnoběžné povrchy osvětleny prakticky stejně ze vzdáleného nezakrytého zdroje světla, například ze slunce. Efekt falšování vzdálenosti vytváří obrazy, které mají více stínů, a tak by byly realistické pro blízké zdroje světla.

Levý obrázek nepoužívá falšování vzdálenosti. Všimněte si, že barvy na předních plochách obou polí jsou naprosto stejné. Může se zdát, že v místě, kde se obě plochy přímo překrývají, je nepatrný rozdíl, ale to je optický klam způsobený svislou hranou pod místem, kde se obě plochy stýkají.

Pravý obrázek používá distanční zkreslení. Všimněte si, že přední strana bližšího rámečku je světlejší než přední strana zadního rámečku. Také podlaha přechází ze světlé do tmavé, jak se vzdaluje.

VýpočetUpravit

Výpočet falloffu vzdálenosti lze provést několika způsoby:

  • Mocnina vzdálenosti – Pro daný bod ve vzdálenosti x od zdroje světla je intenzita přijatého světla úměrná 1/xn.
    • Žádná (n = 0) – Intenzita přijatého světla je stejná bez ohledu na vzdálenost bodu od zdroje světla.
    • Lineární (n = 1) – Pro daný bod ve vzdálenosti x od zdroje světla je intenzita přijatého světla úměrná 1/x.
    • Kvadratická (n = 2) – Takto ve skutečnosti klesá intenzita světla, pokud má světlo volnou cestu (tj. ve vzduchu není mlha ani žádná jiná věc, která by mohla světlo pohltit nebo rozptýlit). Pro daný bod ve vzdálenosti x od zdroje světla je intenzita přijatého světla úměrná 1/x2.
  • Může být použita i řada dalších matematických funkcí.

Techniky stínováníUpravit

Při stínování je pro výpočet osvětlení často potřeba normála povrchu. Normály lze předem vypočítat a uložit pro každý vrchol modelu.

Ploché stínováníEdit

Ploché stínování texturovaného krychle

Tady, se osvětlení vyhodnocuje pouze jednou pro každý polygon (obvykle pro první vrchol polygonu, ale někdy i pro centroid u trojúhelníkových sítí), a to na základě normály povrchu polygonu a předpokladu, že všechny polygony jsou ploché. Vypočtená barva se použije pro celý polygon, takže rohy vypadají ostře. Tento postup se obvykle používá v případech, kdy jsou pokročilejší techniky stínování příliš výpočetně náročné. Spekulární zvýraznění se při plochém stínování vykreslují špatně: Pokud se v reprezentativním vrcholu vyskytne velká spekulární složka, vykreslí se tento jas rovnoměrně po celé ploše. Pokud spekulární zvýraznění nedopadá na reprezentativní bod, je zcela vynecháno. V důsledku toho se zrcadlová složka odrazu obvykle nezahrnuje do výpočtu plochého stínování.

Plynulé stínováníUpravit

Na rozdíl od plochého stínování, kde se barvy na hranicích polygonů mění nespojitě, u plynulého stínování se barva mění od pixelu k pixelu, což vede k plynulému přechodu barev mezi dvěma sousedními polygony. Obvykle se nejprve vypočítají hodnoty ve vrcholech a pomocí bilineární interpolace se vypočítají hodnoty pixelů mezi vrcholy polygonů. Mezi typy hladkého stínování patří Gouraudovo stínování a Phongovo stínování.

Gouraudovo stínováníUpravit
  1. Určit normálu v každém vrcholu polygonu.
  2. Použít model osvětlení na každý vrchol pro výpočet intenzity světla z normály vrcholu.
  3. Interpolovat intenzity vrcholů pomocí bilineární interpolace přes polygon povrchu.

Problémy:

  • Vzhledem k tomu, že se osvětlení počítá pouze ve vrcholech, mohou být nepřesnosti (zejména zrcadlových světel na velkých trojúhelnících) příliš patrné.
  • T-úseky se sousedními polygony mohou někdy vést k vizuálním anomáliím. Obecně je třeba se T-junkcím vyhýbat.
Stínování PhongEdit

Stínování Phong je podobné Gouraudovu stínování s tím rozdílem, že místo interpolace intenzit světla jsou normály interpolovány mezi vrcholy a osvětlení je vyhodnocováno na pixel. Zrcadlová světla se tedy počítají mnohem přesněji než v Gouraudově modelu stínování.

  1. Vypočítejte normálu N pro každý vrchol polygonu.
  2. Pomocí bilineární interpolace vypočítejte normálu, Ni pro každý pixel. (Normálu je třeba pokaždé renormalizovat.)
  3. Na každý pixel aplikujte model osvětlení a vypočítejte intenzitu světla z Ni.

Odložené stínováníEdit

Odložené stínování je technika stínování, při které se výpočet stínování odkládá na pozdější fázi vykreslováním ve dvou průchodech, což potenciálně zvyšuje výkon tím, že se nezahazují draze stínované pixely. První průchod pouze zachytí parametry povrchu (například hloubku, normály a materiálové parametry), druhý provede vlastní stínování a vypočítá výsledné barvy. 884

Další přístupyEdit

Gouraudovo stínování i Phongovo stínování lze implementovat pomocí bilineární interpolace. Bishop a Weimer navrhli použít expanzi Taylorovy řady výsledného výrazu z aplikace modelu osvětlení a bilineární interpolaci normál. Proto byla použita polynomická interpolace druhého stupně. Tento typ bikvadratické interpolace dále rozpracovali Barrera a spol. a použili jeden polynom druhého stupně pro interpolaci difuzního světla Phongova modelu odrazu a další polynom druhého stupně pro zrcadlové světlo.

Sférickou lineární interpolaci (Slerp) použili Kuij a Blake pro výpočet jak normály přes polygon, tak vektoru ve směru ke zdroji světla. Podobný přístup navrhl Hast, který používá kvaternionovou interpolaci normál s tou výhodou, že normála bude mít vždy jednotkovou délku a odpadá výpočetně náročná normalizace.

Plochá vs. plošná interpolace. smooth shadingEdit

Flat Smooth
Uses the same color for every pixel in a face – usually the color of the first vertex Smooth shading uses linear interpolation of either colors or normals between vertices
Edges appear more pronounced than they would on a real object because in reality almost all edges are somewhat round The edges disappear with this technique
Same color for any point of the face Each point of the face has its own color
Individual faces are visualized Visualize underlying surface
Not suitable for smooth objects Suitable for any objects
Less computationally expensive More computationally expensive