Домашни работи - лекция 4 / 2015
- Forums:
Ето списъка с домашните работи към лекция 4 (извинявам се за огромното закъснение):
Задача 0: Манделброт текстура
Направете си нов клас за текстура (по подобие на Checker), който реализира фрактала на Манделброт.
Текстурата смята фрактала процедурно (т.е., е infinitely zoomable), и има, подобно на Checker, параметри color1, color2 и scaling, със следното значение:
- color1 - цвета на множеството на Манделброт;
- color2 - цвета на точките извън множеството;
- scaling - на колко трябва да се разделят входните u, v координати да се ползват вместо "екранни координати" във пресмятането на манделброт-а.
Така зададената задача (двоична текстура вътре/вън от множеството) носи 4 т. За пълен брой точки - реализирайте escape time алгоритъма,
за да оцветявате областите извън множество в полутонове на color2 (можете да интерполирате между color2 и color1 в зависимост от escape time, или си направете
ваша палитра с много различни цветове за различни обхвати на escape time).
Примерен рендер с манделброт текстура (с реализация на escape time алгоритъма и scaling = 60).
Задача 1: Пресичане с правилен многоъгълник
Реализирайте пресичане с плосък правилен многоъгълник. Многоъгълникът може да си представите като част от равнина, успоредна на XZ (т.е. с константни y координати, подобно на съществуващия клас Plane). Многоъгълникът се дефинира чрез следните параметри: вектор center, един double R за радиуса, и едно цяло число n (n ≥ 3) - броя на страните.
Нормалата трябва да е (0, 1, 0), uv координатите генерирайте по подобие на Plane, само че те трябва да започват от (0, 0) в центъра на многоъгълника (два еднакви многоъгълника, поставени на разстояние един от друг и "облепени" с еднакъв checker трябва да изглеждат еднакво).
Скоростта на функцията ви за пресичане не трябва да зависи от параметъра n, независимо колко голям е той.
За да тествате, аранжирайте сцена с един или повече многоъгълник - например така.
Задача 2: Процедурна текстура
Да се добави флаг на класа Lambert. Ако флагът е активен - да се замени генерирането на дифузния цвят на обекта със следния код:
Където ColorU[i], и ColorsV[i] са дадени цветове (за начало можете да ги изберете случайно), а FreqU[i], и FreqV[i] са дадени честоти, от които зависи колко фин да е детайла. Като за начало на FreqU[] и FreqV[] задайте случайни стойности в интервала [0.01 .. 0.25].
Да се използва така направената текстура, на мястото на Checker-а за равнината. Нагласете параметрите на текстурата по ваш вкус.
Eто примерна картинка с тази текстура, при произволно генерирани параметри.
Задача 3: sRGB
Както обяснихме в лекция 2, мониторите очакват gamma-компресирани изображения, и ако не го вземем предвид, ще имаме проблеми (например).
Ние през цялото време работим в линейно RGB пространство (всички събирания и умножения работят с линейни светлинни величини). За да покажем правилна картинка на екрана,
трябва резултатните стойности на пикселите да подложим на Gamma-компресия. Един вариант това да се направи прецизно е да се приведе нашето линейно RGB пространство в sRGB цветовото пространство (което има вградена gamma корекция от 2.2). Използвайте формулите за превръщане от sRGB статията в Wikipedia. Описаните там Rlinear, Glinear и Blinear са стойностите на пикселите, които имаме във vfb масива. Във функцията Color::toRGB32() заменете извикването на convertTo8bit() с нова функция, convertTo8bit_sRGB(). Напишете тази функция, като в нея правите превръщане на линейното RGB в sRGB, както е описано в статията.
Резултатът трябва да е, че цялата сцена трябва да стане по-светла, особено в по-тъмните части.
Разпределяне на задачите и точкуване
За да се избегне опасността да проверявам 44 решения на една и съща задача (понеже се оказала най-лесна), в сила е следното разпределение на задачите:
K = вашият_факултетен_номер MOD 4
Имате право да решавате задача № К.
При правилно решение на полагащата ви се задача, ще получите 6 точки. За решения, реализиращи повече от зададеното по условие, или показващи особено ефекивен или красив алгоритъм се предвиждат бонус точки.
Крайният срок за предаване на домашните е 14-ти Декември (Понеделник), 22:59.
За база на решенията си ползвайте commit 2731cd (или таг homework4), т.е.
git reset --hard homework4
Препоръчвам ви да изготвите решенията си преди този срок - така, ако решението ви има проблем и не взима максималния брой точки, ще получите отговор и имате възможност да си го поправите (free of charge). При пращане в последната минута, очевидно няма да имате тази привилегия.
Подробности как да изготвите и изпратите решението си вижте в темата домашни с git.
Comments
Крайният срок за домашните
Крайният срок за домашните към лекция 4 приключи. Ако някой е пратил мейл за домашно №4, но не е получил отговор, да ми пише, или да пише тук.