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

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

Да се добави флаг на класа Checker. Ако флагът е активен - да се замени генерирането на дифузния цвят на обекта със следния код:

Където ColorU[i], и ColorsV[i] са дадени цветове (за начало можете да ги изберете случайно), а FreqU[i], и FreqV[i] са дадени честоти, от които зависи колко фин да е детайла. Като за начало на FreqU[] и FreqV[] задайте случайни стойности в интервала [0.01 .. 0.25].

Да се използва така направената текстура, на мястото на Checker-а за равнината. Нагласете параметрите на текстурата по ваш вкус.

Eто примерна картинка с тази текстура, при произволно генерирани параметри.


Задача 3: banding elimination

Заменете текущия код в setupScene със следния:

	camera.pos.set(0, 60, -120);
	camera.beginFrame();
	nodes.push_back(Node{ new Plane(15), new Checker(Color(0.5, 1, 1), Color(0.5, 1, 1))});
	nodes.push_back(Node{ &sphere, new Checker(Color(0.8, 0, 0), Color(0.6, 0.4, 0.1), 9)});
	lightPos.set(+30, +100, 170);
	lightColor.setColor(1, 1, 1);
	lightIntensity = 10000.0;

Вдигнете големината на изхода в main(), примерно до 1440х1080.

При този сетъп, следва да видите един лек (едва забележим) banding artifact по равнината под топчето. Светлината се сменя бавно, и, като е дискретизирана до 8 бита, си личат отделните региони с еднакъв цвят (вижте този скрийншот за ориентир как изглежда).

Визуалният артефакт би следвало да се вижда и с просто око. Вместо цветът плавно да прелива, ще се виждат отделните слоеве (ако не го виждате, видгнете яркостта на монитора си).

Решаването на този проблем се прави с dithering: алгоритъм, който променя квантизираните пиксели около точната стойност, така че даден регион от снимката, гледан отдалеч, да изглежда с по-правилен среден цвят. Реализирайте някакъв вид dithering (по избран от вас алгоритъм, не държа да е Floyd-Steinberg), който да елиминира banding-а.


Разпределяне на задачите и точкуване

За да се избегне опасността да проверявам 30 решения на една и съща задача (понеже се оказала най-лесна), в сила е следното разпределение на задачите:

K = вашият_факултетен_номер MOD 4
Имате право да решавате задача № К.
Ако вашият Ф№ е от новия формат с буквите, ползвайте числото след буквите. Т.е. "7MI0700104" → 700104 → (mod 4) → Задача 0 (Mandelbrot текстура).

При правилно решение на полагащата ви се задача, ще получите 6 точки. За решения, реализиращи повече от зададеното по условие, или показващи особено ефекивен или красив алгоритъм се предвиждат бонус точки.
Крайният срок за предаване на домашните е 9-ти Април (Вторник), 22:59.
За база на решенията си ползвайте commit ed55731 (или таг homework4), т.е.
git reset --hard homework4
Препоръчвам ви да изготвите решенията си преди този срок - така, ако решението ви има проблем и не взима максималния брой точки, ще получите отговор и имате възможност да си го поправите (free of charge). При пращане в последната минута, очевидно няма да имате тази привилегия.

Подробности как да изготвите и изпратите решението си вижте в темата домашни с git.