Úloha 065: Efektivní parametrická plocha pro ray-tracing

Úkolem je implementovat obecnou parametrickou plochu a výpočet paprsku s ní dostatečně optimalizovat pomocí vhodné urychlovací metody. Předpokládá se, že podle parametrického předpisu vytvoříte dostatečně jemnou trojúhelníkovou síť a tu pak budete protínat paprskem..

parametric surface

Základ

Základem poslouží projekt 048montecarlo nebo 048rtmontecarlo-script z repository grcis. Je připravena aplikace, která umí počítat obrázek dané scény s použitím konfigurovatelného sledování paprsku a volitelného paralelismu (multi-core CPU). V případě druhého projektu se dají definice scéna načítat z externích souborů (CS-script).

Relevantní interface a třídy

  • ISolid - obecný interface pro tělesa, která se umí protnout paprskem. Tento interface musí implementovat Vaše nová třída.
  • Sphere - konkrétní implementace jednoduchého tělesa, zde si všimněte, co všechno musíte i Vy implementovat.
  • Expression - aritmetický výraz umožňující dosazovat hodnoty proměnných a opakovaně efektivně výraz vyhodnocovat (viz NCalc.dll).

Pokud použijete definici scény CS-scriptem (projekt 048rtmontecarlo-script), nemusíte se vyhodnocováním výrazu zabývat, použijte k definici parametrických funkcí lambda-výrazy.

Co modifikovat

Ve zdrojovém souboru MonteCarloRT.cs založte novou třídu public class Parametric : DefaultSceneNode, ISolid a do ní napište svoji implementaci (inspirace viz class Sphere).
Do definice scény (CustomScene) přidejte Vaše těleso/tělesa, možná budete potřebovat modifikovat i polohu kamery, světelné zdroje, materiály, apod. Pokud budete mít více ukázkových scén, nechte je všechny funkční a do listboxu přidejte další položky, aby se dalo vše pohodlně zkoušet bez nutnosti překládat program (viz inicializační funkci InitializeScenes()). Konstrukční funkci se předává textový parametr Param: z formuláře.

Vaše nové těleso musí mít v konstruktoru možnost zadat symbolické vzorce definující povrch (plochu). Budou to tři funkce: x = x(u,v), y = y(u,v) a z = z(u,v). Pro jednoduchost zafixujeme definiční obor parametrů u, v na interval <0.0,1.0>. K vyhodnocování výrazu použijte externí knihovnu NCalc.dll, viz např. úlohu 059 a příslučný projekt v repository.

Pokud využijete možnosti definovat scénu CS-scriptem, použijte projekt 048rtmontecarlo-script a popis scény vložte do nového .cs souboru (inspirace viz vestavěné scény z adresáře data/rtscenes/ a návod ke skriptování). I do skriptu je předáván textový parametr Param: z formuláře.

Náměty

Parametrickou plochu rozložit na velký počet maličkých trojúhelníků, ty potom efektivně protínat paprskem za pomoci některé urychlovací techniky: KD-tree nebo R-tree (BVH), případně Octree (oktantový strom). Varianty stromů s duplicitou jsou KD-tree a Octree, R-tree duplicitní trojúhelníky nesmí obsahovat. Používejte "bucket-tree", tj. listy s maximálně N trojúhelníky, např. 2 <= N <= 16 (nejlepší je deklarovat N jako konstantu a diskutovat její vliv na rychlost výpočtu).

Pozor: Váš kód musí být re-entrantní, protože se bude pouštět v paralelním prostředí! Do objektu parametrické plochy si nesmíte ukládat žádné pomocné hodnoty (specifické pro konkrétní instanci paprsku). Urychlovací struktoru (strom) musíte postavit na začátku, při inicializaci, pak už bude (pro jednotlivá výpočetní vlákna) sdílená a "read-only".

Geometrická podpora

Ve třídě Geometry jsou pro Vás připraveny užitečné metody: RayTriangleIntersection(), RayBoxIntersection() resp. RayBoxIntersectionInv(). Ty používejte k získání průsečíku paprsku s jednotlivým trojúhelníkem nebo obalovým kvádrem (AABB).
Nezapomeňte inkrementovat čítače CSGInnerNode.countBoundingBoxes resp. CSGInnerNode.countTriangles počítající výpočty průseku paprsku s obalovým kvádrem resp. s jednotlivým trojúhelníkem.
Podobná úloha v minulosti (urychlování průsečíku se sítí trojúhelníků): 050, grcis projekt 050rtmesh. Tam také najdete jednoduché ukázky výpočtu průsečíku paprsku s trojúhelníky..

Literatura

Nejen pro pokročilé:

Co odevzdat

Musíte poslat zdrojový soubor MonteCarloRT.cs. Pokud chcete, můžete připojit několik pěkných výsledných obrázků.
Případný script definující scénu přiložte jako další soubor.

Termín

Odevzdat do: 1. 7. 2018

Body

Základ: 30 bodů (obecná plocha zadaná vzorečky, rozumná rychlost výpočtu, fungující stínování a odrazy - normálové vektory),
Bonus: za použití zajímavých ploch, za efektivitu výpočtu, konfigurovatelné 2D texturové souřadnice.

Projekt

Visual Studio projekt: 048montecarlo nebo 048rtmontecarlo-script.

Zdrojový soubor

Modifikujte a odevzdejte soubor: MonteCarloRT.cs
Do funkce InitializeScenes() zadejte své vlastní jméno!
pokud definujete scénu scriptem, přiložte příslušný .cs soubor,
pokud spočítáte nějaké hezké obrázky, můžete je v menším rozlišení přiložit.


Copyright (C) 2013-2018 J.Pelikán, last change: 2020-05-16 23:04:24 +0200 (Sat, 16 May 2020)