Домашни работи - лекция 5/easy (2т)

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

Група 0:
Реализирайте Bilinear filtering. За целта, модифицирайте BitmapTexture::getColor() метода, като вместо да вземате само един тексел от текстурата (както правехме досега - ползвахме само целите части на x, y координатите в метода getColor()), вземете още 3 - съседният тексел отдясно, съседният отдолу и съседният диагонално вдясно и отдолу. Намерете дробните части на координатите x, y (и ги кръстете, да речем, p и q). 4-те цвята смесете по следната схема:

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

Група 1
Понастоящем, BitmapTexture::getColor() нормира uv координатите от info структурата, като ги вкарва в единичния квадрат, след което ги умножава по размерите на картинката, за да вземе подходящия тексел. Този подход очаква картинката да е квадратна - ако не е, изображението ще изглежда разтеглено. Направете си следния експеримент:

1) Модифицирайте Plane::intersect. Да генерира UV координати като дели info->p.x/z не на 256, а на 16.
2) Използвайте тази примерна текстура (сложете я в data/ директорията на проекта)
3) Сменете generateScene() да се ползва тази текстура (pesho.bmp) вместо текстурата за пода (2.bmp)

Ще видите разтеглено изображение върху пода. Задачата ви е да елиминирате този проблем, като модифицирате BitmapTexture::getColor(). Вместо в квадратче, координатите info.u, info.v трябва да се нормализират в правоъгълник със страни, пропорционални на размерите на картинката (т.е. все едно цялата равнина е запълнена с правоъгълници, и ние трябва да вземем точката (u, v) и да намерим относителните й координати спрямо правоъгълника, в който тя попада). Колко е голям точно правоъгълника е съществено - вземете по-късата страна на този правоъгълник да е 1 (т.е., за зададената 166x30 картинка, правоъгълникът трябва да е с размери 5.53x1). Изчислете подходящо мащабиране, което, от получения правоъгълник, да ви прехвърля в правоъгълника на истинската картинка, и подавайте така трансформираните координати на bitmap.getPixel(). В следствие на всичко това, картинката на пода не трябва да изглежда разтеглена - текселите трябва да изглеждат "квадратни" - ето пример.

Тази трансформация ще обърка UV координатите за сферата. За да ги поправите, променете изчислението им във Sphere::intersect, като умножите формулата за info->u по 2.

Група 2
Модифицирайте renderScene() така, че да показва кои пиксели ще бъдат подложени на anti-aliasing. За целта, оцветете в червено пикселите, за които needsSmoothing е истина. Поиграйте си със AA_THRESH константата като я оптимизирайте така, че да снижи времето за рендериране, но в същото време не пропуска забележими ръбове. Ориентирайте се по статистиката RenderTime, която приложението изписва. Не се притеснявайте за квадратчетата от текстурата на пода - Група 0 ще се справи с тях. Когато решите, че дадена стойност на константата е добра, махнете червеното оцветяване и проверете дали картинката наистина изглежда добре.
За тази задача не се изисква да пращате код. Пратете просто препоръчваната от вас константа и някакво кратко описание какви опити се провели и визуално какви са били резултатите от тях.

Comments

За група 0:

За група 0:
Как да взема цвета на дадения текстел? И трябва ли да използвам дадената функция три пъти за всеки цвят (червен, зелен и син)?

Ползвате метода getPixel() на

Ползвате метода getPixel() на Bitmap - по зададени координати x, y той ви връща Color (който си пази и трите компонента - R, G, и B).

Благодаря.

Месри, получи се.

Група две много ще е зор,

Група две много ще е зор, чувствам го :)

Искам да попитам за група 2

Искам да попитам за група 2 как да задам цвета в червено понеже чрез Color(1,0,0) не успях. Рендерът изкарва картинката по абсолютно същия начин и няма оцветяване на пикселите, които се нуждаят от anti-aliasing в червено.

Да, Color(1,0,0) трябва да е.

Да, Color(1,0,0) трябва да е. Може би бъркаш мястото, където трябва да установяваш цвета - трябва да замениш третата стъпка на renderScene, вместо да пуска нови лъчи за SuperSampling, просто да слага vfb[y][x] на червено.