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.
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.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 pr
e 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):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.
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.
Na úsečke medzi dvoma bodmi riadku vypočítame výsledný normálový vektor interpoláciou súradnice x:
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í.N = Na.(xb – x)/(xb – xa) + Nb.(x – xa)/(xb – xa).