ДР/2015/Л10/Група 2

Петоъгълно боке

При сегашната реализация на DOF ефекта, една разфокусирана точка ще се размаже до кръгло петънце. В действителност, при истински фотоапарат, това ще се получи само ако обектива е отворен на най-широка апертура (т.е. на най-ниско f-число). В момента, в който увеличим f-числото, диафрагмата ще свие апертурата до по-тясна. Обикновено, диафрагмата във фотообективите представлява механизъм с определен брой остриета (5-6 за евтините обективи и до 12 за професионалните telephoto обективи). При тях апертурата добива формата на правилен многоъгълник. Така и точките извън фокус вече добиват формата на апертурата (ето пример, а тук има и с шестоъгълници). Изобщо, рисунъка на един обектив в областите извън фокус се нарича "боке". При обектив с 5 остриета на диафрагмата, се получава характерното "петоъгълно боке". Ще искаме да го имитираме (достатъчно е просто да променим формата на нашата "апертура", т.е. областта, от която генерираме начални точки за DOF лъчите).

Въведете целочислен параметър "diaphragmBlades" на камерата (по подразбиране да е 0). Ако diaphragmBlades e под 3, ползвайте досегашния алгоритъм. Ако е 3 или повече, трябва случайните числа u и v в getScreenRay() да се генерират в правилен многоъгълник (с diaphragmBlades страни), вместо в кръг. Въведете функция getNGonPoint(int numSides), която прави това (генерира случайна двумерна точка в правилен многоъгълник с радиус 1).

Тъй като задачата ви е лека в сравнение с на останалите, имате допълнително изискване: генерирането на точките да бъде "умно" - да ползва не повече от 3 извиквания на rnd.randfloat()/randdouble() функциите, и да не ползва "отхвърляне" (например, генерирате в кръг, и, ако е извън многоъгълника който искаме, генерирате нова и т.н.). Освен това внимавайте точките да са равномерно разпределени.
Реализация, която не спазва горното изискване ще получи 2 до 3 точки, в зависимост от това какво точно прави.

Тъй като реализацията на горната функция обикновено се оказва препъни-камък, напишете си код за тестването и визуализацията ѝ - подобно на Домашно 6, група 0.

В data/hw10/bokeh.qdmg има тестова сцена, на гладка триъгълна мрежа с множество извивки е закачен Phong шейдър с висок exponent. Обектът е на заден фон и размазаните ярки петънца (от Phong-а) се размиват до кръгчета. Ако сложите diaphragmBlades да бъдат 5, резултатът трябва да изглежда нещо подобно: пример
(този рендер е с голям брой DOF семпли (450); ако ползвате настройки на сцената, както са в момента в git, нормално е да има доста шум (включително и "дупки") в петната).

Като бонус, а и за да не се изнервяте от чакане по време на тестването на решението си, добавете 4 параметъра към GlobalSettings - minX, minY, maxX, maxY - които да ограничават областта, в която рендим (т.е. renderPixelNoAA() да проверява дали (x, y) влизат в определения правоъгълник, и в противен случай да връща просто 0). Бонусът не носи точки, но е силно препоръчителен от психологическа гледна точка :)