Úloha 088: Hloubka ostrosti objektivu

Úkolem je implementovat hloubku ostrosti objektivu pro Ray-tracing tak. Jde o napodobení jevu na reálných čočkách (objektivech), kdy je dokonale ostře vykeslována pouze rovina zaostření. Kvůli sbíhání paprsků z otvoru objektivu jsou ostatní partie scény neostré (implementační technika se nazývá "distribuované sledování paprsku").

DepthOfField extrémní hloubka ostrosti v 3D scéně

Koncepce

Zabudujte svůj mechanismus do již existujícího frameworku (ray-tracing s interním vzorkováním řízeným anti-aliasingem - viz globální "thread-specific" proměnné MT.rank a MT.total) tím, že přeprogramujete generátor paprsků - objekt s interface ICamera. Váš nový generátor paprsků bude schopný dle nastavení generovat pro jeden pixel celý svazek paprsků vycházejících z povrchu čočky (aperture). Můžete rovněž implementovat různé zajímavé "stopy rozostření", tzv. bokeh.

Náměty

Stačí implementovat chování světla mimo fotoaparát (paprsky začínají na vnějším okraji první čočky), není potřeba simulovat vnitřek objektivu/fotoaparátu. Pár ilustračních obrázků najdete ještě na WiKi stránce DOF nebo v slideshow distributedrt.pdf. Stránka o sektorové cloně.

Základ

Jako základ poslouží projekt 048rtmontecarlo nebo 048rtmontecarlo-script z repository grcis.

Detaily

Do generátoru paprsků zabudujte tzv. interní vzorkování - korektní reakci na globální hodnoty MT.rank a MT.total. Zvolte si vhodné vzorkování na kruhu (povrch čočky), např. nějakou podobu jitteringu nebo Mitchellova algoritmu. Detaily o interním vzorkování viz grcis-rt.pdf (Independent stratified sampling).
Při použití můžete počítat s nastavením dostatečně velkého faktoru převzorkování MC.total ("Supersampling" - primárně řízeno anti-aliasingem).

Co modifikovat

Do zdrojového souboru MonteCarloRT.cs přidejte Vaši implementaci kamery - je vhodné se inspirovat třídou StaticCamera a změnit zejména metodu bool GetRay ( double x, double y, out Vector3d p0, out Vector3d p1 ). Váš generátor paprsků vložte do vhodné definice scény (viz class CustomScene .. nebo do CS-scriptu definujícího scénu).

Je potřeba ukázat hloubku ostrosti vhodným nastavením světelnosti simulovaného objektivu, ocením několik různých příkladů - ukázkové scény vkládejte do list-boxu (viz funkce InitializeScenes()). Za pěkné příklady scén můžete dostat bonusové body.

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: 20 bodů (funkční distribuce primárních paprsků, rozumná demonstrace v ukázkové scéně),
až 8 bodů: bonus za pokročilejší efekty na cloně (zajímavý bokeh apod.)

Projekt

Visual Studio projekt: 048rtmontecarlo 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) 2016-2018 J.Pelikán, last change: 2018-05-09 23:40:39 +0200 (Wed, 09 May 2018)