Лекция 10::Задача 2

Адаптивно семплиране на RectLight

На моята машина, boxed.fmiray се рендерира за 41s при 4х4 семплиране на RectLight-а. Но картинката не е достатъчно добра, има забележим шум в полусенките. При 8х8 семплиране шумът изчезва, но времето за рендериране се увеличава четирикратно. Същевременно, подобрението е само в областта на полусенките, а те заемат малка част от картинката. Идеята на адаптивното семплиране е, почвайки с груба семплираща схема (например 4х4), да установим дали сме изцяло в осветена или неосветена част (т.е. дали всичките 16 семпъла са едновременно в сянка или едновременно извън сянка). Ако не е такъв случая, приемаме, че сме в полусянка и повтаряме (акумулираме) 4х4 семплиращата схема още няколко пъти (например още 3 пъти - така ще имаме общо 64 семпъла, т.е. толкова, колкото имаше и 8х8 схемата*), за да получим по-точен (безшумен) резултат.

За да генерализираме алгоритъма, ще въведем външен параметър refinementPasses (вкарайте го в GlobalSettings). Вътре в phong и flat шейдърите, за всяка лампа, ще повторим акумулацията на семплите refinementPasses на брой пъти. За да реализираме горния "shortcut", на първия пас ще събираме статистика за броя "сенчести" семпъла (ако цветът, който getLighting връща е 0, значи е сянка). Ако накрая на първия пас сме акумулирали 0 или numSamples "сенчести" семпъла, може да прекратим семплирането без допълнителни пасове.

Промените трябва да направите в Phong и Flat класовете (самите промени са идентични за двата случая).

При тези конкретни настройки (4х4 семплиране и 4 refinementPasses) сцената отнема само между 40 до 50% от времето за 8х8 схема, при това без забележима деградация в качеството на полусенките. Можете да проверите и какъв ще е резултатът при 3x3 семплиране със 7 refinementPasses.


--
* с тази разлика, че имаме 4x4 stratified sampling, вместо 8х8, т.е. не е теоретически оптимално.

Comments

Може ли малко хелп? Въпросът

Може ли малко хелп? Въпросът ми е как точно ползваме refinementPasses и къде се събират семплите в сянка?

В computeColor метода на Flat

В computeColor метода на Flat и Phong класовете. Трябва да опаковате вътрешния цикъл (който събира nSamples на брой семпъла от светлинния източник) в един външен цикъл с refinementPasses на брой итерации. На първата итерация от този цикъл, в по-вътрешното цикълче трябва да събирате статистика колко от изчислените семпли са във сянка (сянка имаме, когато getLighting() върне черен цвят).