Raytracing
Z Wikiknih
Obsah |
[editovat] Ray-tracing
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
- objektů (pozice, tvar, barva a další vlastnosti materiálu)
- světelných zdrojů (pozice, barva)
- (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.
[editovat] Popis
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:
- paprsek narazí na difúzní povrch
- je dosažena předem stanovená maximální hloubka rekurze
- energie paprsku klesne pod určitý práh
V každém průsečíku P paprsku a objektu platí:

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ů
- 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)
- 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ů
- adaptivní antialiasing (zředěné vysílání paprsků, interpolace při malé změně)
- ří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 R0 a R1 jsou body ležící na této přímce a
je parametr. Trojúhelník
určený body T0, T1 a T2 můžeme také popsat parametrickou rovnicí. Stačí si uvědomit, že nedegerovaný trojúhelník (pro nedegerovaný trojúhelník musí platit, že body T0, T1, T2 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ů T0, T1 a T2
.S tímto tvarem by se nám ale špatně počítalo, proto si z podmínky
vyjádříme např. t0. Pro bod T 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 T0 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 I paprsku s rovinou
je proto roven
.Je-li trojúhelník určen body T0, T1 a T2, 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 I 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 T0 (těmito souřadnicemi jsou parametry t1 a t2 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, b 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 I za T(t1,t2). Vynásobíme-li ji skalárně vektorem
dostaneme
, tzn.
. Odtud můžeme vyjádřit t1. Analogicky získáme skalárním vynásobením rovnice vektorem
parametr t2. Dostaneme tedy

[editovat] Algoritmizace
Rekurzivní funkce Sleduj_paprsek (R, H - hloubka rekurze):
- Najdi průsečík P mezi R a objektem.
- Jestliže P neexistuje - R jde mimo scénu - pixel má barvu pozadí.
- Z P pošli ke zdrojům světla stínové paprsky.
- Vyhodnoť součet osvětlovacích modelů v P pro nezakryté zdroje světla.
- Pokud není překročena hloubka rekurse H, vyšli z P:
- Odražený sekundární paprsek voláním Sleduj_paprsek (Rr, H + 1).
- Lomený paprsek Sleduj_paprsek (Rt, H + 1).
- Paprsek má barvu danou součtem barvy od osvětlení, odraženého paprsku Rr a lomeného paprsku Rt.
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.
[editovat] Autoři
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.