ДР 2013/10/Група2
- Forums:
Петоъгълно боке
При сегашната реализация на 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
Прегледах отново инструкциите за домашни, какво може да пропускам?
http://maltekueppers.de/wp/wp-content/uploads/2009/02/opensource-communi...
Точка 3 от тук, ако не си го
Точка 3 от тук, ако не си го направил, иначе провери дали имаш L:\OpenEXR-mingw
Имам ги, както казах минах
Имам ги, както казах минах отново през всичи инструкции. Дори проверих, че въпросният хедър съществува, просто codeblocks не го вижда
http://maltekueppers.de/wp/wp-content/uploads/2009/02/opensource-communi...
Не бях обновил trinity.cbp oт
Не бях обновил trinity.cbp oт trinity-win32.cbp
http://maltekueppers.de/wp/wp-content/uploads/2009/02/opensource-communi...
Ако са се инсталирали някакви
Ако са се инсталирали някакви update-и на Windows-а, най-вероятно се е затрил L:\. Провери дали го имаш и ако не изпълни следното заклинание в командния ред:
subst L: F:\develop\sdk