Домашни - Лекция 4 / 2013

Ето списъка с домашните работи към лекция 4:

Задача 0: Пресичане с правилен многоъгълник

Реализирайте пресичане с плосък правилен многоъгълник. Многоъгълникът може да си представите като част от равнина, успоредна на XZ (т.е. с константни y координати, подобно на съществуващия клас Plane). Многоъгълникът се дефинира чрез следните параметри: вектор center, един double R за радиуса, и едно цяло число n (n ≥ 3) - броя на страните.
Нормалата трябва да е (0, 1, 0), uv координатите генерирайте по подобие на Plane, само че те трябва да започват от (0, 0) в центъра на многоъгълника (два еднакви многоъгълника, поставени на разстояние един от друг и "облепени" с еднакъв checker трябва да изглеждат еднакво).
Скоростта на функцията ви за пресичане не трябва да зависи от параметъра n, независимо колко голям е той.

Упътване: в момента кодът в github не е реализиран с правилния raytracing алгоритъм. Ако създадете node-ът с вашия многоъгълник, и го сложите след равнината в списъка nodes - то той няма да се покаже никога. Или махнете изцяло равнината, или сложете многоъгълника си преди node-а с равнината. Аранжирайте сцена с един или повече многоъгълник - например така.


Задача 1: Процедурна текстура

Да се добави флаг на класа CheckerShader. Ако флагът е активен - да се замени генерирането на дифузния цвят (шахматните квадратчета), със следния код:

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

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

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


Задача 2: sRGB

Както обяснихме в лекция 2, мониторите очакват gamma-компресирани изображения. Има и картинка (вижте обяснението към лекцията), чрез която можете да видите къде в градиента 0-255 се пада истинското 50% сиво на вашия монитор.

Ние през цялото време работим в линейно RGB пространство (всички събирания и умножения работят с линейни светлинни величини). За да покажем правилна картинка на екрана,
трябва резултатните стойности на пикселите да подложим на Gamma-компресия. Един вариант това да се направи прецизно е да се приведе нашето линейно RGB пространство в sRGB цветовото пространство (което има вградена gamma корекция от 2.2). Използвайте формулите за превръщане от sRGB статията в Wikipedia. Описаните там Rlinear, Glinear и Blinear са стойностите на пикселите, които имаме във vfb масива. Във функцията Color::toRGB32() заменете извикването на convertTo8bit() с нова функция, convertTo8bit_sRGB(). Напишете тази функция, като в нея правите превръщане на линейното RGB в sRGB, както е описано в статията.

Резултатът трябва да е, че цялата сцена трябва да стане по-светла, а светлинното петно в средата трябва да стане не толкова ясно изразено.


Задача 3: Повече от една светлина

Да се реализира възможността да имаме повече от една светлина в сцената (т.е. позициите и интензитетите да се пазят в масив, по подобие на nodes[]/geometries[]/... масивите).
Аранжирайнте сцена с 2 или повече светлини.


Допълнителни задачи

(не носят точки, но ако искате направете за удоволствие; ще ги реализираме така или иначе утре, по време на лекция 5).

  • Реализирайте пресичане на лъч с куб (т.е. имплементирайте клас Cube, наследник на Geometry). Кубът се задава чрез Vector center и double side - дължина на ръба.
  • По същия начин реализирайте пресичане на лъч със сфера - по даден център и радиус.
  • Реализирайте правилния Raytracing алгоритъм (т.е. такъв, който търси само най-близката пресечна точка на лъча с Node от сцената, и след това shade-ва само нея).

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

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

K = вашият_факултетен_номер MOD 4
Имате право да решавате задача № К.

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

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

Comments

Домашно

На мен ми се падна да правя задача 1.
Поразцъках малко задачката и стигнах до следния интересен резултат:
img

Нормално ли е да го рендира малко бавно ? Тея дни ще си играя да го рандомизирам и пооправя, тъй като сега само набързо го сглобих.

А въпросче за флаговете - тях като аргументи на конструктура ли да ги поддаваме или както искаме така да го имплементираме ?

Както поискате

1) да, нормално е да се рендира малко по-бавно.
2) както искате го реализирайте.

Всъщност трябва ли да

Всъщност трябва ли да генерираме рандом стойности за честотите или просто ние да си изберем такива, които ни допадат (в посочения интервал) ?

Вие си ги избирате.

Вие си ги избирате.

Задача 1 : u,v ???

Тези u и v в задачата за текстурата са кординатите u и v на data ? или

Да.

Да.

commit

Задължително ли е да се ползва определения commit за база на домашното, или може да използвам и последния актуален според последната лекция(тоест, кода директно от code.raytracing-bg.net)?

По-лесно ще ви е (по-малко

По-лесно ще ви е (по-малко работа ще ви се отвори), ако ползвате нарочения за база.

Задача 2

Мен ми се падна задача 2. Реализирах функцията по горе описания начин и формули. Получи се това -> http://i.imgur.com/zAMbNAD.png . Въпросът ми е от какво могат да се получават черните петна в края на изрязания куб?

Правилно ли изрязваш

Правилно ли изрязваш стойностите на цветовете ако са над 1.0? Вероятно това е проблемът. Проверии какво се полчава като стойност, ако входните числа са над 1.

Предаване на работите

Казахте, че може да покажем какво сме написали преди крайния срок за коригиране.
На мейл ли да ги пращаме или да качваме директно?

На мейл, както е описано в

На мейл, както е описано в точка 6 тук.

нещо такова ?

това приемливо ли е като резултат ?
http://postimg.org/image/sv11fzm4t/

играх си с часове с цветовете и честотите да докарам нещо като примерното но уви..
И да ви помоля ако може да дадете вашите цветова и честоти (:

Не е нужно

Не е нужно да докараш примерната картинка. Тя беше създадена е със случайни параметри, така че дори аз не знам какви са били цветовете и честотите.
Иначе изглежда вярно, прати кода както си е по реда, описан в "Домашни работи с git" и ще ти го проверя.

Краен срок

Крайният срок е удължен до Сряда (20.11), и съвпада с крайния срок за домашните по лекция №5.

Задача 0 инцидентност със триъгълник

Привет,
на мен ми се падна задача 0 и ме изненада приятно. Имах размисъл на тема как да проверя дали точка е вътрешна за триъгълник, прочетох начина и го реализирах, бих искал да го разкажа след срока на домашното за да не се брои подсказване.
Остава само да я upload-na.
Поздрави
Огнян