ДР 2013/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 точки, в зависимост от това какво точно прави.

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

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

Comments

Codeblocks не

Codeblocks не намира
ImfRgbaFile.h, ImfArray.h и Iex.h
Прегледах отново инструкциите за домашни, какво може да пропускам?

Точка 3 от тук, ако не си го

Точка 3 от тук, ако не си го направил, иначе провери дали имаш L:\OpenEXR-mingw

Имам ги, както казах минах

Имам ги, както казах минах отново през всичи инструкции. Дори проверих, че въпросният хедър съществува, просто codeblocks не го вижда

Не бях обновил trinity.cbp oт

Не бях обновил trinity.cbp oт trinity-win32.cbp

Ако са се инсталирали някакви

Ако са се инсталирали някакви update-и на Windows-а, най-вероятно се е затрил L:\. Провери дали го имаш и ако не изпълни следното заклинание в командния ред:
subst L: F:\develop\sdk