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

Ето ги и домашните работи към лекция №5. В това домашно има 4 по-леки задачи (от които можете да решите само една - която ви се падне според факултетния номер), както и една трудна. Леките задачи носят по 4 точки и са описани тук. Условието на трудната можете да видите тук - тя носи 7 точки и е достъпна до всички, независимо от Ф№.

Вашата група = вашият факултетен номер MOD 4


Група 0:

Създайте нов шейдър на име BlinnPhong, реализиращ Blinn-Phong шейдинг модела. Като идея много прилича на Phong, само смятането на векторите е различно.

Сложете BlinnPhong на топката в сцената - при идентичен параметър exponent, нейния hilight трябва да е по-голям и разплескан.


Група 1:

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


Група 2:

Реализирайте шейдъра Oren-Nayar. Моделът има един параметър, sigma, който определя грапавината на обекта и варира от 0 до 1 (при 0 е идентичен с Lambert шейдъра). Обяснение на означенията в статията в Wiki:

  • Vi - e лъча от пресечната точка към лампата;
  • Vr - e лъча от пресечната точка към камерата;
  • Li - е яркостта и цвета на светлината, идващи в пресечната точка (и е както при Ламберт: lightColor * lightPower / distance²);
  • Lr - това е резултатът от шейдъра;
  • ρ/π - това са albedo и BRDF normalization - игнорирайте ги във вашата имплементация - приемете, че този член е 1;
  • θi - ъгъл между нормалата и Vi;
  • θr - ъгъл между нормалата и Vr;
  • ɸi и ɸr - азимутални ъгли на, респективно, Li и Lr в равнината на повърхността на обекта. Представете си, че повърхнината на обекта е плоска (и, естествено, е перпендикулярна на нормалата). Проектирате векторите Li и Lr в тази равнина - ще се получат два двумерни вектора, лежащи в нея. Търсеното cos(ɸi - ɸr) е всъщност косинуса от ъгъла между тези два двумерни вектора (като, когато този ъгъл е над 90° - цялата част от формулата с множителя B става 0).

С формулата от Wikipedia се смята lambertCoeff. T.e. шейдърът ви ще се държи идентично като при Lambert, но вместо входящата светлина да умножавате по dot(lightDir, normal), ще я умножавате по формулата в статията.

Ето примерен рендер, ползващ Oren-Nayar шейдър. Всички топчета са с цвят (0.5, 0.5, 0.5). Предните две са, респективно, с Lambert и Phong, а задните 5 са с Oren-Nayar и параметри sigma = 0.0, 0.2, 0.4, 0.6 и 0.8.


Група 3:

Реализирайте адаптивен anti-aliasing по следната схема (промените са изцяло във функцията render()):

  1. Правите предварителен пас, в който изстрелвате лъч само през kernel[0] - т.е. по един лъч на пиксел;
  2. Минавате по цялата картинка и проверявате къде даден пиксел е твърде различен от кой да е от 8-те си съседа (но внимавайте, понеже по граничните пиксели броя съседи е по-малък). За критерий за различност ползвайте сумата от абсолютните стойности на разликите по R, G и B каналите - ако тази сума е по-голяма от някакъв праг, то считаме цветовете за прекалено различни;
  3. В bool масив отбелязвате кои пиксели имат нужда от още АА семпли (по току-що споменатия критерий);
  4. С последен пас: за всеки пиксел, маркиран в горния масив, пускате и останалите 4 лъча от kernel-а и усреднявате натрупаните 5 (заедно с лъча от т. 1);
  5. Добавете код, който да оцветява в червено пикселите с допълнителни AA семпли. Този код да се включва само при вдигане на някакъв флаг (showAA). Ползвайте тази функционалност за да изберете подходящ праг в т. 2 - целта е да има Anti-aliasing само по ръбовете и резките преходи.
  6. (бонус): прави ли ви впечатление, че така алгоритъмът алокира твърде много семпли в overbright областите? Сменете функцията за сравнение в т. 2 така, че да игнорира разликите в даден канал, ако и двете стойности са над 1 (например трябва да третира цветовете Color(1.5, 0.5, 0.6) и Color(2.0, 0.5, 0.6) като еднакви).

За базова версия ползвайте commit 2731cd (или таг homework4), т.е.
git reset --hard homework4
Крайният срок за предаване на домашните е 21-ти Декември (Понеделник), 17:59.
Подробности как да изготвите и изпратите решението си вижте в темата домашни с git.

Comments

Крайният срок на домашните

Крайният срок на домашните към лекции 5 и 6 е удължен до утре вечер.