6. Tieňovanie

    Tieňovaním (shading) rozumieme vykresľovanie objektov pomocou farebných odtieňov, ktoré prirodzene vznikajú pri zakrivených plochách a dávajú nám lepšiu predstavu o nich. Z predchádzajúcich modelov vieme určiť pre daný bod farbu. Pre rýchlejší výpočet boli vypracované metódy, ktoré dokážu aproximovať farbu na základe vybratej vzorky bodov.

Wavy.gif (690 bytes) 

6.1 Konštantné tieňovanie

    Najjednoduchšia metóda je prístup konštantného tieňovania. Táto metóda vychádza z najjednoduchšieho predpokladu, že ak je zdroj svetla v nekonečne, potom súčin vektorov L.N je konštantný a ak pozorovateľ je v nekonečne, je súčin vektorov L.N konštantný. V svetelnom modeli nie je zahrnuté zrkadlové osvetlenie. Pre kresby mnohostenov, alebo keď aproximujeme objekty lineárnymi plôškami, je konštantné tieňovanie pre prvotné zobrazenie umiestnenia objektov.

Wavy.gif (690 bytes)

6.2 Gouraudovo tieňovanie

    Gouraud navrhol metódu interpolácie intenzít. Metódu môžeme použiť pre mnohosteny, ktoré aproximujú zakrivené objekty. Najprv vypočítame farbu zobrazenia vo vrcholoch takého mnohostena. Ak vrchol V je spoločným vrcholom niekoľkých stien, ktoré sú vytvorené pre aproximáciu oblého telesa, potom normálu v tomto vrchole určíme, ako priemer normál vytvorených pre jednotlivé incidentné steny tohto vrcholu. Preto pre spoločný vrchol V stien s1, s2, ..., sn vypočítame normálový vektor vo vrchole podľa vzťahu (priemer normálových vektorov Ni):

v6_2_1.gif (446 bytes)

6_2_1.gif (1840 bytes)

   V ďalšom kroku určíme intenzitu vrcholu pomocou niektorého osvetľovacieho modelu. Nakoniec každý polygón tieňujeme lineárnou interpoláciou intenzít určených v jeho vrcholoch. Najlepšie si to ukážeme na trojuholníku pomocou rozkladu do riadkov. Na obrázku 6.2.1 máme určené intenzity I1, I2, I3 vo vrcholoch trojuholníka. Najprv vypočítame intenzity Ia, Ib na zvolenom riadku y = ys v krajných bodoch trojuholníka:

Ia = I1 – (I1 – I2).(y1 – ys)/(y1 – y2),
Ib = I1 – (I1 – I3).(y1 – ys)/(y1 – y3).

    Výslednú intenzitu I v bode (x,ys) na úseku medzi dvoma krajnými bodmi opäť interpolujeme:

Ip = Ib – (Ib – Ia).(xb – x)/(xb – xa).

    Predpokladáme, že v dátovej štruktúre máme informácie o ostrých pomocných hranách tak, Sako je znázornené na nasledujúcom obrázku pre valec. Na obrázku vidíme, že pre vrchol interpolujúci bočné steny musíme brať do úvahy len priemer normálových vektorov stien, ktoré majú spoločné pomocné hrany.

 6_2_2.gif (7311 bytes)

Wavy.gif (690 bytes)

6.3 Phongovo tieňovanie (Phong Shading)

Phongovo tieňovanie je známe ako tieňovanie pomocou interpolácie normálových vektorov. Tento postup je podobný Gouraudovmu tieňovaniu, líši sa v tom, že intenzitu osvetlenia bodu počítame interpoláciou normálových vektorov. Podobne ako v predchádzajúcej časti určíme normálový vektor vo vrcholoch mnohostena. Pri realizácii je opäť výhodné použiť algoritmus rozkladu normálových vektorov po riadkoch, pretože môžeme výpočet týchto vektorov vyjadriť krokovým algoritmom. Na ďalšom obrázku máme skanovací riadok y = ys, ktorý pretína znázornený štvoruholník v dvoch krajných bodoch hrany d,b. Vo vrcholoch sme určili normálové vektory označené ako N1, N2, N3, N4. Podľa počtu riadkov medzi dvoma vrcholmi hrany vieme určiť vektorový prírastok, špeciálne dNd a dNb na hranách d,b. Týmto výpočet normálových vektorov pri prechode z jedného riadku na druhý zjednodušíme na pripočítanie prírastku:

Na = Na + dNa, Nb = Nb + dNb.

6_3_1.gif (2483 bytes)

 Na úsečke medzi dvoma bodmi riadku vypočítame výsledný normálový vektor interpoláciou súradnice x:

N = Na.(xb – x)/(xb – xa) + Nb.(x – xa)/(xb – xa).

Výpočet oproti Gouraudovmu tieňovaniu zložitejší, ale výsledná intenzita je presnejšia. Na jednoduché vysvetlenie si vezmem príklad z obrázku 6.2.2, ktorý zobrazoval valec. Ak osvetlenie je spredu kolmo na prednú aproximovanú stenu valca, potom vypočítaná intenzita na hranách je rovnaká, ale normálový vektor pozdĺž rozkladového riadku sa mení.

 6_3_2.gif (2642 bytes)