Ú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 parametry rank a 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 049distributedrt z repository grcis. Je připravena aplikace, která v jednoduchém okně zobrazuje obrázek spočítaný ray-tracingem. Definice scény je v kódu, tu budete muset pro testování Vašeho nového generátoru paprsků upravit.
Pro doplnění Vaší implementace použijte zdrojový soubor DistributedRT.cs, do něj budete psát Váš nový kód a nakonec mi jej odevzdáte. Najdete tam i příklad definice scény (CustomScene) nebo možnost nastavit počáteční parametry formuláře (InitializeScenes()).

Detaily

Do generátoru paprsků zabudujte tzv. interní vzorkování - korektní reakci na předávané hodnoty rank a 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í total ("Supersampling" - primárně řízeno anti-aliasingem).

Co modifikovat

Do zdrojového souboru DistributedRT.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, int rank, int total, RandomJames rnd, out Vector3d p0, out Vector3d p1 ). Váš generátor paprsků vložte do vhodné definice scény (viz class CustomScene).

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 DistributedRT.cs, případně pár spočítaných obrázků.

Termín

Odevzdat do: 5. 6. 2016

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.),
dalších až 5 bodů: bonus za zajímavé demonstrační scény..

Projekt

Visual Studio projekt: 049distributedrt.

Zdrojový soubor

Modifikujte a odevzdejte soubor: DistributedRT.cs
Do komentáře na první řádce napište své jméno!


Copyright (C) 2016 J.Pelikán, last change: 2016-04-27 12:15:22 +0200 (Wed, 27 Apr 2016)