ДР/2013/Л5/easy (3т)

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


Група 0:

Реализирайте Bilinear filtering. За целта, първо намалете множителя на BitmapTexture-ата от 0.005 на 0.0008. Модифицирайте BitmapTexture::getTexColor() метода, като вместо да вземате само един тексел от текстурата (както правехме досега - ползвахме само целите части на u, v координатите в метода getTexColor() при извикването на getPixel()), вземете още 3 - съседният тексел отдясно, съседният отдолу и съседният диагонално вдясно и отдолу. Намерете дробните части на координатите u, v (и ги кръстете, да речем, p и q). 4-те цвята смесете по следната схема:

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


Група 1:

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

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


Група 2:

Задачата изисква показването на анимация; за да ви върви по-бързо рендерирането, ползвайте по-ниска разделителна способност (задайте RESX, RESY на 320, 240 в constants.h) и компилирайте в Release.

Създайте анимация: вкарайте извикванията на renderScene() и displayVFB() във for-цикъл. Този цикъл трябва да итерира параметъра rotation от 0 до 360 градуса през някаква стъпка, например 10 градуса. Въпросният параметър представлява ротация на UV координатите на пода. Добавете метод setRotation() на BitmapTexture, който приема double параметър от 0 до 360. Този параметър ще задава ротация около точката (100, 206) с дадения ъгъл, в равнината на UV координатите. Самата ротация реализирайте, като във BitmapTexture::getTexColor() ротирате входните (u и v) координати с текущата ротация (вижте wikipedia относно ротационни матици). В generateScene() си копирайте първият BitmapTexture обект (текстурата за "пода") на някое удобно място. За всеки кадър извиквайте setRotation() метода на bitmap текстурата. Параметъра трябва да се движи от 0 (в първия кадър) до 360 (в последния кадър).

Добре е, вместо да смятате sin()/cos() на всяко извикване на getColor(), да си ги преизчислите в setRotation(). Освен това, на така преизчислените данни задайте подходящи стойности по подразбиране (в BitmapTexture конструктора), така, че ако не се вика setRotation() метода, ротацията да е нулева - т.е. текстурата върху сферата да не се променя при анимацията.

Крайният резултат трябва да е все едно "подът" се върти, с ос на въртене някъде изпод средната от сините топки (Примерно видео, паролата е "123"). Посоката на въртене не е от голямо значение.

Comments

Питане по условието на Група

оправих се.

Уточнение

Да, прав си, че не става много ясно.
Закръглянето до цели числа става в извикването на bmp.getPixel(tx, ty). Параметрите на метода са int - реално за тези цели числа става дума.

"Намерете дробните части на

Разглеждах имплементацията на нашия bitmap и искам да задам един въпрос относно тази част:

for (int j = hi.y - 1; j >= 0; j--) {// bitmaps are saved in inverted y
if (!fread(xx, 1, rowsz, fp)) {
printf("loadBMP: short read while opening `%s', file is probably incomplete!\n", filename);
delete [] xx;
return 0;
}
for (int i = 0; i < hi.x; i++){ // actually read the pixels
if (hi.bitsperpixel > 8)
setPixel(i, j, Color(xx[i*k+2]/255.0f, xx[i*k+1]/255.0f, xx[i*k]/255.0f));
else
setPixel(i, j, palette[xx[i*k]]);
}
}

Това значи, че нашите координати tx, ty, започват от горния ляв ъгъл ( също както screen координатите) ?

Edit: Успях да докарам до някакъв резултат.

(0,0) = горен-ляв

Да, пикселът с координати (0, 0) в Bitmap отговаря на горния-ляв ъгъл, както си е по конвенция.

Тази черната черта, която се

Тази черната черта, която се вижда на картинката и която я няма на примерната
дали може да е поради факта, че не съм сметнал правилно границите на текстурата ?

image

Да, не правиш правилно

Да, не правиш правилно прехода между крайните X пиксели. При floor(X) = W-1, трябва да смесваш между пикселите с X координати W-1 и 0.

Оправих си бъга и пратих

Оправих си бъга и пратих домашното.
Проблема беше, че правя проверка за tx/ty == W - 1 / H - 1, но бях забравих да ги кастна към int преди да извърша проверката.

Относно шейдъра

На мен ми се падна да напиша Блин Фонг шейдъра. Следвайки статията, реализирах(до някаква стен) шейдъра. В момента той смята вектора H по - описата горе формула(която се оказва нормализирането на L+V). Само че, шейдъра изглежда по скоро като velvet от колкото като лъскаво -> http://i.imgur.com/qxGloRx.png . Става въпрос за 3 те сини сфери в средата. Тези в края са си с нормален Фонг.

Въпросът ми е от какво може да се получава това?

Ами поне като гледам

Ами поне като гледам картинката не се досещам. Прати ми код на мейла и ще ти кажа.

Относно BlinnPhong шейдъра

Аз се натъкнах на същият проблем. Смятам H = (L + V) / | L + V |, но самият шейдър прилича повече на Lambert, от колкото на Phong. Може ли да споделите какво се оказа проблемно?