Домашна работа 1

Задание:
Да се добави геометричен примитив равнина и да се реализира пресичане с лъч.
Равнината трябва да може да има произволна позиция и ориентация в пространството.
(т.е. не е задължително да е успоредна на някоя от координатните равнини)

Напътствия:
Добавете нов клас за равнина, който наследява GeomPrimitive.
Попълнете intersect метода (по подобие на Sphere.cs),
като не забравяте преди да върнете true да попълните информацията в hitData.
За пресичането на лъч с равнина, може да използвате формулата от презентацията на Лекция 2, или http://en.wikipedia.org/wiki/Line-plane_intersection.
Нямам конкретни изисквания с какви параметри ще дефинирате равнината си.
Например: три точки, нормала и точка и др.
След като реализирате примитива Равнина, добавете един в тестовата сцена, за да може да се покаже на екрана.
Не забравяйте да му присвоите shader!

Краен срок: 24.01.2014.
Бонус точки: 2.


Домашна работа 2

Задание 2.1:
Да се добави геометричен примитив Тор (torus) и да се реализира пресичане с лъч.
Ще е добре, ако торът може да се поставя на произволни (x, y, z) в сцената, но домашната се признава и ако центърът му е винаги в (0, 0, 0).
Информация за пресичане на лъч с тор може да намерите тук (спокойно пропуснете секцията “Warping the Torus into World Space”).
Тук има реализирано на Java пресичането на лъч с тор.
Напътствия:
Нужно ни е да намерим само параметъра t, на който е станало пресичането. От там чрез заместване в уравнението на лъча, можем да намерим къде е точката в пространството на сцената. Внимание, уравнвнието, което ще се получи ще е от 4-та степен, за това очаквайте поне 4 решения за t. Трябва да определите, кое е най-близко до наблюдателя и да пресметнете точката с него.
Бонус точки: 10.

Задание 2.2:
Да се реализира шахматна текстура (checker). Пример: checker texture
Текстурата може да има следните параметри:
Размер по U на един квадрат от мрежата,
размер по V на един квадрат от мрежата или
брой квадрати по всяка ос на мрежата.
(Размерите са в текстурни единици)
Напътствия:
Попълнете evalChecker(double u, double v) метода в TextureChecker.cs.
Реализацията трябва да връща бял или черен цвят, в зависимост от това върху какво квадратче е попаднал лъчът.
От входните параметри (u v) трябва да се пресметне върху какво квадратче сме в момента.
Може да използвате променливите m_numU и m_numV за задаване броя на квадратчета в текстура с размери [(0,0) (1,1)].
Това което ви трява е формула, по която да се определи за дадено (u,v) бял или черен цвят да се върне.
(При желание може да си дефинирате собствени променливи, които вместо броя квадратчета указват колко е голямо едно квадратче от текстурата.)
За идеи, може да погледнете тук на слайд “Procedural Shading”.
Както и тук.

Всяка точка от текстурата трябва да се пресмята по време на рендването, не предварително.
Използвайте сценa 2 за пример, как се поставят текстури.
Бонус точки: 3.

Задание 2.3:
Да се реализира Antialiasing.
Трябва да се добави генерация и проследяване на повече от един лъч в класа PixelSamplerOne.
Получените цветове се събират и накрая резултатният цвят се дели на броя генерирани лъчи.
Напътствия:
Не забравяйте да отместите така новите лъчи, че да минават през различно място от пиксела.
Например: равномерно разпределени в пиксела или отместени с някаква случайна стойност.
Пространството на пиксела е нормализирано в интервала [0..1] т.е. (pixX+0.5, pixY+0.5) е средата на пиксела.
За идеи погледнете тук.
Бонус точки: 3.

Краен срок: 31.01.2014.


Домашна работа 3

Задание 3.1:
Да се реализира “грапаво” пречупващ BRDF. Пример: вижте последната чаша тук
Напътствия:
Създайте нов BRDF клас и го имплементирайте по подобие на PhongBRDF, само че при пресмятането на лъчите ще трябва да обърнете посоката и да ги пресмятате в долната полусфера. За да изчислите базовия лъч, около който ще се разпръскват лъчите използвайте формулата за пресмятане на единичен пречупен лъч.
Внимавайте при генерирането на лъчи, да не допуснете лъч да влезе в грешната полусфера.
Бонус точки: 10.

Задание 3.2:
Да се реализира пресичане на лъч с обект описан с произволна математическа функция (implicit surface).
Имплементирайте някой постъпков метод – ray marching, sphere tracing и т.н.
Функцията описваща повърхността на обекта може и да е хардкодната в самия клас на обекта.
Напътствия:
Добавете нов клас за implicit surface obekt, в него трябва да има функция, която изчислява зададената формула за входни параметри (x, y, z). Пресмятането ще представлява заместване на входните параметри, директно във формулата.
Intersect метода на този обект, ще представлява реализация на постъпковия метод.
Може да реализирате метод от следните документи:

1.)Ray tracing implicit surfaces on the GPU (раздели 1. и 2.).

1.1.) Real-Time Ray Tracing of Implicit Surfaces on the GPU

2.)Potatro, RayMarching and DistanceFields : a story of SphereTracing (раздели 1. и 2.).

За пресмятане на нормалата в намерената пресечна точка може да погледнете раздел 8. в този документ:
Ray Tracing Implicit Surfaces

За тестови функции, може да използвате уравнение на сфера:

или Тор:

Бонус точки: 15.

Краен срок: 13.02.2014.