Geometrie/Raytracing

Z testwiki
Verze z 31. 3. 2023, 12:14, kterou vytvořil imported>JAnDbot (robot: kosmetické úpravy)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Skočit na navigaci Skočit na vyhledávání

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
    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

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í:

(P)=Ilocal(P)+Iglobal(P)=Ilocal(P)+krgI(Pr)+ktgI(Pt)

  • P – průsečík
  • Pr – další průsečík odraženého paprsku
  • Pt – další průsečík propuštěného paprsku
  • krg – globální koeficient odrazivosti (reflexe)
  • ktg – 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í

:R(t)=R0+t(R1R0),

kde R0 a R1 jsou body ležící na této přímce a t 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

𝒯(T0,T1,T2)={t0T0+t1T1+t2T2;i=02ti=1,ti0}.

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

𝒯(t1,t2)=(1t1t2)T0+t1T1+t2T2=T0+(T1T0)t1+(T2T0)t2.

Označíme-li navíc u=T1T0 a v=T2T0, můžeme psát

𝒯(t1,t2)=T0+t1u+t2v,

kde t1+t21, t1,t20.

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 n. Pro libovolný bod Xϱ (XT0) platí, že vektory XT0 a n jsou kolmé. Platí tedy

(XT0)n=0.

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

(R0+t(R1R0)T0)n=0,

odtud

t=(T0R0)n(R1R0)n.

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

I=R((T0R0)n(R1R0)n).

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

n=(T1T0)×(T2T0)=u×v.

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

t1+t21,t10,t20,

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

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

(au+bv)*=au*+bv*

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

a*a=0.

Identity a využijeme k výpočtu rovnice w=t1u+t2v, kde w=IT0, která vznikla z rovnice (\ref{param_rce_troj}) dosazením I za T(t1,t2). Vynásobíme-li ji skalárně vektorem v* dostaneme wv*=t1uv*+t2vv*, tzn. wv*=t1uv*. Odtud můžeme vyjádřit t1. Analogicky získáme skalárním vynásobením rovnice vektorem u* parametr t2. Dostaneme tedy

t1=wv*uv*=w(n×v)u(n×v),

t2=wu*vu*=w(n×u)v(n×u).

Algoritmizace

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 (Rr, H+1).
    2. Lomený paprsek Sleduj_paprsek (Rt, H+1).
  6. 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.

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.