Домашни работи - лекция 4 / 2015

Ето списъка с домашните работи към лекция 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, но не е получил отговор, да ми пише, или да пише тук.