Geometrie/Raytracing

(přesměrováno z Raytracing)

Ray-tracing editovat

Jedná se o vysoce výpočetně náročnou metodu počítačové vizualizace, pomocí které lze dosáhnout velmi realistického zobrazení modelu. Spočívá v postupném stopování paprsků odrážených modelem směrem k uživateli. Umožňuje zobrazení jevů, pomocí jiných technik vůbec, či jen stěží dosažitelných, jako jsou např. odrazy a odlesky objektů, lom světla v objektech, atd.

Na začátku máme:

  • Popis 3D scény skládající se z
    1. objektů (pozice, tvar, barva a další vlastnosti materiálu)
    2. světelných zdrojů (pozice, barva)
    3. (případně: barva pozadí scény, vlastnosti prostředí)
  • Pozici pozorovatele

Sledujeme paprsky, které se šíří od světelných zdrojů do scény. Některé paprsky zasáhnou objekty, kde se podle jejich vlastností lomí, odrážejí a rozptylují. Obraz scény tvoří paprsky dopadlé na projekční plochu.

Tato metoda zahrnuje efekty vznikající vzájemnou interakcí objektů ve scéně (tj. například odrazy ostatních těles na povrchu lesklého objektu a lom světla při průchodu průhledným tělesem). Dokáže určit stíny vržené různými tělesy (tyto stíny jsou však ostře ohraničeny). Protože je nereálné sledovat všechny paprsky ze zdrojů světla, postupujeme v praxi naopak. Paprsek je sledován zpětně, tzn. ve směru od pozorovatele. Projekční paprsky vysíláme přes pixely obrazu scény. Hledáme, co je vidět v daném pixelu, jakou světelnou energii paprsek přináší.

Typy paprsků:

  • Primární paprsek – vyslaný od pozorovatele scény.
  • Sekundární paprsek – vzniká odrazem nebo lomem paprsku.
  • Stínový paprsek – vyslaný z místa dopadu paprsku na objekt ke zdrojům světla pro zjištění, leží-li ve stínu. Není-li objekt ve stínu, je pro něj vyhodnocen osvětlovací model. Zanedbává se jejich lom.

Popis editovat

 
Diagram ilustruje algoritmus ray tracingu pro renderování obrázku.

Při sledování paprsků musíme vlastně hledat jejich průsečíky s objekty scény. Naivní algoritmus testuje navzájem každý paprsek s každým objektem scény (a se všemi polygony v každém objektu), což vede ke značně časově náročnému výpočtu. Každý průsečík paprsku s objektem generuje další dva paprsky + stínový paprsek. V každém takovém průsečíku je zapotřebí provést ty samé výpočty, je tedy vhodné využít pro implementaci ray-tracingu rekurzi.

Pro ukončení rekurze je možné použít následující kritéria:

  1. paprsek narazí na difúzní povrch
  2. je dosažena předem stanovená maximální hloubka rekurze
  3. energie paprsku klesne pod určitý práh

V každém průsečíku P paprsku a objektu platí:

 

  •   – průsečík
  •   – další průsečík odraženého paprsku
  •   – další průsečík propuštěného paprsku
  •   – globální koeficient odrazivosti (reflexe)
  •   – globální koeficient propouštění (lomu, transmise, refrakce)

Rekurzivní charakter této rovnice potvrzuje vhodnost tohoto přístupu pro implementaci ray-tracingu. Pro reprezentaci hierarchie paprsků a průsečíků bývá použita stromová struktura.

Nevýhody ray-tracingu

  • ostré stíny
  • bodové zdroje světla
  • zrcadla (lesklé plochy) sice odrážejí okolí, ale neodrážejí světlo do okolí, nejsou sekundárními zdroji světla
  • při změně ve scéně (místo pozorovatele, nové světlo, nový objekt, odebrání něčeho, …) se musí vyhodnotit celá scéna
  • není adaptivní, zobrazení probíhá se stejným vzorkováním, nezávisle na situaci ve scéně (velké monotónní plochy)

Urychlování ray-tracingu

Prostý ray-tracing je velmi náročný na čas, urychlovací metody ho mohou urychlit o jeden až dva řády.

Nejčastější urychlovací metody:

  • Urychlení výpočtu průsečíků
    1. speciální funkce na výpočet průsečíků s každým typem objektu (pre testy potenciálních průsečíků před vlastními výpočty s tělesem)
    2. snížení počtu výpočtů průsečíků – obálky, hierarchie obálek – dělení scény (BSP, Octal-tree) – paměť překážek – koherence paprsků (válcové nebo kuželové obálky paprsků)
  • Snížení počtu paprsků
    1. adaptivní antialiasing (zředěné vysílání paprsků, interpolace při malé změně)
    2. řízení hloubky rekurze (útlum intenzity paprsků při odrazech a lomech -> stupeň rekurze při útlumu pod daný limit)
  • Svazky paprsků (svazek paprsků se vysílá jako jeden – kvalita)
  • Distribuce výpočtů na dvě části (procesů, procesorů)

