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

На тази страница са описани домашните работи към лекция №5. Има 3 леки задачи по 3 точки, от които можете да решите само една - която ви се падне според факултетния номер.

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


Група 0: Централни несправедливости

По време на лекция 6 писахме код, който генерира случайно отклонение на нормалите, с цел да можем да симулираме грапави отражения:


double angle = randomFloat() * 2 * PI;
double radius = randomFloat() * 1;
double x, y;
x = cos(angle) * radius;
y = sin(angle) * radius;

В него, обаче, има бъг, а вашата задача е първо да го демонстрирате, а после - да поправите.

Изведете този код в нова функция genDiscPoint(double radius, double& x, double& y), която да генерира точката, и заменете в Refl::shade() с извикване към тази функция.
За целите на демонстрацията, преименувайте текущата функция render() на нещо друго и напишете нов render(), който:

  1. Генерира 300,000 точки чрез genDiscPoint() с радиус 200;
  2. Трансформира получените точки така, че да могат да се покажат на екрана (например - всяка генерирана точка (x, y) се трансформира до (x + 200, y + 200));
  3. Закръгля получените координати до цели числа ix, iy;
  4. Увеличава vfb[iy][ix] с Color(0.1, 0.1, 0.1).

В резултат ще ви се изренди една картинка с разпределението (плътността) на функцията genDiscPoint. Дефектът вече трябва да е очевиден. Опитайте се да разберете защо се получава така и как можете да го поправите. Гугъл може да помогне (disc point picking).

За база на вашия код ползвайте комит 2731cd (таг: homework4)


Група 1: Bilinear filtering

Реализирайте Bilinear filtering. За целта, първо увеличете scaling параметъра на BitmapTexture-ата от 200 на 1200. Модифицирайте BitmapTexture::sample() метода, като вместо да закръгля и извиква Bitmap::getPixel(), да извиква нов метод (примерно getBilinearPixel) на Bitmap, на който му се подават дробни числа x и y (но те трябва отново да са MOD-нати в обхвата [0..W)x[0..H)). В тази функция, вместо да взимаме само един тексел от текстурата (както правехме досега - ползвахме само целите части на скалираните u, v координати, т.е. на x, y в случая), вземете още 3 - съседният тексел отдясно, съседният отдолу и съседният диагонално вдясно и отдолу. Намерете дробните части на координатите x, y (и ги кръстете, да речем, p и q). 4-те цвята смесете по следната схема:

<резултат> = <горен_ляв> * (1 - p) * (1 - q) + <горен_десен> * p * (1 - q) + <долен_ляв> * (1 - p) * q + <долен_десен> * p * q;
Резултатът трябва да изглежда нещо подобно на това: пример. Вземете под внимание факта, че текстурата е повтаряща се. Може да нямате десен съсед, а да се налага да ползвате най-левия в същия ред на текстурата.

За база на вашия код ползвайте комит 2731cd (таг: homework4)


Група 2: Прозорец без сянка

Вече в лекция 6 обсъждахме сюрреалистичния ефект, който се получава като направим сфера с IOR = 1.01: тя изглежда като ефирен сапунен мехур, но пък хвърля тежка и черна сянка... за съжаление, дори и при по-често срещан IOR (наример 1.6, стъкло), но подходяща форма на обекта, хвърлящ сянката, се получават нереалистично наситени сенки. Често срещан пример - искаме да си направим прозорец.

Ще искаме да можем да си изрендим следната сцена:


Сцената съм качил в data/hw6/window.qdmg

За целта:

  1. добавете параметър shadowTransparency на Node. Той е float число от 0 (напълно непрозрачен обект, това е стойността по подразбиране) до 1 (напълно прозрачен).
  2. Модифицирайте visibilityCheck(), така че да връща float число: произведението на shadowTransparency-тата на всички Node-ове по пътя между start и end). Ако няма нито един обект по пътя, резултатът, естествено, е 1.
  3. Резултатът от visibilityCheck() ползвайте в getLightContrib за да връщате частични яркости от 0 до lightIntensity / distanceToLightSqr.

За база на вашия код ползвайте branch "lecture-7", commit dc1efb (таг: homework6).

Забележете, че двете сферички в примера са с различни shadowTransparency параметъра!

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