Úloha r9: Irradiance Caching

Úkolem je naimplementovat a otestovat zjednodušenou verzi algoritmu irradiance caching pro výpočet difúzní komponenty nepřímého osvětlení. Algoritmus by měl být zaměnitelný za modul RayTracing, tj. musí implementovat interface ImageFunction za podmínky, že jednotlivé primární paprsky (vzorky v daném pixelu) bude generovat externí sampler, např. JitteringSynthesizer.

Použitá metoda: irradiance caching bez použití gradientů irradiance. Počítá se pouze jeden odraz nepřímého osvětlení, tj. pro průsečíky sekundárních paprsků (generovaných vzorkováním hemisféry při výpočtu záznamu cache) se vypočte a vrátí pouze přímé osvětlení.

Postup práce: V první řadě budete potřebovat zprovoznit výpočet irradiance v daném bodě vzorkováním hemisféry (tj. distribuovaným ray-tracingem). Krom odhadu irradiance by vám pro účely irradiance cachingu měla tato metoda vracet i harmonický průměr, resp. minimum (oboje funguje dobře) délek vržených paprsků, tj. hodnotu Ri, která se používá v interpolačních vzorcích. Pro průsečík každého takto vygenerovaného paprsku se spočítá difúzní komponenta přímého osvětlení (interpolace v irradiance cachingu nefunguje dobře, pokud by se počítalo přímé osvětlení včetně lesklé komponenty). V dalším kroku implementujte algoritmus pro interpolaci irradiance a "líný" výpočet nových hodnot irradiance v případě, že interpolace není možná. Tento krok můžete (pro malé obrázky) odladit bez použití akcelerační datové struktury (octree) testováním veškerých záznamů v cache. V posledním kroku pak přidejte octree pro urychlení dotazů do cache. Ujistěte se, že výsledky s a bez použití octree jsou identické. Zde můžete najít rady v případě, že se algoritmus nebude chovat tak, jak byste chtěli.

3D scéna: měla by obsahovat tělesa/materiály, na kterých bude poznat korektní výpočet nepřímého difúzního osvětlení. Pro začátek je možné použít soubor data/sceneAreaDof.jgl, můžete u něj zvětšit plošný zdroj a změnit odrazivost bočních stěn (původně zrcadla).

Porovnání výsledků: porovnejte výsledky základního distribuovaného ray-tracingu (bez interpolace) s výsledky irradiance cache co do kvality výsledného obrázku a času výpočtu. Jaké urychlení přináší irradiance caching při takovém nastavení algoritmu, při kterém nejsou na první pohled viditelné žádné rozdíly v obrázcích? Připravte stručnou zprávu s výsledky testů.

Výsledky: je třeba poslat všechny zdrojové soubory, které vzniknou nebo které upravíte. Pozor! Kód musí být komentovaný - bez komentářů je kód nepřijatelný (tj. jako by úloha nebyla odevzdána). Dále odevzdáte zapojení, která se vám osvědčila, včetně datových souborů (popis scény). Pak také zprávu se stručným popisem implementace a s výsledky testování algoritmu. Zpráva je, stejně jako komentovaný kód, nedílnou součástí práce, tj. úloha bez zprávy jako by nebyla.

Bonusové body lze získat za rozšíření základního algoritmu v jednom z následujících směrů:
- výpočet několika odrazů nepřímého osvětlení rekurzivní aplikací algoritmu irradiance caching
- zprovoznění gradientů irradiance
- implementace a otestování heuristiky neighbor clamping

Užitečný odkaz: Practical Global Illumination with Irradiance Caching

TERMÍN: do 27. 2. 2011

TRIVIÁLNÍ MODUL: class cz.cuni.jagrlib.piece.RayTracing (jenom pro představu, budete ho dost měnit)

INTERFACE: ImageFunction

ZAPOJENÍ: sRayTracingJitter.xml, sRayTracingBest.xml, ...

3D SCÉNA: data/sceneAreaDof.jgl, ale doporučujeme modifikovat ji a/nebo si udělat jiné, průkaznější..


[Cvičení NPGR010]  [Projekt JaGrLib]  [Přednášky a semináře]  [Odkazy na demonstrace]

Valid XHTML 1.1 Copyright (C) 2010 J.Pelikán, last change: $Date: 2010-11-15 14:00:15 +0100 (Mon, 15 Nov 2010) $
Send comments/requests to pepca.at.cgg.mff.cuni.cz