Geometrie/Raytracing

Z Wikiknih
(přesměrováno z Raytracing)

Ray-tracing[editovat | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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 | editovat zdroj]

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.