Reprezentace objektů

Objekty jsou v počítačové grafice zpravidla reprezentovány pomocí "množiny trojúhelníčků", které se snaží vystihnout jejich tvar. Pro metodu raytracing je proto mimo jiné potřeba vyřešit problém, jak získat průsečík paprsku s určitým trojúhelníkem.

Paprsek je zřejmě přímkou a trojúhelník chápeme jako množinu bodů v rovině, které leží uvnitř nebo na trojúhelníku v běžném smyslu.

Paprsek   je možno popsat (například) parametrickou rovnicí

 ,

kde   a   jsou body ležící na této přímce a   je parametr. Trojúhelník   určený body  ,   a   můžeme také popsat parametrickou rovnicí. Stačí si uvědomit, že nedegerovaný trojúhelník (pro nedegerovaný trojúhelník musí platit, že body  ,  ,   jsou v obecné poloze; trojúhelník tedy nezdegeneruje do bodu nebo úsečky) je dvourozměrným simplexem, tzn., že body trojúhelníku leží v konvexním obalu bodů  ,   a  

 .

S tímto tvarem by se nám ale špatně počítalo, proto si z podmínky   vyjádříme např.  . Pro bod   trojúhelníku pak musí platit

 

Označíme-li navíc   a  , můžeme psát

 ,

kde  ,  .

Průnik paprsku a plochy

Nejprve si rozebereme obecnější úlohu, tzn. průnik paprsku s plochou. Nechť trojúhelník   leží v rovině  , která je určená bodem   a normálovým vektorem  . Pro libovolný bod   ( ) platí, že vektory   a   jsou kolmé. Platí tedy

 .

Dosazením parametrické rovnice paprsku (\ref{param_rce_primky}) do rovnice (\ref{norm_rce_roviny}) získáme

 ,

odtud

 .

Průsečík   paprsku s rovinou   je proto roven

 .

Je-li trojúhelník určen body  ,   a  , můžeme normálový vektor   roviny   zapsat ve tvaru

 .

Průnik paprsku a trojúhelníku

Pro výpočet průsečíku paprsku s trojúhelníkem nejprve pomocí (\ref{I}) zjistíme průsečík   tohoto paprsku s rovinou, ve které daný trojúhelník leží. Protne-li paprsek rovinu, pak zbývá určit, jestli průsečík leží v daném trojúhelníku či nikoliv. Pokud vyjádříme souřadnice tohoto průsečíku vzhledem k bodu   (těmito souřadnicemi jsou parametry   a   v rovnici (\ref{param_rce_troj})), pak jsou-li splněny podmínky

 

průsečík leží v trojúhelníku.

Dále pro libovolný vektor   roviny   s normálovým vektorem   definujeme operátor   jako vektorový součin vektorů   a  . Platí tedy  . Tento operátor je zřejmě lineární, tzn., že platí

 

pro všechny skaláry  ,   a vektory  ,  . Z vlastností vektorového součinu navíc plyne, že  , neboli

 .

Identity a využijeme k výpočtu rovnice  , kde  , která vznikla z rovnice (\ref{param_rce_troj}) dosazením   za  . Vynásobíme-li ji skalárně vektorem   dostaneme  , tzn.  . Odtud můžeme vyjádřit  . Analogicky získáme skalárním vynásobením rovnice vektorem   parametr  . Dostaneme tedy

 

 

Algoritmizace editovat

Rekurzivní funkce Sleduj_paprsek (R, H – hloubka rekurze):

  1. Najdi průsečík P mezi R a objektem.
  2. Jestliže P neexistuje – R jde mimo scénu – pixel má barvu pozadí.
  3. Z P pošli ke zdrojům světla stínové paprsky.
  4. Vyhodnoť součet osvětlovacích modelů v P pro nezakryté zdroje světla.
  5. Pokud není překročena hloubka rekurse H, vyšli z P:
    1. Odražený sekundární paprsek voláním Sleduj_paprsek ( ,  ).
    2. Lomený paprsek Sleduj_paprsek ( ,  ).
  6. Paprsek má barvu danou součtem barvy od osvětlení, odraženého paprsku   a lomeného paprsku  .

Počet rekurzivních volání procedury Sleduj_paprsek je řízen parametrem H. Je-li roven 1, jedná se o tzv. ray-casting – vyhodnocují se pouze primární paprsky a jejich dopady na nejbližší objekt, při použití stínových paprsků jsou vyhodnoceny stíny. Pro zobrazení odrazů musí mít hodnotu minimálně 2 a pro řešení průhledných těles je minimum 3.

Autoři editovat

Tento text vypracovali studenti Univerzity Palackého v Olomouci katedry Matematické informatiky jako součást zápočtového úkolu do předmětu Počítačová geometrie.