- DEMO.DESIGN (2:5030/1334.67) ---------------------------------- DEMO.DESIGN -
Msg : 1 из 251
From : Vitaly Mayatskih 2:5002/27.65 Суб 18 Hоя 00 00:35
To : All Вск 19 Hоя 00 01:06
Subj : Radial Blur
-------------------------------------------------------------------------------
Здоровенное тебе приветище, All!
Hу надо, так надо ;) В ююках содержится пример сабжа, скомпиленный в
Borland C 5.01 и Watcom C 10 (это чтобы разницу в скорости почувствовать ;).
Попсрла теория. Что такое блюр, думаю, объяснять не надо. В ортогональной
декартовой системе блюр реализуется очень просто. В радиальной системе блюр
реализуется тоже очень просто ;) Для этого нам надо высчитать координаты точки,
с которой будем блюрить текущую. Дабы не производить тормозные вычисления над
каждой точкой, сгенерим для этого дела таблички. Искать координаты точки будем
при помощи вектора с фиксированной длиной, например 8, как в примере.
Предположим, что "центр" блюра находится в точке (0,0). Теперь пробежимся по
всем точкам на экране и высчитаем вектор по известной формуле:
for(x=0;x<320;x++)
for(y=0;y<200;y++){
n=sqrt(x*x+y*y)/8+1;
Единицу добавляем, чтобы не получить нулевой вектор. Теперь, имея вектор к
данной точке, ещс упростим последующие вычисления и разложим вектор на x- и y-
составляющие:
*(nx+y*320+x)=(char)(x/n);
*(ny+y*320+x)=(char)(y/n);
}
Где nx и ny - это массивы по 320*200 элементов типа char. Таблицы
сгенерированы, теперь сам сабж. Двигаем центр блюра по какой-нибудь замудрсной
траэктории по экрану и передасм в процедуру координаты центра (bx,by). Центр
делит экран на 4 части, блюр всех четвертей идейно одинаков, только направления
счста разные ;) Блюрим от центра, пробегаясь в цикле по столбцам и строкам.
//vptr - указатель на буфер с картинкой.
vptr1=(((by-1)<<6)+((by-1)<<8)+bx-1)+vptr; //vptr1=320*(by-1)+(bx-1)+vptr
t=0;
for(y=by-1;y>=0;y--){
for(x=bx-1;x>=0;x--){
vx=*(nx+t);
vy=*(ny+t); //нашли x и y точки, с которой будем блюрить
p1=*(vptr1);//p1 - текущая точка
p2=*(vptr1+vx+(vy<<8)+(vy<<6));//p2 - точка, к которой взяли вектор
*vptr1=(p1+p2)>>1; //блюрим ;)
vptr1--;
t++;
}
vptr1=vptr1-320+bx; //следующая строка
t=t+320-bx;
}
После радиального блюра полезно сделать ещс и обычный, после чего бросаем
буфер на экран, в буфер кидаем несблюренную картинку, меняем координаты центра
и
loop. Всс, спасибо за внимание. Hа авторство эффекта не претендую ;)
Пока!
--- GoldED+/386 1.1.4.7
* Origin: Where dark and light don't differ (2:5002/27.65)
|
|