Univerzita Karlova v Praze Matematicko-fyzikální fakulta
BAKALÁŘSKÁ PRÁCE
Jiří Novotný Spektrální rendering Kabinet software a výuky informatiky
Vedoucí bakalářské práce: RNDr. Josef Pelikán Studijní program: Informatika Studijní obor: programování
Praha 2012
Rád bych poděkoval vedoucímu své bakalářské práce, RNDr. Josefu Pelikánovi, za cenné rady a veškerý čas, který mi v průběhu projektu věnoval.
Prohlašuji, že jsem tuto bakalářskou práci vypracoval samostatně a výhradně s použitím citovaných pramenů, literatury a dalších odborných zdrojů. Beru na vědomí, že se na moji práci vztahují práva a povinnosti vyplývající ze zákona č. 121/2000 Sb., autorského zákona v platném znění, zejména skutečnost, že Univerzita Karlova v Praze má právo na uzavření licenční smlouvy o užití této práce jako školního díla podle §60 odst. 1 autorského zákona. V Praze dne 25. května 2012
Jiří Novotný
Název práce: Spektrální rendering Autor: Jiří Novotný Katedra: Kabinet software a výuky informatiky Vedoucí bakalářské práce: RNDr. Josef Pelikán Abstrakt: Předmětem této práce je navrhnout a implementovat zobrazovací systém, vhodný pro kreslení průhledných materiálů — zejména drahých kamenů. Důraz je kladen na spektrální vlastnosti světla, disperzi a refrakční kaustiky. Vstupem programu je XML soubor popisující zobrazovanou scénu — konfigurační parametry celého zobrazování, světelné zdroje a objekty (jejich geometrii a materiálové vlastnosti). Aplikace umožňuje použít jak laboratorně naměřená spektroskopická data, tak i zjednodušené modely pro experimentální využití. Výstupem je rastrový obrázek zobrazující danou scénu. Výpočet je založen na kombinaci dvou metod: sledování paprsku a mapování fotonů. Klíčová slova: spektrální rendering, disperze světla, sledování paprsku, fotonové mapy
Title: Spectral Rendering Author: Jiří Novotný Department: Department of Software and Computer Science Education Supervisor: RNDr. Josef Pelikán Abstract: The object of this thesis is to design and implement imaging system suitable for drawing transparent materials — especially gemstones. Emphasis is placed on the spectral properties of light, dispersion and refractive caustics. The input is an XML file describing the rendering scene — display configuration parameters, light sources and objects (their geometry and material properties). The application allows the use of both laboratory-measured spectroscopic data, as well as simplified models for experimental use. The output is a raster image depicting the scene. The whole calculation is based on a combination of two methods: ray tracing and photon mapping. Keywords: spectral rendering, dispersion, ray tracing, photon mapping
Kapitola 1 Úvod Zrak je jedním z nejdůležitějších smyslů člověka. Není proto s podivem, že právě zrakové vjemy odedávna fascinovaly celé lidstvo. Příroda nabízí nepřeberné množství optických efektů: východ a západ slunce již inspiroval mnoho umělců, duha na obloze dala vzniknout různým pověstem, halové jevy a polární záře zase lákají fotografy. Za jejich vznikem stojí fyzikální podstata světla, zejména pak jeho vlnový charakter. Běžný člověk, obklopený moderními materiály, se ve svém každodenním životě setkává se spektrálními vlastnostmi světla. Disperze (rozklad světla) je vidět ve sklenici vody či bílého vína, nebo ve speciálně broušených drahých kamenech. Interference na tenké vrstvě může být pozorována jako barevná mapka na olejové skvrně na mokré vozovce či na povrchu mýdlových bublin. Difrakce (ohyb) světla na optické mřížce zase způsobuje barevné odlesky na CD a DVD discích.
1.1
Cíl práce
Počítačová grafika dokáže velice realisticky simulovat různé optické jevy (odraz a lom světla, stíny, kaustiky1 ) pomocí technik založených na fyzikálních modelech. Obvykle se ale neberou v potaz spektrální vlastnosti světla; pro většinu simulací postačuje zjednodušený model tří barev RGB. Cílem této práce je implementovat systém umožňující zobrazovat disperzní efekty a spektrální kaustiky průhledných materiálů. Na základě vstupních informací o světelných zdrojích, rozložení objektů ve scéně, spolu s popisem jejich tvarů a materiálových vlastností, je vypočten obrázek zobrazující scénu z požadovaného místa. Aplikace může brát v úvahu jak reálně naměřená spektroskopická data (reflektance, absorbance, indexy lomů), tak klasické zjednodušené modely materiálů. Algoritmus výpočtu je založen na metodě sledování paprsku a metodě fotonového mapování. Vstupem programu je definiční XML soubor, výstupem rastrový obrázek. Systém může sloužit při zkoumání optických vlastností existujících materiálů (drahých kamenů, skel pro disperzní hranoly apod.) i pro experimentální 1
kaustika — obrazec po odrazu či lomu světla od zakřivené plochy, viz obrázek 5.15 a obrá-
zek 5.19
3
zobrazení materiálů smyšlených.
1.2
Rozčlenění textu
Druhá kapitola obsahuje shrnutí teoretických poznatků potřebných k implementaci. Část o optice se zabývá charakterem světla a principy jeho šíření v různých optických prostředích. Dále jsou zde zavedeny některé veličiny závislé na vlnové délce záření. V části o počítačové grafice je vysvětlena reprezentace barvy pomocí spektrálního modelu. Následuje přehled hlavních radiometrických veličin a matematický aparát zachycující šíření světla scénou — zobrazovací rovnice. V návaznosti jsou uvedeny základní algoritmy, které se snaží zobrazovací rovnici prakticky vyřešit. Kapitolu ukončují urychlovací metody, které optimalizují časovou náročnost výpočtu. V třetí kapitole jsou uvedeny poznatky z vlastní implementace spektrálního rendereru: od výběru vývojového prostředí, použití externích knihoven, až po samotný návrh aplikace. Jelikož je práce zaměřena především na spektrální charakter světla, je zde také podrobněji rozvedeno praktické rozšíření použitých algoritmů. Čtvrtá kapitola představuje aplikaci z pohledu běžného uživatele. Vysvětlena je instalace, spuštění a základní manipulace s programem, včetně návrhu definičního souboru scény. Pátá kapitola přináší ukázky dosažených výsledků spolu s jejich diskuzí. Detailněji jsou komentovány výsledky týkající se spektrálního charakteru světla, zejména disperze a fotonové mapování pro spektrum. Na konci kapitoly je navíc zařazeno několik reprezentativních obrázků.
4
Kapitola 2 Základní teorie Pro fotorealistické zobrazování je nutné vycházet z fyzikální podstaty světla. V této kapitole jsou proto položeny teoretické základy potřebné k pochopení dalšího textu. V části o optice jsou vysvětleny principy přímočarého šíření světla, zákon odrazu a lomu. Nastíněny jsou i základní spektrální veličiny a vztahy mezi nimi. Část o počítačové grafice pojednává o popisu geometrie jednotlivých těles, spektrální reprezentaci barev a následném převodu do běžně používaného RGB modelu. Dále je popsán matematický aparát zachycující zobrazovací rovnici a její řešení pomocí metod počítačové grafiky. Vysvětleny jsou i použité algoritmy — sledování paprsku a fotonové mapování. V dalších kapitolách práce se předpokládá znalost těchto teoretických poznatků, a proto již nebudou znovu vysvětleny.
2.1 2.1.1
Optika Světlo a jeho podstata
Názor na fyzikální podstatu světla se vyvíjel [12] od antických dějin, kdy se filosofové snažili odpovědět na otázku, jak vlastně vidíme. V této době byly empiricky ověřeny jednoduché zákony lomu a odrazu. Jistý zlom v pohledu na světlo ale přichází až mnohem později. V roce 1704 Isaac Newton publikoval jednu ze svých nejslavnějších knih — Optika (Opticks). Newton zastával částicovou (korpuskulární) koncepci světla, kterou navazuje na Descartovy myšlenky. Současně s ním představuje nizozemský fyzik Huygens vlnovou teorii světla, která byla dlouhá léta ve stínu teorie slavnějšího fyzika Newtona. Své renesance se dočkala v druhé polovině 19. století díky Maxwellovi, který ve svých diferenciálních rovnicích shrnul známé zákonitosti elektrického a magnetického pole, a vymezil světlo jako část elektromagnetického záření v určitém frekvenčním oboru. Nicméně některé jevy zůstaly nevysvětleny a existence obecně přijímaného éteru nebyla dokázána. V roce 1905 přichází Albert Einstein s vysvětlením fotoelektrického efektu a novým pohledem na věc: světlo je elektromagnetické vlnění, ale jeho povaha je jak vlnová, tak korpuskulární. Hovoří se o vlnově-korpuskulárním dualismu; na světlo je možné pohlížet z obou úhlů a pro daný jev je vždy nutné vybrat vhodný teoretický popis. Zobecnění této myšlenky na všechny částice (Louis de Broglie) 5
je jedním z významných objevů kvantové fyziky.
2.1.2
Geometrická optika
Geometrická (někdy též paprsková) optika studuje šíření světla v prostředí, jehož rozměry jsou velké oproti vlnovým délkám viditelného záření. Proto zanedbává vlnový charakter světla a zaměřuje se na přímočaré šíření paprsků ze světelných zdrojů. Je založena na několika jednoduchých principech [12]: • Světlo se v homogenním prostředí šíří přímočaře. • Všechny paprsky se šíří prostředím nezávisle na sobě (jakoby ostatní paprsky vůbec neexistovaly). • Chod paprsků je v izotropním prostředí záměnný, tj. je-li směr libovolného paprsku obrácen, paprsek se šíří stejnou cestou, akorát opačným směrem. Tato vlastnost je platná i v případech odrazu a lomu, které se řídí příslušnými zákony. Glassner [1] uvádí čtyři možné interakce světla po dopadu na povrch materiálu: Zrcadlový odraz Při dopadu světla na plochy, které mají dokonale lesklý charakter, nastává zrcadlový odraz. Úhel odrazu paprsku je roven úhlu dopadu, odražený paprsek leží v rovině dopadu (určené dopadajícím paprskem a kolmicí v místě dopadu). Situace je zachycena na obrázku 2.1. Z běžných materiálů do této kategorie spadají např. ideálně vyleštěné kovy (zrcadla).
α β
Obrázek 2.1: Zákon odrazu: α = β
Difuzní odraz Reálné materiály nejsou nikdy ideálně hladké. Jejich povrch se skládá z určitých nerovností (byť mikroskopických). Světlo se po dopadu na rozhraní těchto objektů odráží do náhodných směrů — nastává difuzní odraz. Ideální difuzní odraz (též Lambertovský) nastane, pokud je světlo odraženo do všech směrů rovnoměrně. Příkladem takového materiálu může být křída. Zrcadlové odrazy jsou tedy speciálním případem difuzního odrazu, kdy se směr odraženého paprsku liší jen velmi málo od ideálního směru odrazu. 6
Dokonalý lom Dokonalý lom nastává při dopadu paprsku na průhledné materiály. Pro světlo, které se šíří z optického prostředí s indexem lomu n1 do prostředí s indexem lomu n2 , platí Snellův zákon: n1 sin α = n2 sin β (2.1) Kde α (resp. β) je úhel dopadu (resp. úhel lomu), jak je zachyceno na obrázku 2.2.
n1
α
n2 β Obrázek 2.2: Snellův zákon lomu Zajímavá situace může být pozorována při dopadu světla z opticky hustšího prostředí do prostředí opticky řidšího (n1 > n2 ), pokud je splněna podmínka: n1 sin α ≥1 n2
(2.2)
K lomu paprsku nedochází a celá část světla se odrazí zpět do opticky hustšího prostředí. Tento jev se nazývá úplný (totální) odraz světla a má své využití třeba v optických vláknech. Příslušný úhel dopadu je tzv. kritický neboli mezní úhel. Difuzní rozptyl Stejně jako u zrcadlových odrazů není reálná situace ideální ani u lomu. Dopadající světlo je lomeno do náhodných směrů, čemuž se říká difuzní rozptyl (lze pozorovat u průsvitných či poloprůhledných materiálů). V praxi existují jen více či méně průhledné materiály a dokonalý lom je speciálním případem difuzního rozptylu, kdy se směry lomených paprsků moc neliší od směru lomu paprsku zidealizovaného materiálu. Fresnelovy vzorce Množství odraženého a lomeného světla udávají Fresnelovy vzorce [5], které jsou obecně závislé na polarizaci dopadajícího světla (výchylky vlnění probíhají pouze v určitých směrech). Pro světlo, šířící se z prostředí o indexu lomu n1 do 7
prostředí o indexu n2 , úhel dopadu α a úhel lomu β, platí pro koeficient odrazu v rovnoběžném směru Rk a koeficient odrazu v kolmém směru R⊥ vztahy: 2 n2 cos α − n1 cos β n2 cos α + n1 cos β 2 sin2 (α − β) n1 cos α − n2 cos β R⊥ = = n1 cos α + n2 cos β sin2 (α + β)
tan2 (α − β) = Rk = tan2 (α + β)
(2.3)
Pro potřeby této práce může být efekt polarizace zanedbán a jako výsledné množství odraženého světla je vhodné brát aritmetický průměr obou složek: R=
Rk + R⊥ 2
(2.4)
Dále lze podle zákona zachování energie spočítat intenzitu lomeného světla: (2.5)
T =1−R
Závislost Fresnelových koeficientů na úhlu dopadu je pro rozhraní vzduch-sklo (indexy lomu 1.0 a 1.5) zachycena na obrázku 2.3. Z grafu lze vyčíst hodnotu Brewsterova úhlu, což je úhel, při kterém dochází k polarizaci světla (někdy se mu proto také říká polarizační) — nepolarizovaný dopadající paprsek světla je po odrazu plně polarizován. Pro rozhraní vzduch-sklo je jeho hodnota přibližně 56◦ . VZDUCH - SKLO
SKLO - VZDUCH
100%
Brewsterův úhel
100%
60%
Oblast úplného odrazu světla
80% 60%
40%
40%
20%
20%
0%
Kritický úhel
80%
0% 0°
10° 20° 30° 40° 50° 60° 70° 80° 90°
Rǁ
0°
10° 20° 30° 40° 50° 60° 70° 80° 90°
Rǁ
R
R
Obrázek 2.3: Fresnelovy odrazivostní koeficienty v závislosti na úhlu dopadu
2.1.3
Spektrální veličiny
Fyzikální veličiny, jejichž hodnota je závislá na vlnové délce, se nazývají spektrální. Pro potřeby počítačové grafiky se nejčastěji uvažují funkce závislé na viditelné části spektra, ale některé efekty (např. fluorescence) mohou požadovat i část z oblasti UV [5]. Pokud nebude řečeno jinak, pro účely dalšího textu se vlnovou délkou myslí její hodnota vyjádřená v nanometrech. 8
Spektrální rozdělení intenzity Světelné zdroje emitují světlo o různých vlnových délkách, což lze popsat pomocí spektrálního rozdělení intenzity. To je definováno jako výkon zdroje, vztažený na jednotkovou plochu kolmou k směru šíření paprsku. Jedná se tedy o intenzitu vyzařování s důrazem na závislost podle vlnové délky. CIE1 definovala několik základních iluminantů, jejichž hodnoty jsou pro další použití tabelovány. Graf na obrázku 2.4 ukazuje emisní spektra vybraných svítidel.
350
400
450
500
550
600
650
700
750
800
Vlnová délka (nm) CIE D65
CIE Standard Illuminant A
Fluorescent F1
Obrázek 2.4: Emisní spektrum některých standardních svítidel CIE
Spektrální reflektance Spektrální reflektance (též odrazivost) je veličina popisující schopnost látek odrážet elektromagnetické záření různých vlnových délek. Je definována jako poměr mezi odraženou energií I(λ) a dopadající energií I0 (λ). R(λ) =
I(λ) I0 (λ)
(2.6)
Ve většině případů je spektrální reflektance nezávislá na intenzitě dopadajícího záření, a stává se tak výlučně materiálovou vlastností. Pro velmi hladké povrchy je sama o sobě postačujícím popisem materiálu. Na reálných objektech se ale uplatňují geometrické faktory (hrubost povrchu apod.). Ty vedou k rozšíření na obecnou odrazivostní funkci BRDF2 , která navíc bere v potaz i směr dopadajícího paprsku. 1 2
Commission internationale de l’éclairage - Mezinárodní komise pro osvětlování Bidirectional Reflectance Distribution Function - obousměrná odrazová distribuční funkce
9
Spektrální transmitance Spektrální transmitance definuje poměr mezi lomenou a dopadající energií: T (λ) =
I(λ) I0 (λ)
(2.7)
Kde I(λ) je přenesená energie a I0 (λ) je energie dopadající. Podobně jako reflektance může být i transmitance rozšířena na obecnější funkci BTDF3 v závislosti na úhlu dopadu. Spektrální absorbance Část energie světelného záření, pohlcená průhlednými či průsvitnými materiály, vztažená k jednotkové délce cesty paprsku, se nazývá spektrální absorbance. U obecných (nehomogenních) materiálů je tato veličina závislá nejen na vlnové délce, ale také na pozici místa dopadu v prostoru p. Analyticky může být vyjádřena takto: a(λ, p) = −
1 dI(λ, p) I(λ, p) dl
(2.8)
Pro homogenní materiály lze po menších úpravách [5] psát: I(λ) = I0 (λ)e−a(λ)l
(2.9)
Kde l je uražená dráha paprsku (vzdálenost mezi místem dopadu a místem, kde došlo k opuštění paprsku z tělesa). Další úpravou vychází známá forma Bouguerova zákona4 . I(λ) Tinternal (λ) = = e−a(λ)l (2.10) I0 (λ) Zde Tinternal (λ) značí vnitřní spektrální transmitanci, která se podílí na efektu objemové absorpce; větší objekty se jeví v důsledku delší dráhy jako tmavší (na delší dráze je pohlcena větší část záření), než objekty ze stejného materiálu, avšak menší velikosti. Index lomu Index lomu je frekvenčně závislá optická konstanta vyjadřující šíření světla v látkách. Obecně se popisuje komplexní funkcí: n(λ) = η(λ) + κ(λ)i
(2.11)
Kde η(λ) a κ(λ) jsou konstantní reálná čísla (jejich hodnoty závisí na materiálu). Reálná část indexu lomu určuje směr lomeného paprsku, imaginární část se často nazývá index absorpce a udává míru útlumu procházejícího záření v dané látce (souvisí s efektem objemové absorpce). Pokud se hodnoty indexu lomu výrazně liší pro různé vlnové délky, podle Snellova zákona se dopadající monochromatický 3 4
Bidirectional Transmittance Distribution Function - obousměrná distribuční funkce lomu také známý jako Beerův či Beer-Lambertův zákon
10
paprsek rozštěpí na několik lomených paprsků s různými směry. Tento jev se nazývá disperze a může být pozorován např. v diamantech a jiných drahých kamenech. Exaktní měření indexů lomu se provádí refraktometry. Pokud spektrální rozložení indexu lomu dané látky neobsahuje četné píky, je možné použít k aproximaci Sellmeierovu rovnici [6]. Ta se hodí především k zachycení vztahu indexu lomu a vlnové délky disperzních materiálů (skel optických přístrojů, některé diamanty). Většina drahých kamenů však projevuje v závislosti na vlnové délce mnoho nepravidelnosti, takže nezbývá, než využití přístrojově naměřených údajů. Nejběžnější forma Sellmeierovy rovnice pro průhledné materiály je: B1 λ2 B2 λ2 B3 λ2 + + (2.12) λ2 − C 1 λ2 − C 2 λ2 − C 3 Kde B1,2,3 a C1,2,3 jsou experimentálně zjištěné Sellmeierovy koeficienty, které bývají tabelovány pro vlnovou délku λ vyjádřenou v mikrometrech. Hodnoty koeficientů konkrétních látek lze vyhledat jak v odborné literatuře, tak v mnoha databázích volně dostupných na Internetu [13]. n2 (λ) = 1 +
2.2 2.2.1
Počítačová grafika Spektrální reprezentace barev
Lidské oko je citlivé na světelné záření o vlnových délkách v rozmezí 380 nm– 780 nm [2]. Jednotlivé vlnové délky způsobují rozdílné barevné vjemy. Sítnice lidského oka je vybavena dvěma druhy světlocitlivých buněk — čípky a tyčinkami. Tyčinky jsou zodpovědné za vnímání jasové složky obrazu, uplatňují se tedy více v šeru a ve tmě. Čípky zase zajišťují preciznější vidění a dělí se na tři funkční typy díky různé citlivosti na vlnové délky. Podle převládajících vlnových délek to jsou čípky reagující více na červenou, zelenou a modrou barvu [2]. Mezinárodní úřad Commission internationale de l’éclairage (zkráceně CIE) definoval v roce 1931 matematický model barevných prostorů CIE XYZ [5]. Tento model je podložen četnými výzkumy lidského zraku. Zavádí tři funkce x¯(λ), y¯(λ) a z¯(λ), které reprezentují citlivost jednotlivých druhů čípků. Příslušné křivky jsou zobrazeny na obrázku 2.5. Za pomoci těchto funkcí a světla o známém spektrálním rozdělení intenzity I(λ) se definují trichromatické složky X, Y, Z takto: Z ∞ X= I(λ) x ¯(λ) dλ 0 Z ∞ Y = I(λ) y¯(λ) dλ Z0 ∞ Z= I(λ) z¯(λ) dλ (2.13) 0
V trojrozměrné kartézské soustavě lze jakoukoliv barvu vyjádřit pomocí souřadnic X, Y, Z vektorem ˆ+Yy ˆ + Zˆz c = Xx (2.14) ˆ, y ˆ , ˆz se nazývá barevný Tento vektorový prostor definovaný bázovými vektory x prostor CIE. 11
2,0 1,8 1,6 1,4 1,2 1,0 0,8
0,6 0,4 0,2 0,0
400
450
500
550
600
650
700
Vlnová délka (nm)
x( )
y( )
z( )
Obrázek 2.5: Křivky citlivosti lidského oka podle CIE 1931 Převod na RGB Přestože CIE XYZ model je kompletní (tj. lze pomocí něj reprezentovat všechny barvy viditelné lidským okem), je pro potřeby počítačové grafiky nutné umět převést barvy do běžného modelu RGB, který se používá pro zobrazování na monitorech či projektorech. Jedná se o lineární transformaci, kterou lze vyjádřit pomocí matice přechodu R m11 m12 m13 X G = m21 m22 m23 Y (2.15) B m31 m32 m33 Z Konkrétní matici M a detaily odvození uvádí Yinlong Sun [5].
2.2.2
Radiometrické veličiny
Radiometrie je část optiky zabývající se měřením elektromagnetického záření (tedy i světla). Na rozdíl od fotometrie, která zkoumá působení světla na lidské oko a jeho citlivost na jednotlivé frekvence, se radiometrie zabývá veličinami, které mohou být měřeny experimentálně v laboratořích. Pro obecný popis energetického šíření světla se tak hodí více, než veličiny fotometrické [2]. Následuje stručný přehled základních veličin a vztahů. Ucelenější informace je možné dohledat v [12] a [2]. Základní jednotkou přenášené energie je zářivá energie, která se značí Q a její jednotkou jsou jouly (J). Energie fotonu o frekvenci ν je dána vztahem: E = hν =
hc [J] λ
(2.16)
. Kde h = 6, 63 · 10−34J · s je Planckova konstanta, c je rychlost světla a λ je vlnová délka přenášeného záření.
12
Zářivá energie, procházející určitou plochou za jednotku času, se nazývá zářivý tok (výkon): dQ W = J · s−1 (2.17) Φe = dt Intenzita vyzařování (resp. intenzita ozáření) je definována jako podíl zářivého toku, který je vysílán z plochy zdroje A (resp. dopadá na plochu tělesa o povrchu A) a obsahu dané plochy A. Ee =
dΦe W · m−2 dA
(2.18)
Ideální bodový zdroj světla vysílá zářivý tok rovnoměrně všemi směry; pro reálné zdroje je ale výhodnější vědět, jakou energii zdroj vysvítí do určité části prostoru, což vyjadřuje zářivost: dΦe Ie = W · sr −1 (2.19) dω Kde ω značí prostorový úhel vyjádřený ve steradiánech (plný prostorový úhel má hodnotu 4π). Nakonec jedna z nejdůležitějších radiometrických veličin — zář (v počítačové grafice se vžil anglický název radiance, ten bude nadále používán), pomocí které lze vyjádřit ostatní radiometrické veličiny. Udává množství dopadající či emitované energie z jednotkového prostorového úhlu na jednotkovou plochu. Analyticky vyjádřeno: d2 Φe dIe dEe Le = = = W · sr −1 · m−2 (2.20) dω dA cos θ dA dω Kde dA je element plochy tělesa (zdroje) a θ je úhel, který svírá paprsek ve zvoleném směru s normálou této plochy (obrázek 2.6).
n dω
θ
dA Obrázek 2.6: Radiance
2.2.3
Zobrazovací rovnice
Základní matematický popis šíření světla scénou zachycuje zobrazovací rovnice. Vyjadřuje rovnováhu přenosu světla v ideálním prostředí, které samo o sobě nijak neinteraguje se světlem (např. neobsahuje částice prachu, které by světlo po cestě rozptýlily). Jedná se o fundamentální nástroj počítačové grafiky, pomocí něhož lze vypočítat výslednou barvu (radianci) v libovolné části scény, proto bývá uvedena téměř v každé kvalitní publikaci o počítačové grafice, např. v [2], [4] a [3]. Výstupní radiance Lo v bodě x ve směru ~ω je součtem radiance emitované 13
vlastní plochou Le (jedná-li se o plošný zdroj světla) a radiance odražené od všech ostatních objektů Lr : Lo (x, ~ω ) = Le (x, ~ω ) + Lr (x, ω ~)
(2.21)
Radianci odraženou ze všech možných směrů lze dále rozepsat, zobrazovací rovnice se tak dostává do tvaru, který je možné v počítačové grafice vidět často: Z Lo (x, ~ω ) = Le (x, ~ω ) + fr (x, ~ω ′, ~ω )Li (x, ~ω ′)(~ω ′ · n~x )d~ω ′ (2.22) Ω
Kde fr (x, ~ω ′ , ~ω ) je odrazivostní funkce BRDF v bodě x pro příchozí směr ω ~′ a odchozí směr ~ω , Li (x, ω ~ ′ ) je příchozí radiance v bodě x obklopující směr ω ~ ′ , n~x je normálový vektor plochy v bodě x a integruje se přes množinu všech prostorových úhlů Ω. Podrobné odvození tohoto vztahu a zavedení funkce BRDF (jakož i jejího zobecnění) je uvedeno v již zmíněné literatuře (velice čtivě např. v [4]).
2.2.4
Rekurzivní sledování paprsku
Rekurzivní sledování paprsku5 je v počítačové grafice jedna z nejznámějších technik globálního osvětlení. Ačkoliv sama o sobě není schopná vypočítat kompletní řešení zobrazovací rovnice (neuvažuje např. nepřímé osvětlení a kaustiky), stala se základem dalších sofistikovanějších metod. Poprvé ji představil již v roce 1980 T. Whitted [11]. Idea samotného algoritmu (pseudokód viz algoritmus 1) je velmi jednoduchá. Sleduje se dráha paprsku směrem od pozorovatele. Pro každý pixel se nejprve vypočítá směr odchozího paprsku, poté se najde nejbližší průsečík paprsku se scénou, pokud existuje. V případě kolize s objektem se podle daného světelného modelu vypočítá barva v místě dopadu. Pokud je těleso navíc lesklé či průhledné, spočte se směr odraženého (lomeného) paprsku, který se následně sleduje stejným postupem (rekurzí). Nakonec se výsledné barvy zkombinují a vrátí se jako barva daného pixelu. Algoritmus 1 Rekurzivní sledování paprsku 1. Pro každý pixel obrazu (a) Spočítej směr paprsku procházející pixelem (b) Sleduj paprsek (algoritmus 2)
Původní algoritmus prošel menšími úpravami, aby dokázal zobrazit i pokročilejší efekty — měkké stíny, rozmazání pohybem, neostrý odraz a lom, hloubku ostrosti. Jeden vzorek je nahrazen několika (stovky až tisíce) paprsky, což umožňuje tyto jevy simulovat. Takové technice se říká distribuované sledování paprsku (někdy též stochastické). Glassnerem napsaná kniha An Introduction to Raytracing [1] přináší pěkné pojednání i o této problematice. Praktický úhel pohledu pro potřeby implementace uvádějí Matt Pharr a Greg Huphreys [3]. 5
anglicky Recursive Ray Tracing
14
Algoritmus 2 Sleduj paprsek 1. Najdi nejbližší průsečík paprsku s objekty ve scéně 2. Pokud průsečík neexistuje, vrať barvu pozadí 3. Vypočti osvětlení (barvu) v bodě průsečíku (algoritmus 3) 4. Pokud je materiál protnutého tělesa lesklý/průhledný: (a) Vypočti směr odraženého/lomeného paprsku (b) Sleduj paprsek (algoritmus 2) (c) Zkombinuj jeho barvu s aktuální barvou pixelu Algoritmus 3 Vypočti osvětlení 1. Pro všechny světelné zdroje: (a) Vyšli stínový paprsek směrem ke zdroji (b) Pokud stínový paprsek neprotnul žádné těleso: i. Vypočti barvu přímého osvětlení v daném bodě ii. Přičti k barvě pixelu
2.2.5
Sledování cesty
Algoritmus sledování cest (anglicky path tracing) je matematicky sofistikovanější obdoba klasického sledování paprsku, která dokáže vypočítat kompletní globální osvětlení scény (na úkor výpočetního výkonu) [4]. Na rozdíl od distribuovaného sledování je přes pixel vysláno několik paprsků a při dopadu je stochasticky rozhodnuto, zda je paprsek pohlcen, nebo odražen dál. Nedochází tedy k rozdělení paprsku na několik nových (zrcadlově odražený, lomený, . . . ), stačí náhodně vybrat jeden z nich. Pokud paprsek narazil na difuzní materiál, je nepřímé osvětlení vypočteno pomocí jednoho difuzně odraženého paprsku. K výpočtu přímého osvětlení jsou ale generovány stínové paprsky ke všem zdrojům. Průměrováním několika vzorků pro každý pixel (v praxi jsou to stovky) lze aproximovat integrál zobrazovací rovnice. Pro pochopení, proč tento algoritmus funguje, je nezbytné pochopit myšlenku metody Monte Carlo.
2.2.6
Monte Carlo
V praxi vede zobrazovací rovnice k integrálům vyšších rozměrů, jejichž analytické řešení je téměř nemožné. Pro jejich výpočet se proto používají metody numerické matematiky. V počítačové grafice jde nejčastěji o pravděpodobnostní metodu nazývanou Monte Carlo [4]. Monte Carlo používá náhodné vzorkování integrované funkce. Nechť f (x) je funkce, kterou je potřeba zintegrovat s jednorozměrným de-
15
finičním oborem od a do b: I=
b
Z
f (x)dx
(2.23)
a
Intuitivním odhadem integrálu této funkce je zprůměrování N hodnot funkce pro náhodně vybrané vzorky ξ1 , ξ2, . . . , ξn , které mají obecně libovolné rozložení s hustotou pravděpodobnosti P (x). Monte Carlo odhad integrálu je: N 1 X f (ξi ) Im = N i=1 P (ξi )
(2.24)
Ihned je vidět, že s rostoucím počtem vzorků roste i přesnost odhadu, konkrétně platí: lim Im = I (2.25) N →∞
Tento odhad je nestranný, střední hodnota je rovna skutečné hodnotě, jak lze lehce ověřit: # " Z b N N Z 1 X b f (ξi ) 1 X f (ξi ) = P (ξi )dx = EIm = E f (x)dx = I (2.26) N i=1 P (ξi ) N i=1 a P (ξi ) a Pro potřeby praktického výpočtu je dobré vědět, jak rychle metoda konverguje ke správnému řešení, což lze zjistit výpočtem rozptylu odhadu: Z b 1 2 2 2 σ = (2.27) f (x)dx − I N a √ Směrodatná odchylka σ je tedy nepřímo úměrná N. Jinými slovy, aby se zmenšila chyba o jednu polovinu, je potřeba vzít čtyřnásobný počet vzorků. Z toho vyplývají největší nevýhody metody Monte Carlo — pomalá konvergence ke správnému výsledku a velký rozptyl pro malý počet vzorků (ten se na obrázku projeví jako značný šum). Naštěstí existují techniky redukující významnost obou chyb [4], a Monte Carlo metoda se tak stává jednou z nejúčinnějších pro praktické využití v počítačové grafice.
2.2.7
Fotonové mapování
Fotonové mapování je dvoufázová metoda výpočtu nepřímého osvětlení vyvinutá Henrikem Jensenem [4]. Jensen se snažil reprezentovat osvětlení nezávisle na geometrii těles, což umožňuje využití libovolně složité scény. Pro tento účel navrhnul datovou strukturu — tzv. fotonovou mapu, ve které jsou uložena všechna potřebná data o osvětlení v daných bodech. V první fázi algoritmu se sleduje průběh fotonů vyslaných ze světelných zdrojů. Do fotonové mapy je pak ukládána jejich interakce s okolím. V druhé fázi výpočtu je fotonová mapa vizualizována pomocí metody sledování paprsku. Řešení zobrazovací rovnice pomocí fotonového mapování není nestranné, což znamená, že je do výpočtu zanesena systematická chyba (tou je průměrování světelného toku v druhé fázi). Navržené řešení je ale konzistentní — zaručuje korektní výsledek při použití velkého počtu fotonů (limitně se blížícího nekonečnu). 16
Sledování fotonů První průchod algoritmu zajišťuje emisi jednotlivých fotonů světelnými zdroji. Přitom je důležité, aby fotony nesly stejný světelný tok. Tím se zaručí, že nebude zbytečně plýtváno výpočetní kapacitou pro fotony s nízkou energií. Pro každé svítidlo se podle jeho charakteru vybere náhodná počáteční pozice a směr emise. Fotonu se podle energie světla udělí počáteční tok nepřímo úměrný celkovému počtu fotonů. Pokud scéna obsahuje více zdrojů světla, jsou fotony vysílány z každého z nich v distribuci závislé na jejich celkové energii — jasnější zdroje emitují více fotonů, kdežto tlumená jich emitují méně. Následuje sledování dráhy fotonu, což je proces podobný rekurzivnímu sledování paprsku s tím rozdílem, že paprsky na své cestě sbírají radianci, kdežto fotony šíří světelný tok. Foton může být po dopadu na povrch tělesa buďto odražen, lomen, nebo pohlcen. K rozhodnutí, která situace nastane, se používá technika nazývaná ruská ruleta: generuje se náhodné číslo ξ ∈ h0, 1i, podle kterého se v závislosti na materiálových vlastnostech tělesa rozhodne. K uložení informace o dopadu fotonu je podle Jensena výhodné využít dvě fotonové mapy — globální a kaustickou. Do globální mapy se ukládají všechny fotony, které dopadly na neodrazivý (difuzní) povrch. Ukládání fotonů na lesklých či průhledných plochách nemá smysl, protože pravděpodobnost, že foton dorazil přesně ze směru zrcadlového odrazu/lomu, je nulová. Pro přesné zobrazení těchto povrchů je nejlepší použít metodu sledování paprsku. Kaustická mapa je podmnožinou globální mapy a ukládají se do ní jen ty fotony, které byly před dopadem na difuzní povrch aspoň jednou zrcadlově odraženy, nebo lomeny. Přesné zobrazení kaustik vyžaduje velký počet fotonů, proto je použití samostatné mapy výhodou. U scén s řídkou geometrií nedopadne mnoho vyslaných fotonů na žádné těleso. Jensen proto doporučuje použít tzv. projekční mapy, což jsou jednoduché projekce scény pro jednotlivé světelné zdroje. Prostor kolem světla je rozdělen do malých buněk, které informují, zda-li se daným směrem nachází nějaký zajímavý objekt. Při generování směru fotonů se pak zohledňují informace buněk dané mapy. Buňky pro kaustickou mapu mohou navíc obsahovat jen tělesa s lesklým či průhledným povrchem, tím se přesnost kaustických fotonů ještě zlepší. Zobrazení fotonové mapy Do fotonové mapy se přidávají fotony pouze v prvním kroku algoritmu — jsou v ní uloženy údaje o energii fotonu, místě dopadu a příchozím směru fotonu. Během zobrazovací fáze slouží mapa k odhadu intenzity osvětlení v daném bodě prostoru. K tomu je potřeba nalézt několik fotonů, které jsou nejblíže odhadovanému místu. Jensen pro tento účel navrhuje uplatnění vyváženého k -d stromu (viz část 2.2.8). Složitost nalezení jednoho fotonu s použitím vyváženého stromu je O(log N), kde N je počet fotonů uložených ve fotonové mapě. Při vyhledávání k nejbližších fotonů je složitost O(k+log N) [4]. Před dalším výpočtem je tedy nutné fotonovou mapu (do této chvíle uloženou jen jako pole informací) vyvážit. Samotné zobrazení lze provést metodou sledování paprsku. Radiance v místě
17
dopadu paprsku se odhaduje pomocí světelného toku z fotonové mapy vzorcem: k
1 X fr (x, ~ωp , ~ω )Φp (x, ω ~ p) Lr (x, ω ~) ≈ 2 πr p=1
(2.28)
Kde Lr (x, ~ω ) je radiance odražená z bodu x ve směru ~ω , k je počet fotonů použitých v odhadu, r je poloměr oblasti, ze které pocházejí fotony pro odhad, fr (x, ω ~ p , ~ω ) je odrazová funkce materiálu (BRDF) v bodě x pro příchozí směr ~ωp a odchozí směr ω ~ a Φp (x, ~ωp ) je světelný tok fotonu přicházejícího ze směru ω ~p v bodě x.
Obrázek 2.7: Odhad jasu pomocí nejbližších fotonů: vlevo s použitím koule, vpravo elipsoid pro zpřesnění lokace fotonů
Obrázek 2.8: Ovlivnění odhadu fotony z druhé strany stěny Takový odhad může být v blízkosti styku několika plošek (např. hrany a rohy) nepřesný, jelikož se do něj zahrnují i fotony nepatřící na požadovanou plošku. Řešení tohoto problému je jednoduché: původní kulová oblast pro hledání fotonů se zdeformuje ve směru normály odhadovaného povrchu, čímž vznikne elipsoid zpřesňující výběr fotonů (obrázek 2.7). Další významnou vadou je zahrnutí fotonů z druhé strany uvažované plošky (například tenká stěna oddělující prostor viz obrázek 2.8). Aby se i tomuto zabránilo, je do mapy uložena s každým fotonem také normála povrchu z místa jeho dopadu. Do odhadu se pak zahrnují jen fotony s normálou, která se moc neliší od normály odhadovaného povrchu. Fotonovou mapu lze zobrazit přímo, což dává dobré výsledky jen pro kaustiky; ty zaostřují světlo do určitých oblastí, kde je v důsledku toho vysoká hustota 18
fotonů a odhad je poměrně spolehlivý. Naopak přímé zobrazení globální mapy nevede k dobrým výsledkům; uložené fotony mají většinou malou hustotu, takže vzniká velký rozptyl odhadované radiance, a takto získané obrázky jsou velice nepřesné.
2.2.8
Urychlovací metody
V průběhu algoritmu sledování paprsku dochází mnohokrát k testu na průsečík s tělesem. Podle Havrana [7] tento test zabírá až 90% celého výpočtu. Během posledních let byly vyvíjeny mnohé akcelerační struktury. Některé snižují počet vyslaných paprsků (adaptivní antialiasing, řízení hloubky rekurze), jiné redukují počet testů na kolize s objektem (hierarchie těles, prostorové dělení, obálky těles složitějších tvarů) či urychlují samotný výpočet s konkrétním typem tělesa. k -d strom Z Havranových testů vychází, že jednou z nejúčinnějších metod je struktura k d stromu6 . V podstatě se jedná o binární strom, který postupně rozděluje prostor do menších buněk. Každá buňka je reprezentována osově zarovnaným obalovým kvádrem (dále jen AABB — z angl. Axis-Aligned Bounding Box). Buňky se dělí tak, aby obě nové části obsahovaly přibližně stejný počet těles. Tyto nové kvádry jsou rozděleny rekurzivně stejným způsobem, než se dosáhne ukončovacího kritéria (počet těles v buňce je dostatečně malý, nebo hloubka stromu překročila požadovanou mez). Havran tento algoritmus vylepšil heuristikou povrchu plochy (dále SAH — z angl. Surface Area Heuristic), která umožňuje mnohem lepší rozdělení prostoru. Myšlenka SAH je velmi jednoduchá: pravděpodobnost, že paprsek při průchodu scénou narazí na buňku s větším povrchem je vyšší, proto je výhodné, aby velké buňky byly prázdné, a nedocházelo tak k výpočetně náročným testům na kolize. Naivní implementace však vede k neúnosné časové složitosti O(N 2 ), kde N udává počet objektů ve stromě. Wald a Havran [8] naštěstí představili rychlejší algoritmus, který pracuje v O(N log N). V jejich publikaci lze nalézt dostatečně podrobný popis algoritmu a pseudokód postavení k -d stromu, nejsou zde proto uvedeny. Detaily reprezentace a algoritmus průchodu stromem uvádí Havran v již zmíněné disertační práci [7]. Průsečík s trojúhelníkem Většina uvažovaných objektů ve scéně je modelována jako množina malých trojúhelníků, kterých může být pro rozsáhlé modely i několik milionů. Takovéto objekty s výhodou používají již zmíněnou urychlovací strukturu k -d stromu. Přesto je pro maximální urychlení nutné optimalizovat i výpočet kolize s jednotlivými trojúhelníky. Jedním z nejrychlejších řešení se ukázala být metoda používající barycentrické souřadnice [9]. Paprsek je možno analyticky popsat jako parametrickou přímku s počátkem v bodě o a normalizovaným směrovým vektorem d: R(t) = o + td 6
Zkratka za k -dimenzionální strom
19
(2.29)
Libovolný bod na trojúhelníku s vrcholy o souřadnicích V1 , V2 a V3 může být vyjádřen jako: T (u, v) = (1 − u − v)V1 + uV2 + vV3 (2.30) Kde koeficienty (u, v), splňující u, v ≥ 0 a u + v ≤ 1, se nazývají barycentrické souřadnice. Výpočet průsečíku paprsku s trojúhelníkem se tak zužuje na řešení rovnice R(t) = T (u, v), které je popsáno i s implementačními detaily v [3]. Kolize s AABB Protože buňky v k -d stromě a obaly těles složitých tvarů jsou reprezentovány pomocí AABB, je žádoucí se zaměřit i na výpočet kolize paprsku s těmito kvádry. Vhodné řešení prezentují Mahovsky a Wyvill [10]. K reprezentaci paprsku používají Plückerovy souřadnice, což je způsob, jak přímce v projektivním prostoru P 3 přiřadit šest homogenních souřadnic. Pomocí nich optimalizovali celý výpočet, podrobný popis je k dispozici v jejich článku.
20
Kapitola 3 Implementace 3.1
Vývojové prostředí
Volba implementačního prostředí vycházela z potřeby objektovosti jazyka a snadné přenositelnosti na různé platformy (například pro potřeby budoucí paralelizace). Objektovost hrála v celém návrhu zásadní roli, jelikož se program skládá z několika logicky oddělených části, které by na sobě neměly být závislé (matematické jádro, načítání dat, reprezentace objektů v paměti, algoritmy výpočtů apod.). Některé objekty (popis geometrie těles, paprsky, fotony) vykazují vyšší míru abstrakce, či rozličnou dědičnost vlastností. Z tohoto důvodu bylo při návrhu implementace zásadní vycházet z metodiky objektově orientovaného programování. Dalším kritériem byly vysoké nároky na výpočetní výkon. Jelikož jsou použité algoritmy již samy o sobě výpočetně náročné, bylo by jakékoliv omezení rychlosti ze strany jazyka nežádoucí. Tyto požadavky vedly jednoznačně k výběru programovacího jazyka C++.
3.2
Externí knihovny
Vstup a výstup programu bylo nutné zajistit v již používaných standardních formátech. Pro vstupní konfigurační soubor scény byl použit formát XML, výstupem jsou obrázky běžných formátů (PNG, JPEG, Bitmap). Vhodným řešením se proto ukázalo být použití externích knihoven. Všechny externí knihovny jsou licencovány k volnému použití, a jelikož jsou implementovány v jazyce C, případně v C++, je zajištěna i jejich přenositelnost.
3.2.1
Expat XML Parser
Knihovna expat zajišťuje čtení souborů ve formátu XML. Program využívá její verzi 2.0.1. Je psána v jazyce C a její využití vyžaduje místy kostrbatou formu neobjektového přístupu. Pro potřeby aplikace je však plně postačující. 21
3.2.2
DevIL
Výstup výsledného obrázku do souboru je umožněn pomocí knihovny DevIL, která je naprogramována v jazyce C++. Její verze 1.7.8 podporuje rozličné formáty (např. Portable Network Graphics, Windows Bitmap, Jpeg). Tato knihovna je programem využívána i k načítání obrázků pro textury materiálů.
3.3
Návrh programu
Při návrhu aplikace byla úloha dekomponována na menší logické části, které na sobě nejsou nijak závislé. Vzniklo tak třeba matematické jádro, které se stará o veškeré geometrické výpočty s vektory, body a maticemi (transformace), či zajišťuje základní matematické funkce, konstanty a převody jednotek. Další část programu obstarává ukládání materiálů, jiná zase reprezentaci světel a tvarů. Nezávisle na sobě jsou implementovány i oba použité algoritmy. Podrobný přehled hlavních částí aplikace, konkrétních tříd a objektů je uveden v příloze B.
3.4
Fáze zpracování výpočtu
Výpočet programu lze rozdělit do několika fází: • Inicializace programu — načtením definičního souboru je sestavena scéna: do paměti se zavádějí jednotlivá světla, materiály a geometrické modely. Pro trojúhelníkové sítě je vytvořen k -d strom jednotlivých modelů a nakonec se sestavuje k -d strom celé scény. • Emise fotonů — pokud je v konfiguraci scény navoleno fotonové mapování, vysílají se fotony ze všech svítidel směrem do scény. Jejich průběh se zaznamenává ukládáním do jednotlivých fotonových map. Po vyslání všech fotonů je z těchto map vyroben k -d strom (podle aktuální polohy fotonů) pro pozdější rychlé dotazování. • Výpočet obrázku — probíhá pomocí upraveného algoritmu sledování paprsku. Pro každý pixel je vypočten směr paprsku, který se šíří scénou. V místě dopadu je spočítáno osvětlení na základě daného světelného modelu (zrcadlové odlesky a lomy pomocí dalšího sledování paprsku, nepřímé osvětlení z fotonových map). Současně je proveden adaptivní antialiasing, při kterém jsou některé pixely ještě rozděleny tak, aby se zabránilo zubatým okrajům a podobným artefaktům. • Vykreslení — nakonec je výsledný obrázek uložen do souboru v uživatelem zvoleném formátu.
22
3.5
Reprezentace spektrálních dat
Jedním z klíčových problémů implementace spektrálního renderingu byla volba interní reprezentace spektrálních dat. V přírodě mají materiálové vlastnosti spojitý charakter (alespoň na úrovni makrosvěta), jenže taková data je nemožné efektivně uložit v paměti počítače díky omezené přesnosti reálných čísel. Wilkie a kol. [6] uvádějí několik základních možností. Sun [5] rozebírá tuto problematiku detailněji a vyčerpávajícím způsobem. Navíc uvádí chybové metriky různých reprezentací. V této práci je použito rovnoměrné vzorkování spektrálních dat a to zejména kvůli jednoduché a přímočaré implementaci. Aplikace je navíc navržena tak, že nezáleží na konkrétní reprezentaci, což umožňuje její případné rozšíření. Vlastní reprezentace spektrálních dat se nachází v souboru spectralData.h. Jsou zde definovány základní třídy a metody pro veškerou manipulaci s daty. Program ve své původní verzi uvažuje viditelné světlo v rozsahu vlnových délek 400 nm – 700 nm (konstanty SAMPLED LAMBDA START a SAMPLED LAMBDA END) a 30 spektrálních vzorků (konstanta SPECTRAL SAMPLES). Toto nastavení se jeví jako dostačující pro většinu testovaných scén. Ze své povahy jsou tyto parametry programem chápány jako fixní, i když by mohly být součástí uživatelského vstupu. Načítaná externí data nemusí být vzorkována rovnoměrně, ani nemusí být v předepsaném rozsahu vlnových délek. Převod mezi takovými daty a vnitřní rovnoměrnou reprezentací je zajištěn pomocí lineární interpolace.
3.6
Rozšířené sledování paprsku
Základní verze algoritmu sledování paprsku neumožňuje zobrazovat spektrální jevy, protože neuvažuje závislost paprsku na vlnových délkách. Pro účely této práce bylo nutné základní verzi rozšířit o disperzi a spektrální materiály. Myšlenka rozšíření je jednoduchá a vychází z fyzikálního principu disperze [12]. Světlo složené z mnoha vlnových délek dopadá na průhledný objekt, kde se lomí. Jelikož je index lomu obecně závislý na vlnové délce, mají lomené paprsky různých vlnových délek rozdílné směry. Tyto paprsky se dále šíří prostředím — odráží se, znovu lámou, nebo jsou pohlceny na stínítku. Rekurzivní sledování paprsku je však založeno na postupu opačném — směrem od pozorovatele. Paprsky jsou vysílány jako svazek monochromatických paprsků (tento svazek si lze zatím představit jako jeden paprsek), který se při dopadu na disperzní těleso teprve rozštěpí na paprsky o jednotlivých vlnových délkách. Tyto paprsky se dále šíří scénou naprosto samostatně. V místě rozkladu světla je z výsledného spektra (kde má každý monochromatický paprsek svůj příspěvek) vypočtena barva pixelu. Pseudokód rozšířeného sledování paprsku viz algoritmus 4. Praktická implementace navíc omezuje maximální hloubku rekurze a minimální energii paprsku. Při každém odrazu a lomu je paprsku zmenšena jeho energie v závislosti na odraženém/lomeném množství. Což pročišťuje algoritmus od výpočtů, které by neměly na výsledném obrázku zásadní vliv. Jak je vidět z algoritmu 5, zůstává otevřenou otázkou, co dělat v případě, kdy spektrální paprsek narazí na těleso z nespektrálního materiálu (např. podle Phongova modelu). Takováto situace by v dobře navržené scéně neměla nastat: 23
Algoritmus 4 Sleduj paprsek* 1. Najdi nejbližší průsečík paprsku s objekty ve scéně 2. Pokud průsečík neexistuje, vrať barvu pozadí 3. Pokud je materiál protnutého tělesa spektrálně závislý: (a) Vypočti spektrální osvětlení v bodě průsečíku (obdoba algoritmu 3) (b) Pokud je materiál disperzní, tak pro každou vlnovou délku: i. Vypočti odražený/lomený paprsek v závislosti na vlnové délce ii. Sleduj monochromatický paprsek (algoritmus 5) (c) Převeď spektrum na RGB barvu a zkombinuj s barvou pixelu 4. Jinak vypočti osvětlení v bodě průsečíku klasicky (algoritmus 3) 5. Pokud je materiál protnutého tělesa lesklý/průhledný (a není disperzní): (a) Vypočti směr odraženého/lomeného paprsku (b) Sleduj paprsek* (algoritmus 4) (c) Zkombinuj jeho barvu s aktuální barvou pixelu
Algoritmus 5 Sleduj monochromatický paprsek 1. Najdi nejbližší průsečík monochromatického paprsku s objekty ve scéně 2. Pokud je materiál protnutého tělesa spektrálně závislý: (a) Vypočti osvětlení v bodě průsečíku a dané vlnové délce (b) Pokud je materiál protnutého tělesa lesklý/průhledný: i. Vypočti směr odraženého/lomeného paprsku v závislosti na vlnové délce ii. Sleduj monochromatický paprsek (algoritmus 5) iii. Zkombinuj všechny příspěvky a vrať je jako výsledek 3. Jinak (není-li materiál spektrální): (a) nedělej nic (diskutováno v části 3.6)
24
buďto se zobrazují spektrální jevy a všechny definované materiály mají spektrální charakter, nebo se spektrální jevy zanedbávají a materiály jsou pouze nespektrální. Nicméně je dobré i tuto situaci v programu ošetřit. Jako první řešení se nabízí událost prostě ignorovat. Navržená aplikace však používá jinou metodu. Při tvorbě nespektrálního Phongova materiálu se uloží i reflektance odhadnutá na základě difuzní složky modelu. Je však nutné upozornit, že díky metamerii lidského oka1 není tento odhad jediný možný.
3.7
Rozšířené fotonové mapování
Stejně jako metoda sledování paprsku, nepodporuje základní verze fotonového mapování spektrální charakter světla. Jeho rozšíření je však podobně přímočaré. Fotony jsou logicky rozděleny do tří typů: • RGB foton — nese zářivý tok ve formě RGB barvy • Spektrální foton — nese zářivý tok jako celé spektrum vlnových délek • Monochromatický foton — zářivý tok propaguje pouze v určité vlnové délce Algoritmus vrhání fotonů pak lze rozšířit podobně jako algoritmus sledování paprsku: 1. Z každého světla se emitují spektrální fotony, které se po dopadu na disperzní materiál rozloží do několika monochromatických fotonů. Ty se dále šíří scénou nezávisle na sobě podle fyzikálních vlastností příslušejících jejich vlnové délce. 2. Fotony se generují ze světelných zdrojů již v monochromatické verzi, šíří se stejně, ale k disperzi již nedochází explicitně. V tomto případě musí být upraven počet emitovaných fotonů pro konkrétní vlnovou délku podle příslušné spektrální charakteristiky svítidla, která tak funguje prakticky jako pravděpodobnostní rozdělení. Oba algoritmy byly v programu implementovány a přinášejí mírně odlišné výsledky. Běžnému uživateli je přístupná pouze druhá verze. Bližší diskuze tohoto řešení se nachází v části 5.5.
1
jev, kdy dvě fyzikálně různé spektrální charakteristiky vyvolávají v lidském oku stejný vjem,
tj. jsou vnímány jako totožné barvy
25
Kapitola 4 Uživatelská dokumentace 4.1
Instalace a spuštění programu
Program SpectralRenderer nevyžaduje explicitní instalaci, stačí překopírovat složku SpectralRenderer z přiloženého CD na pevný disk počítače. Před spuštěním je dobré se přesvědčit, že ve stejné složce s hlavním souborem aplikace (SpectralRenderer.exe) jsou i soubory externích knihoven: • DevIL.dll • ILU.dll • libexpat.dll Vlastní spuštění se provádí z příkazové řádky následujícím způsobem: SpectralRenderer.exe input output Kde input je cesta k definičnímu XML souboru scény a output je cesta k cílovému obrázku. Prakticky např. takto: SpectralRenderer.exe sceneDragon.xml dragon.png Pokud nejsou zadány vstupní parametry z příkazové řádky, je program schopen pracovat v konzolovém režimu. V takovém případě bude uživatel vyzván na vložení cesty definičního souboru a výsledného obrázku přímo z konzole. Potvrzení se provádí běžně — klávesou Enter. Po spuštění programu je uživatel přehledně informován o průběhu celého výpočtu v anglickém jazyce. Nejdříve je komentována fáze načítání scény a vytváření k -d stromů jednotlivých modelů. Následuje fotonové mapování (je zobrazen počet fotonů v jednotlivých mapách) a vlastní rendering. O průběhu sledování paprsku (včetně antialiasingu) je uživatel informován procentem již vypočtených pixelů.
4.2
Formát vstupního souboru
V této kapitole je načrtnut formát definičního XML souboru, který se používá pro popis zobrazované scény. Přehled je spíše informativní a slouží k získání představy, 26
jak je možné scénu definovat. Podrobný výčet všech přípustných parametrů je uveden v příloze A. DTD1 popis je k dispozici na přiloženém CD. Předpokládá se základní znalost technologie XML. Scéna Kořenovým elementem souboru je <Scene>..., do kterého se vkládají všechny ostatní tagy a jeho argumenty se týkají globálního nastavení renderingu (velikost obrázku, parametry použitých algoritmů apod.). Světla Jednotlivá světla se definují uvnitř seznamu ... (tento element seznamu nemá žádné parametry), přičemž je rozlišováno několik druhů svítidel: • Bodové světlo () vyzařuje energii rovnoměrně do všech směrů ze zvoleného místa v prostoru. • Směrové světlo () reprezentuje zdroj ve velké vzdálenosti oproti rozměrům scény, jehož charakter se projevuje pouze v závislosti na směru svícení. Může tak simulovat např. sluneční svit. • Plošné světlo () má obdélníkový tvar a vyzařuje jednou stranou svého povrchu. Díky plošnému charakteru umožňuje zobrazovat měkké stíny těles. • Kuželové světlo (<Spot/>), neboli reflektor, emituje záření do prostorově omezeného úhlu, čímž vzniká kuželová oblast osvitu. Materiály Materiály se definují (stejně jako světla) uvnitř vlastního seznamu <Materials> .... Spektrální materiály mohou být načteny z vnitřní databáze programu <SpectralDB/> či z externího zdroje dat <SpectralExt/>. Materiál podle Phongova modelu není citlivý na spektrální vlastnosti světla a používá ke své reprezentaci barvy v modelu RGB. Speciálním případem materiálů jsou textury, které umožňují kombinovat již definované materiály, případně načíst obrázkovou texturu z externího souboru . Základní textura je třeba šachovnice či mřížka . Tvary Geometrický popis těles se provádí pomocí tvarů, které se přidávají dovnitř seznamu <Shapes>.... Kromě základních tvarů jako je např. koule <Sphere/>, jsou hlavním těžištěm programu tvary definované pomocí trojúhelníkové sítě , které se načítají z vlastních objektových souborů. 1
Document Type Definition — jazyk pro popis struktury XML dokumentů
27
Tělesa Rozmístění jednotlivých objektů po scéně je zajištěno v seznamu .... Každému tělesu se přiřadí již definovaný tvar, materiál a umístění v prostoru. Rozdělením logiky popisu objektů scény na abstraktní tvary a konkrétní tělesa je dosaženo paměťové úspory — komplexní tvar rozsáhlého modelu je uložen v paměti pouze jednou.
Kapitola 5 Dosažené výsledky V této kapitole jsou rozebírány výsledky výpočtů programu. Jednotlivé části obsahují komentáře a diskuzi daného jevu. Vše je doprovozeno ukázkovými obrázky, které byly vypočítány implementovaným programem. Obrázky nebyly dále upravovány v externím editoru, jedná se o čistý výstup aplikace. Příslušné definiční soubory k jednotlivým obrázkům se nacházejí na přiloženém CD.
5.1
Efekt Fresnelových vzorců
Fresnelovy rovnice udávají odrazivost a propustnost materiálu v závislosti na úhlu dopadu paprsku (tedy i na úhlu pozorovatele) a indexu lomu. V běžném životě se tato závislost projevuje např. u hladiny vody. Pozorovatel nízko u hladiny (svírající s její rovinou malý úhel) vidí v dálce jen odražené světlo, kdežto při pohledu kolmo k hladině vidí velmi dobře skrz. Podobně se efekt projeví u lesklé desky pracovního stolu — vzdálenější objekty (pozorované pod menším úhlem k desce) jsou v odlesku zřetelnější, než blízké objekty (větší úhel s deskou stolu). Program umožňuje definovat i materiály počítající s touto vlastností. Závislost rovnic na indexu lomu je vystižena na obrázku 5.1. Protože je index lomu obecně závislý na vlnové délce, projevují se Fresnelovy vzorce i ve spektrálně citlivých materiálech. Což lze pozorovat např. v oblasti totálního odrazu uvnitř diamantů, jak je vidět z obrázku 5.2.
5.2
Objemová absorpce
Pro dosažení realističtějších výsledků renderování diamantů byla implementována jednoduchá objemová absorpce homogenního materiálu. Světlo je na své cestě částečně pohlcováno i uvnitř průhledných těles. Větší objekty se tak zdají být tmavší, než malé objekty vyrobené ze stejného materiálu. Při dopadu na rozhraní disperzního tělesa je zaznamenán první průsečík. Každý další dopad paprsku uvnitř tělesa je postupně přičítán k již uražené dráze (vzdálenost od posledního průsečíku k novému). Výsledný příspěvek paprsku je upraven podle absorbance
29
(a) index lomu 1.0
(b) index lomu 1.2
(c) index lomu 1.5
(d) index lomu 1.7
(e) index lomu 2.7
(f) index lomu 4.7
Obrázek 5.1: Fresnelova odrazivost v závislosti na indexu lomu
Obrázek 5.2: Detail disperze diamantu
30
materiálu na základě Beer-Lambertova zákona (rovnice 2.10). Jelikož navrhované scény neobsahují absolutní měřítko jednotek, je ke každému tělesu přidán koeficient jeho velikosti, který slouží jako relativní součinitel při aplikaci objemové absorpce. Na obrázku 5.3 je zobrazena tatáž krychle, avšak s různými koeficienty velikosti. Materiál je smyšlený a je volen pro názornost absorpce. Reflektance materiálu je téměř konstantní a odpovídá bílé barvě. Absorbance je volena tak, že propaguje zejména vlnové délky z modré oblasti spektra, kdežto ostatní jsou pohlcovány. Index lomu je roven jedné. Na obrázku 5.3a je součinitel velikosti nulový a nedochází k absorpci. Z ostatních obrázků je patrné, že zabarvení průhledných materiálů (skla, diamanty) je způsobeno právě absorpcí.
5.3
Trojúhelníkové sítě
Trojúhelníkové sítě používají jako urychlovací strukturu k -d strom s heuristikou plochy povrchu (podle Havrana [8]). Tato metoda pracuje obecně v O(N log N), kde N je počet trojúhelníků. Tento algoritmus má několik parametrů ovlivňujících rychlost sestavení a kvalitu stromu: • maximální hloubka — rekurzivní algoritmus postupného rozdělování uzlů je ukončen při dosažení uživatelem zvolené maximální hloubky • maximální počet objektů — jakmile je při rekurzi v daném uzlu méně, než daný maximální počet objektů, přestane se dále rozdělovat • ”traversal cost” — parametr povrchové heuristiky, očekávaná náročnost za samotný průchod stromem • ”intersection cost” — parametr povrchové heuristiky, očekávaná náročnost za protnutí těles ve stromě Tyto parametry dramaticky ovlivňují délku výpočtu a paměťovou náročnost stromu. Pro běžného uživatele nejsou moc intuitivní a jejich hodnoty závisí na rozsáhlosti a složitosti použitých geometrických modelů. Havran se tímto problémem více zabýval a na základě svých průzkumů dokonce doporučil některé iniciální hodnoty (viz [7] a [8]). Tyto doporučené hodnoty jsou v programu nastaveny implicitně (tj. nezvolí-li uživatel jinak). V následující části je testována absolutní časová složitost v závislosti na maximální hloubce k -d stromu. Zvolena byla scéna s rozsáhlým (dnes již klasickým) modelem Stanford Dragon, který je složen z 871 414 trojúhelníků (obrázek 5.4). Pro testovací účely byla použita sestava: TM
• Operační paměť: 2048MB DDR2 800MHz Parametry testované scény: • Rozlišení: 800 × 600 pixelů, bez antialiasingu • Maximální počet objektů: 1 31
(a) koeficient 0.0
(b) koeficient 0.2
(c) koeficient 1.0
(d) koeficient 5.0
Obrázek 5.3: Závislost objemové absorpce na koeficientu velikosti tělesa
Obrázek 5.4: Testovaná scéna s modelem Stanford Dragon
32
• Traversal cost: 15 • Intersection cost: 20 Výsledky testu jsou zaneseny do grafů na obrázku 5.5. Pro tuto konkrétní scénu se tak ideální hloubka z hlediska časové složitosti pohybuje mezi 22–26. Je ale jasné, že pro scény požadující více testů na průsečík (odrazy, lom, disperze, globální osvětlení) by bylo lepší postavit k -d strom hlubší a minimalizovat tím čas potřebný k výpočtu kolizí paprsku. 70 s 65 s 60 s 55 s 50 s 45 s 40 s 35 s 30 s 25 s
20 s 15 s 10 s 5s 0s 16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
29
30
31
32
33
34
35
36
maximální hloubka stromu stavba stromu
rendering
(a) Absolutní čas 8 mil. 7 mil. 6 mil. 5 mil. 4 mil. 3 mil. 2 mil. 1 mil. 0 mil. 16
17
18
19
20
21
22
23
24
25
26
27
28
maximální hloubka stromu všechny uzly
listy
(b) Počet uzlů
Obrázek 5.5: Výsledky testování závislosti maximální hloubky k -d stromu
33
5.4
Disperze
Jedním z cílů práce je zobrazení disperzních efektů. Reprezentace spektrálních dat již byla probrána v sekci 3.5, kde bylo rozhodnuto použití rovnoměrného vzorkování spektra. Ukázka disperze je na obrázku 5.6, kde je podkladová mřížka zobrazena přes deformovanou kouli (elipsoid) z disperzního materiálu. Obrázek 5.7 zobrazuje detaily rozloženého světla a ukazuje, že volba 30 vzorků je pro simulaci dostačující. Mírně odlišná barva materiálu při různém počtu vzorků je dána rovnoměrností vzorkování vlnových délek (v každém z výpočtů se tak vyhodnocovala data v jiných vlnových délkách).
Obrázek 5.6: Disperze na kontrastních hranách
5.5
Fotonové mapování
Implementace fotonového mapování přináší různá úskalí, proto je dobré při programování myslet i na zobrazení jednotlivých fotonů uložených v mapě. Stačí např. upravit odhad z fotonové mapy tak, aby odlišnou barvou zobrazoval různé typy fotonů. Na obrázku 5.8 jsou zelenou barvou zobrazeny přímé fotony (první dopad po vyslání ze svítidla) a žlutou barvu mají nepřímé fotony (již několikrát odražené). K vykreslení bylo vysláno 50 000 fotonů, přičemž do fotonové mapy se jich uložilo 141 612 (foton může být na své cestě do mapy uložen vícekrát). Obrázek 5.8d ukazuje jeden z implementačních problémů (nalezení chyby 34
(a) 4 vzorky
(b) 8 vzorků
(c) 16 vzorků
(d) 30 vzorků
Obrázek 5.7: Detail disperze pro různé počty spektrálních vzorků bylo věnováno nemalé úsilí), opravená verze je na obrázku 5.8c. Jednalo se ”pouze”o nechtěnou záměnu ostrosti nerovností < a ≤ při výpočtu vzdálenosti bodu od AABB, tato chyba se následně odrazila v konstrukci k -d stromu fotonové mapy, jejíž zobrazení pak tvořilo ošklivé artefakty a holá místa v nepřímém osvětlení. Jak již bylo řečeno, je možné globální mapu zobrazit přímo, nebo pomocí metody final gathering. Přímé vykreslení samo o sobě nedává přesvědčivé výsledky a neumí vypočítat ostré odrazy a lomy. Také je nutné experimentovat s nastavením fotonového mapování, aby se dosáhlo přijatelného obrázku (viz obrázek 5.9a). Final gathering oproti tomu nabízí kvalitní výpočet. Ve své základní verzi, která je v této práci implementována, je však neúnosně pomalý. Scéna na obrázku 5.10b byla vyrenderována za 1 hodinu a 4 minuty, přičemž je v rozlišení 512 × 512 pixelů s antialiasingem čtvrté úrovně (4 × 4 = 16 paprsků na pixel). Pro final gathering bylo využito 64 difuzních paprsků. Plošné světlo obsahuje 50 vzorků na měkké stíny. I přesto je obrázek mírně zašuměný. Jensen [4] používá až několik set finálních paprsků — avšak v rozšířené verzi algoritmu s tzv. irradiance cache a gradienty, které výpočet rapidně urychlují. Fotonové mapování rozšířené na spektrum dokáže vykreslit disperzní efekty pomocí kaustik. Na obrázku 5.11 je hranol z velice disperzního materiálu (sklo simulované pomocí Sellmeirových koeficientů — SF66 podle Schottova katalogu viz [13]). Svazek světla z plošného zdroje dopadá shora na hranol, kde dochází k disperzi a následnému totálnímu odrazu uvnitř hranolu. Nakonec jsou paprsky lomeny ven a dopadají na černé stínítko. 35
(a) Přímé fotony
(b) Nepřímé fotony
(c) Všechny fotony
(d) Chyba při implementaci
Obrázek 5.8: Zobrazení fotonů z mapy V části 3.7 byly představeny dva algoritmy emise spektrálních fotonů. První vysílá ze světelného zdroje speciální spektrální fotony, které se rozloží na monochromatické až po dopadu na disperzní objekt (obrázek 5.12a). Druhý emituje rovnou monochromatické fotony (obrázek 5.12b). Pro testování druhého algoritmu bylo vysláno 500 000 fotonů, do mapy se jich přitom uložilo 145 413. Rozštěpení spektrálního fotonu na monochromatické, zvyšuje celkový počet fotonů podle počtu vzorků spektra. Z tohoto důvodu bylo v prvním případě vysláno jen 16 400 fotonů, což vedlo k podobnému počtu fotonů uložených v mapě (145 850) a výsledky tak mohou být přibližně porovnány. Detailní výřez (obrázek 5.13) ukazuje nepěkný barevný šum první metody, jedná se o důsledek emise fotonů v náhodných směrech. Emise monochromatických fotonů zaručuje lepší distribuci, protože jsou v náhodném směru ze svítidla vyslány všechny fotony, kdežto u první metody jsou v náhodném směru vyslány pouze primární fotony reprezentující celé spektrum. V tomto případě by bylo nutné vyslat větší počet spektrálních fotonů, což by vedlo k obrovskému počtu fotonů v mapě a tím i ke zvýšeným nárokům na paměť. Z těchto důvodů je uživateli přístupná jen druhá verze emise fotonů, která přináší lepší výsledky a intuitivnější kontrolu počtu fotonů.
36
(a) 50 fotonů v odhadu
(b) 1000 fotonů v odhadu
Obrázek 5.9: Přímé zobrazení fotonové mapy
(a) Samotné sledování paprsku
(b) Final gathering
Obrázek 5.10: Porovnání metod
5.6
Diskuze dosažených výsledků
Cílem této práce bylo implementovat zobrazovací systém pro kreslení spektrálních jevů. Vznikla poměrně rozsáhlá aplikace kombinující metodu sledování paprsku a fotonového mapování. K dosažení realističnosti obrázků byly výpočty stavěny na základě fyzikálních aparátů. Program tak umí simulovat např. absorpci homogenního materiálu, která způsobuje zabarvení barevných skel a diamantů. Reálné množství odraženého a lomeného světla je počítáno pomocí Fresnelových rovnic (neuvažuje se ale polarizace světla). Geometrické modely lze reprezentovat pomocí trojúhelníkových sítí, k jejichž rychlosti výrazně napomohla struktura k -d stromu. Ta je využita i ve fotonovém mapování. Spektrální reprezentace materiálů pomocí jejich odrazivých a absorpčních vlastností spolu s indexy lomů závislými na vlnové délce umožňují modelovat rozklad světla. K výpočtu disperze uvnitř materiálu bylo rozšířeno klasické sledování paprsku. Zavedení spektrálních fotonů umožňuje zobrazit disperzní kaustiky (spektrum na stínítku). 37
Závěr Cílem této bakalářské práce bylo vytvořit systém podporující zobrazení některých spektrálních jevů, zejména disperze a refrakčních kaustik. Na základě fyzikálních podkladů byl navržen světelný model pokrývající požadavky simulace. Po nastudování relevantní literatury vznikla aplikace založená na teoretických poznatcích šíření světla. Výsledkem celého snažení je konzolová aplikace implementovaná ve vývojovém prostředí C++, která umožňuje zobrazení průhledných objektů s materiálovými vlastnostmi závislými na vlnové délce světla. K popisu takových materiálů lze použít laboratorně naměřená data — spektrální charakteristiku reflektance, absorbance a indexu lomu, i zjednodušené modely (např. závislost indexu lomu pomocí Sellmeierovy rovnice). Výpočet je postaven na algoritmu sledování paprsku a na metodě fotonového mapování. Rekurzivní sledování paprsku je použito pro zobrazení zrcadlově lesklých a průhledných objektů, jeho rozšíření pak pro zobrazení disperze pozorované uvnitř samotného materiálu. Fotonové mapy umožňují přesné zobrazení reflekčních a refrakčních kaustik. Jejich rozšíření na spektrum vede k znázornění rozkladu světla vně daného tělesa (tj. např. na stínítku za disperzním hranolem). Nepřímé osvětlení odražené od difuzních materiálů je řešeno jen základní verzí průchodu fotonové mapy (tzv. final gathering), který je sám o sobě časově náročný, případně vede k nepěkným (zašuměným) obrázkům. Jelikož tento charakter šíření světla nebyl cílem bakalářské práce, protože nemá na výsledek požadovaných disperzních efektů téměř žádný vliv, je uveden spíše pro zajímavost jako jednoduchý důsledek algoritmu fotonového mapování. Implementace urychlující struktury k -d strom dovolila použití i geometricky náročnějších modelů složených z několika set tisíc trojúhelníků.
Další vývoj Implementovaný zobrazovací systém poskytuje široké možnosti k dalšímu rozšíření. První z nich je zvýšení výkonu aplikace pomocí paralelizace výpočtu. Jak algoritmus sledování paprsku, tak fotonové mapování umožňují výpočet rozložit na několik na sobě nezávislých výpočtů, které pak mohou být provedeny současně na několika procesorech (či na jednom procesoru s více jádry). Také stavbu k d stromu je možné paralelizovat, což jistě přinese velké zrychlení u objemných modelů a u fotonových map s velkým počtem fotonů. Jak již bylo uvedeno, výpočet nepřímého osvětlení odraženého od matných materiálů nebyl v práci hlouběji zkoumán. Jako řešení přinášející významné urych42
lení se nabízí využití neostrosti přechodů nepřímého osvětlení a to ve formě jakéhosi předvýpočtu ozáření ve významných místech a následná interpolace již vypočtených hodnot (tzv. irradiance caching v kombinaci s gradienty [4]). Další změnou k lepšímu (alespoň z hlediska uživatele) by bylo odstranění velkého množství parametrů fotonového mapování (počet emitovaných fotonů, počet fotonů v odhadu a jejich maximální vzdálenost). Stojí proto k zamyšlení jakým způsobem lze zautomatizovat hodnoty parametrů fotonového mapování pro konkrétní scény tak, aby výsledný výpočet dával přijatelné obrázky s rozumnou časovou náročností. Jinou partií budoucího vývoje je zlepšování fotorealističnosti výsledků. V tomto případě by bylo zajímavé brát při výpočtu v potaz vlastnosti samotného prostředí, kterým se světlo šíří, např. částice, které procházející světlo postupně rozptylují. Výsledné obrázky by pak mohly obsahovat i efekty jako je mlha, kouř, či prašné prostředí. Složitější reálné materiály (např. mramor, vosk, lidská kůže, či mléko) rozptylují světlo i pod svým povrchem, čímž dochází k průchodu světla uvnitř materiálu. To vede k dalšímu možnému rozšíření — zobecnění odrazové funkce BRDF na tzv. BSSDF (Bidirectional Surface-Scattering Distribution Function) [4], která umožňuje odrazit dopadající světlo i v jiném bodě, než v místě dopadu. Celá aplikace by si také zasluhovala okenní verzi, kde by bylo možné interaktivně editovat zobrazovanou scénu a zobrazit zjednodušený náhled bez náročných efektů. Vlastní výpočet by pak bylo možné spustit přímo z tohoto programu. Mohla by také umět vyrenderovat sekvenci několika snímků s odlišnou pozicí kamery — jednoduchou animaci, což by bylo pozoruhodné při zobrazování scény s diamanty, jejichž barevné odlesky se významně liší v závislosti na úhlu pohledu. Jak je vidět, celá tato práce je dosti rozšiřitelná a nápadů k dalšímu vývoji je vždy dost. Osobně jen doufám, že se mi v budoucnu podaří implementovat i další zajímavé efekty.
43
Seznam použité literatury [1] Glassner, Andrew S. An Introduction to Raytracing. Third Printing. Academic Press, Ltd., 1989. ISBN 0-12-286160-4. [2] Glassner, Andrew S. Principles of Digital Image Synthesis. Vol. 1, 2. Morgan Kaufmann Publishers Inc., 1995. ISBN 1-55860-276-3. [3] Pharr, M. - Humphreys, G. Physically based rendering. Second Edition: From Theory To Implementation. Morgan Kaufman, 2010. ISBN 978-0-12375079-2. [4] Jensen, Wann H. Realistic Image Synthesis Using Photon Mapping. A. K. Peters, Ltd., 2001. ISBN 1-56881-147-0. [5] Sun, Yinlong. A Spectrum-Based Framework for Realistic Image Synthesis. Ph.D. Dissertation. Advisor F. David Fracchia. Computing Science, Simon Fraser University, 2000. ISBN 0-612-61686-X. [6] Wilkie, A. - Tobler, Robert F. Werner, P. Raytracing of Dispersion Effects in Transparent Materials. Institute of Computer Graphics, Vienna University of Technology, 2000. [7] Havran, V. Heuristic Ray Shooting Algorithms. Dissertation Thesis. Faculty of Electrical Engineering, Czech Technical University, Prague, 2000. [8] Wald, I. - Havran, V. On building fast kd-Trees for Ray Tracing, and on doing that in O(N log N). SCI Institute, University of Utah - Czech Technical University in Prague, 2006. [9] Möller, T. - Trumbore, B. Fast, minimum storage ray/triangle intersection. ACM SIGGRAPH 2005 Courses. Los Angeles, California, 2005. [10] Mahovsky, J. - Wyvill, B. Fast Ray-Axis Aligned Bounding Box Overlap Tests with Plücker Coordinate. Journal of Graphics Tools: JGT, Vol. 9, No. 1: 35—46, 2004. [11] Whitted, T. An Improved Illumination Model for Shaded Display. Magazine Communications of the ACM, Volume 23 Issue 6, June 1980. [12] Malý, P. Optika. Karolinum, Praha, 2008. ISBN 978-80-246-1342-0. [13] Polyanskiy, M. Refractive index database. 2008–2012. Dostupné na: http://refractiveindex.info/. 44
Příloha A Popis definičního souboru Definiční soubory scény se píší ve formátu XML. Následující přehled uvádí soupis všech možných uzlů schématu. Ke každému uzlu jsou uvedeny jeho atributy včetně hodnot, kterých mohou nabývat. Kompletní DTD popis je k dispozici na přiloženém CD. Pokud není řečeno jinak, jsou rozlišována malá a velká písmenka: názvy uzlů začínají velkými písmenky, názvy atributů většinou malými. Hodnoty atributů mohou být různých typů (čísla, textové řetězce, vektory, . . . ). Pro zjednodušení dalšího popisu je úvodem zavedeno značení formátu jednotlivých typů: Typ Int Float Color String
Bool
Vector Doublet Triplet Enum
Popis celé číslo desetinné číslo RGB barva, trojice tří celých čísel s hodnotami 0-255 oddělená mezerami textový řetězec neobsahující speciální znaky XML (uvozovka ”, pravá špičatá závorka >) logická hodnota: jako pravda se chápe řetězec ”true”(nezáleží na velikosti jednotlivých písmen), jako nepravda jakýkoliv jiný řetězec trojice desetinných čísel oddělená mezerami dvojice vektorů oddělená středníky trojice vektorů oddělená středníky textový řetězec s jednou z předepsaných hodnot (nabývající hodnoty jsou uvedeny u jednotlivých atributů)
Kořenovým uzlem celé hierarchie souboru je element <Scene>, který jako potomky obsahuje uzel nastavení kamery, seznam světelných zdrojů, seznam materiálů, seznam tvarů a seznam vlastních objektů. Jednotlivé parametry renderingu se uvádějí jako jeho atributy.
Popis šířka obrázku v pixelech výška obrázku v pixelech barva pozadí obrázku globální osvětlení ve Phongově modelu maximální hloubka rekurze sledování paprsku minimální důležitost (energie) paprsku
Popis úroveň metody antialiasing práh adaptivního vzorkování antialiasingu
k -d strom scény Atribut kdMaxDepth kdMaxObjects kdCI kdCT
Typ Int Int Float Float
Popis maximální hloubka k -d stromu pro scénu maximální počet objektů v uzlu k -d stromu scény cena za průsečík s tělesem v k -d stromě cena za průchod uzlem k -d stromu
46
Fotonové mapování Atribut GIPhotons
Typ Int
GIPhotonEnergy GIMaxDist
Float Float
GIMaxPhotons
Int
GIDiffSamples caustPhotons
Int Int
caustPhotonEnergy caustMaxDist
Float Float
caustMaxPhotons
Int
A.2
Popis počet emitovaných fotonů do globální fotonové mapy iniciální energie vyslaného globálního fotonu maximální vzdálenost sběru fotonů z globální mapy maximální počet sebraných fotonů při odhadu z globální mapy počet difuzních vzorků pro final gathering počet emitovaných fotonů do kaustické fotonové mapy iniciální energie vyslaného kaustického fotonu maximální vzdálenost sběru fotonů z kaustické mapy maximální počet sebraných fotonů při odhadu z kaustické mapy
Nastavení kamery
Pohled na scénu se definuje pomocí tagu a jeho atributů. Atribut position direction rotate
Typ Vector Vector Vector
upVector lookAt
Vector Triplet
perspective
Bool
FOV
Float
A.3
Popis umístění kamery v prostoru směr pohledu reprezentuje otočení kamery o určitý úhel v osách X, Y, Z vertikální osa kamery, vektor směřující nahoru od ní nastaví parametry kamery najednou, jednotlivé složky zleva: position, direction, upVector hodnota true (implicitní), znamená perspektivní kameru, false pak ortogonální projekci zorný úhel objektivu
Světelné zdroje
Zdroje světla se dělí na několik typů, každý z nich musí být v konfiguračním souboru vložen do seznamu světel — element .... Společné atributy všech zdrojů jsou:
47
Atribut intensity source
Typ Float Enum
diffuse specular useShadows attenuation
Color Color Bool Vector
Popis intenzita vyzařování zdroje název spektrálního rozložení intenzity z databáze programu barva difuzní složky vyzařování (pro RGB zdroje) barva lesklé složky vyzařování (pro RGB zdroje) zdroj vrhá stíny, pokud je hodnota true útlum světla, první složka vektoru je konstantní koeficient, druhá lineární, třetí kvadratický (v závislosti na vzdálenosti od světla)
Názvy spektrálních rozložení intenzity v databázi programu (hodnoty parametru source): Název D65 A Cornell
Popis sluneční světlo při zatažené obloze, 6500K podle CIE světlo typické wolframové žárovky v domácnosti podle CIE původní zdroj světla scény Cornell Box (používá se k porovnání výsledků v počítačové grafice)
Bodový zdroj Bodový zdroj šíří světlo rovnoměrně do všech směrů. Atribut position
Typ Vector
Popis pozice bodového zdroje
Směrový světelný zdroj Zdroj světla ve velké vzdálenosti od celé scény (vliv je tak závislý pouze na jeho směru). Atribut direction
Typ Vector
Popis směr svícení vzdáleného zdroje
Plošný světelný zdroj Plošný zdroj světla ve tvaru obdélníku, umožňující zobrazovat měkké stíny. Atribut position direction rotate width height softShadows wCells hCells cellDensity
Typ Vector Vector Vector Float Float Bool Int Int Int
Popis pozice plošného zdroje směr svícení plošného zdroje vektor otočení plošného zdroje šířka plochy zdroje výška plochy zdroje true — tvoří měkké stíny počet buněk ve směru šířky počet buněk ve směru výšky počet paprsků vyslaných k jedné buňce 48
Reflektor <Spot/> Kuželový zdroj světla. Atribut position direction inner outer falloff
A.4
Typ Vector Vector Float Float Float
Popis pozice reflektoru směr svícení reflektoru vnitřní úhel svícení (plně osvětlená část) vnější úhel svícení (kde dochází postupně k útlumu) koeficient útlumu směrem k vnějšímu úhlu
Materiály
Jednotlivé materiály jsou definovány uvnitř materiálového seznamu <Materials> .... Všechny materiály mají společné některé atributy: Atribut name reflectivity transparency useFresnel shininess
Typ String Float Float Bool Float
Popis název materiálu pro pozdější odkazování součinitel materiálové odrazivosti (typicky 0-1) součinitel materiálové propustnosti (typicky 0-1) použití Fresnelových vzorců při hodnotě true exponent matnosti osvětlovacího modelu
Phongův materiál Klasický Phongův model materiálu, jehož atributy jsou: Atribut diffuse specular ambient IOR
Typ Color Color Color Float
Popis barva difuzní složky materiálu barva lesklé složky materiálu barva globální složky materiálu pevná hodnota indexu lomu
Spektrální materiály Materiál z databáze programu <SpectralDB/> Spektrální materiály z databáze programu mají již určeny hlavní vlastnosti, parametry společné všem materiálům (viz výše) lze ale upravovat. Atribut source
Typ Enum
Popis název materiálu v databázi, seznam hodnot je uveden níže
Vlastní spektrální materiál <SpectralExt/> Další možnost je definovat vlastní spektrální materiál s atributy: Atribut dispersive IORSell
Typ Bool Doublet
IORFixed IORFile
Float String
reflectanceDB reflectanceFile
Enum String
absorbanceFile
String
Popis true pro disperzní materiál aproximace indexů lomů pomocí Sellmeirových koeficientů, první vektor dvojice reprezentuje koeficienty B1,2,3 , druhý vektor koeficienty C1,2,3 pevná hodnota indexu lomu cesta k textovému souboru s indexy lomů podle vlnových délek reflektance z databáze programu cesta k textovému souboru s hodnotami reflektance podle vlnových délek cesta k souboru s hodnotami absorbance podle vlnových délek
Formát souborů s externími daty je stejný — na každém řádku se nachází dvojice hodnot Float oddělených mezerou. První číslo reprezentuje vlnovou délku v nanometrech, druhé příslušnou datovou informaci. Dvojice musí být uspořádány vzestupně podle vlnové délky. Reflektance v databázi programu jsou z tabulky barev Macbeth Color Checker a jejich barvy odpovídají českému překladu anglických výrazů. Přípustné hodnoty jsou tvaru ”MacbethName”kde Name je jeden z následujících řetězců: White, Black, DarkSkin, LightSkin, BlueSky, Foliage, BlueFlower, BluishGreen, Orange, PurplishBlue, ModerateRed, Purple, YellowGreen, OrangeYellow, Blue, Green, Red, Yellow, Magenta, Cyan, Neutral080, Neutral065, Neutral050, Neutral035. Např. MacbethYellow pro reflektanci odpovídající žluté barvě.
50
Textury Textury jsou v programu chápány jako druh materiálu, což přináší různé výhody (např. je možné je vzájemně kombinovat). Proto jsou také definovány uvnitř materiálového seznamu <Materials>.... Textura ze souboru Obrázková textura má stejné parametry jako Phongův materiál, navíc se definuje soubor obrázku: Atribut source
Typ String
Popis cesta k souboru obrázku textury
Šachovnice Textura šachovnice umožňuje kombinovat dva dříve (v definičním souboru výše) definované materiály: Typ String String Float
Atribut material1 material2 frequency
Popis název materiálu — první části šachovnice název materiálu — druhé části šachovnice frekvence šachovnice
Mřížka Textura mřížky kombinuje, podobně jako textura šachovnice, dva materiály: Atribut material1 material2 frequency gridFactor
A.5
Typ String String Float Float
Popis název materiálu — první části mřížky název materiálu — druhé části mřížky frekvence mřížkování faktor ovlivňující tloušťku mřížky
Tvary
Seznam <Shapes>... slouží k reprezentaci jednotlivých tvarů. Každý tvar může být v programu využit pro více konkrétních těles (instancí), což přináší paměťovou úsporu pro objemné trojúhelníkové modely. Společným atributem všech tvarů je jejich název ve scéně: Atribut name
Typ String
Popis název tvaru pro pozdější odkazování
Koule <Sphere/> Atribut position radius
Typ Vector Float
Popis poloha středu koule v prostoru poloměr koule 51
Prstenec Jedná se o tvar dutého válce s počáteční polohou v začátku souřadnic a podstavami kolmými na osu Y. Atribut radius min max
Typ Float Float Float
Popis poloměr prstence spodní ypsilonová souřadnice prstence vrchní ypsilonová souřadnice prstence
Trojúhelníkový tvar Množina trojúhelníků tvořící složený tvar. Konkrétní popis tvaru je brán z externího souboru. Atribut file
Typ String
interpolateNormals
Bool
flipNormals
Bool
kdMaxDepth kdMaxObjects
Int Int
kdCI
Float
kdCT
Float
Popis cesta k .obj souboru, tento atribut musí být uveden před následujícími parametry pravdivá hodnota zaručí interpolaci normálových vektorů (zdánlivou hladkost modelu) hodnota true obrátí směr normál plošek tvaru maximální hloubka k -d stromu modelu maximální počet trojúhelníků v uzlu k -d stromu modelu cena za průsečík s tělesem v k -d stromě modelu cena za průchod uzlem k -d stromu modelu
Definiční soubor trojúhelníkové sítě je psán ve formátu Wavefront .obj (pro účely programu značně zjednodušeném). Jedná se o textový soubor s hodnotami oddělenými mezerami, či jinými bílými znaky, jehož syntaxe je následující: první část obsahuje informace o vrcholech modelu ve formátu ”v X Y Z”, kde X, Y a Z jsou jednotlivé souřadnice vrcholu (Float). Následně může být uveden seznam texturovacích souřadnic U, V ve formátu ”vt U V”. Poslední část obsahuje jednotlivé trojúhelníky zapsané jako ”f V1 /T1 V2 /T2 V3 /T3 ”, kde V1 , V2 a V3 jsou indexy vrcholů typu Int (počítáno od jedné tak, jak se v souboru objevují) a T1 , T2 a T3 jsou indexy texturovacích souřadnic typu Int (číslováno taktéž od jedničky). Texturovací souřadnice mohou být (i s lomítkem) vynechány.
A.6
Tělesa
V seznamu ... se nachází definice jednotlivých objektů — instancí tvarů (seznam s tvary musí být definovaný dříve než seznam s objekty). Entitami tohoto seznamu jsou elementy , které mohou mít následující atributy:
52
Atribut shape material translate rotate scale
Typ String String Vector Vector Vector
castsShadows
Bool
size
Float
Popis název použitého tvaru název materiálu vektor posunutí objektu vektor otočení objektu kolem jednotlivých os měřítko objektu v jednotlivých osách (hodnoty z intervalu (0, 1) definují zmenšení, hodnoty větší než jedna objekt zvětšují) pravdivá hodnota, pokud těleso stíní procházejícímu světlu koeficient velikosti objektu pro efekt objemové absorpce
53
Příloha B Programátorská dokumentace B.1
Rozvržení zdrojového kódu
Zdrojový kód programu je rozvržen do hlavičkových a zdrojových souborů C++. Jednoduché či méně složité třídy jsou rovnou implementovány v hlavičkových souborech. Rozsáhlejší třídy mají svou implementaci ve stejnojmenném zdrojovém souboru s příponou .cpp. Všechny soubory jsou rozděleny do několika složek: • camera — soubory definující kameru (pohled na scénu) • expat — zdrojové soubory externího XML parseru • geometry — popis geometrie tvarů, AABB, k -d strom a třída obsahující geometrické informace o průsečíku s tělesy • IL — soubory externí obrázkové knihovny DevIL • image — vlastní reprezentace obrázku v paměti a definice RGB barvy • material — definice materiálů, textur a databáze spektrálních materiálů • math — matematické jádro, operace s vektory, body, transformace pomocí matic, jednoduché matematické funkce a konstanty • parser — načítání scény v XML formátu • photon — definice fotonů, fotonové mapy s příslušnými algoritmy • scene — uchování scény a jejich objektů, hlavní smyčka výpočtu • spectrum — reprezentace spektrálních dat Soubor main.cpp s hlavní funkcí programu se nachází ve stejné složce jako složky s ostatními zdrojovými soubory.
54
B.2
Objektový model
Celá aplikace je psána ve stylu objektového programování a skládá se z několika objektů (třídy a struktury). Většina z nich je navržena velmi prostě a k pochopení stačí letmé prohlédnutí kódu s příslušnými komentáři (to se týká zejména objektů matematického jádra — vektory, body, transformační matice apod.). V následující části proto budou podrobněji rozepsány pouze objekty, jejichž logika je složitější, a objekty, které mají pro program větší význam a jejich pochopení je nezbytné.
Spektrální data Definice spektrálních dat se nacházejí v souboru specData.h. Třída CoeficientData ukládá číselné hodnoty do pole o fixní velikosti nSamples. Definuje základní aritmetické operace nad daty stejného rozsahu. Od ní dědí třída SampledData, která se stará o rovnoměrně navzorkovaná data spektra a proto obsahuje navíc metody pro převod indexu pole na příslušnou vlnovou délku nmOf(int index) a převod z vlnové délky na index pole indexOf(float wavelength). Třída SpectralData se stará o uchování samotných spektrálních dat, obsahuje funkci pro převod z vzorkovaného spektra FromSampled, ale její obecnost umožňuje budoucí rozšíření, které nemusí být závislé na rovnoměrném vzorkování. Od této třídy dědí třída SPD, která slouží pro reprezentaci emisního spektra svítidel, dále třída SpectralReflectance (reprezentuje spektrální reflektance materiálů a zajišťující převod na RGB) a třída RGB2Spec (odhaduje spektrální reflektanci na základě RGB barvy). Rozvržení je na obrázku B.1.
Obrázek B.1: Diagram spektrálních dat
Světla Abstraktní třída Light, která poskytuje obecnou reprezentaci svítidel se nachází v souboru light.h (implementace pak v light.cpp). Jejím srdcem je metoda Shade, která počítá osvětlení na základě místa dopadu a incidenčního úhlu. Podobně postupuje metoda ShadeSpectral, která počítá osvětlovací model spektrálně citlivých materiálů. Konkrétní implementace světel (nacházejí se v
55
lights.h) obvykle sdílí ten samý model výpočtu. Nicméně je v praxi nutné přepsat metody RandomPosition, RandomDirection, které vrací náhodnou pozici a směr (např. pro foton při mapování). Funkce IlluminatedP vrací, zda je konkrétní bod v prostoru osvětlen daným svítidlem (hodí se jí proto přepsat u složitějších světel). Jednotlivé druhy svítidel je tak možné jednoduše upravovat a přidávat. Schéma základní verze je na obrázku B.2. Spektrální verze navíc implementují spektrální rozložení intenzity třídy SpectralLight.
Obrázek B.2: Diagram rozvržení svítidel
Materiály Definice materiálů se nachází v souboru material.h. Je zde abstraktní třída Material, která umožňuje manipulaci jak s Phongovským modelem (metody EvalDiffuse, EvalSpecular, EvalAmbient), tak se spektrálními daty (GetReflectance, GetAbsorbance). Při vytváření vlastních materiálů se přepisuje funkce isSpectralSensitive pro spektrální materiály, aby vracela hodnotu true. Pro textury složené z několika různých materiálů je nutné přepsat metodu isComposite. Protnuté těleso díky tomu rozpozná, jaký materiál má vrátit. Schéma implementovaných materiálů se nachází na obrázku B.3.
Tvary Abstraktní deklarace tvaru se nachází v souboru shape.h (složka geometry), sama o sobě je velmi jednoduchá a umožňuje snadné obohacení programu novými tvary. Stačí podědit od třídy Shape a přepsat následující metody: • ObjectBound() — vrací hranice tvaru ve formě AABB v modelových souřadnicích 56
Obrázek B.3: Diagram implementovaných materiálů • Intersect(const Ray& ray, float* tHit, float* rayEpsilon, HitData* hitData) — počítá průnik paprsku s daným tvarem, přičemž je nutné doplnit informace o průsečíku, pokud existuje • IntersectP(const Ray& ray) — predikát, který určuje, zda paprsek protnul daný tvar (slouží například pro stínové paprsky), bližší informace nejsou požadovány, proto může být implementován rychlejším algoritmem Obrázek B.4 zobrazuje implementované tvary.
Obrázek B.4: Geometrické tvary
Tělesa Tělesa ve scéně navrhuje třída Object, která se stará o jejich tvar a materiál. Logika návrhu je na obrázku B.5 ShapeObject vytváří těleso pomocí již definovaného tvaru. TransformableObject navíc umožňuje transformace tvarů a tím i jejich instanciaci ve scéně, zároveň se stará o převod souřadnic scény do modelových souřadnic vlastního tvaru.
57
Obrázek B.5: Logika těles scény
Fotony Fotony reprezentuje třída Photon, která kvůli úspoře místa obsahuje pouze nejnutnější položky. Jelikož je nutné reprezentovat několik druhů fotonů, obsahuje každý foton ukazatel na abstraktní třídu PhotonEvaluator, jejíž implementace EvaluatorRGB, EvaluatorSpectrum a EvaluatorMono vyhodnocují interakci fotonu v závislosti na svém typu (RGB foton, foton reprezentující celé spektrum záření a monochromatický foton příslušné vlnové délky).
B.3
Důležité metody
Renderovací smyčka Hlavní metoda výpočtu Render() se nachází ve třídě Scene. Předpokládá předchozí načtení scény pomocí třídy Parser. Po inicializaci (připravení projekčních map a paměti pro obrázek) volá metodu RenderRegion, která zajišťuje vrhání paprsků pixely daného regionu — funkce TracePixel. Ta zajišťuje výpočet směru paprsku, který je následně vyslán metodou RayCast. Uvnitř této funkce se nachází hlavní jádro výpočtu — nalezne se průsečík, spočítá se osvětlení podle daného modelu a případně se pošle paprsek rekurzivně dál. Je-li potřeba, je zavolána metoda RayCastSpectral, která zajišťuje obdobný výpočet, ovšem pro monochromatický paprsek. Obě metody by mohly být sloučeny do jedné, jejich rozdělení však zvyšuje přehlednost kódu.
Fotonové mapování Implementace fotonového mapování se nachází v souborech ve složce photon. Jedná se o definici fotonu (photon.h) a k -d strom (photonKD.h), který je speciálně navržený pro fotonové mapy (úspornější ukládání uzlů a algoritmus sestavení stromu pomocí mediánu, nikoliv SAH). Jádro výpočtu se nachází v souboru photonMap.cpp, kde je integrována struktura dvou nezávislých fotonových map 58
— kaustická mapa a globální. Dále jsou tu hlavní algoritmy pro výstavbu mapy (metody BuildCausticMap a BuildGIMap), které rozvrhnou počty fotonů a vyšlou je pomocí TraceCausticPhoton a TraceGlobalPhoton. Poslední dvě funkce obsahují rekurzivní algoritmus šíření fotonů scénou. Finální odhady v druhé fázi se počítají funkcemi CausticEst, RadianceEst a IrradienceEst. Funkce TestEst slouží pouze pro ladicí účely a umožňuje zvolením vhodných parametrů zobrazit fotony uložené v mapě.
59
Příloha C Obsah přiloženého CD Součástí této práce je i CD, na kterém se nachází zdrojové kódy programu, přeložená spustitelná aplikace a několik vzorových scén a obrázků. Struktura souborů na CD je následující: • Code — soubory pro překlad v Microsoft Visual Studio 2010 • Code/src — vlastní zdrojové kódy • Diagrams — diagramové obrázky z textu práce • doxygen — generovaná programátorská dokumentace • Scenes — vstupní XML soubory použité pro obrázky v této práci • Scenes/Images — vypočtené obrázky z aplikace použité v textu • SpectralRenderer — spustitelný soubor .exe pro operační systém Windows (včetně nezbytných knihoven) • text.pdf — elektronická verze textu této práce • xmlformat.dtd — DTD definice použitého XML formátu