ДР10/Т1 - Адаптивно семплиране на RectLight

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

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

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

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

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

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