2009-12-15 1 views
1

Я использую следующий код для создания динамического отражения изображения:Простой пиксельный размытие Bender?

{ 
input image4 src; 
output pixel4 dst; 

parameter float imageheight 
< 
    minValue: 0.0; 
    maxValue : 1000.0; 
    defaultValue :300.0; 

>; 

parameter float fadeheight 
< 
    minValue : 0.0; 
    maxValue: 1000.0; 
    defaultValue: 50.0; 
>; 

parameter float fadealpha 
< 
    minValue : 0.0; 
    maxValue : 1.0; 
    defaultValue : 0.5; 
>; 

void 
evaluatePixel() 
{ 
    float2 coord = outCoord(); 

    if (coord[ 1 ] < imageheight) { 
     dst = sampleNearest(src, coord); 
    } else { 

     float alpha = 1.0 - (coord[ 1 ] - imageheight)/fadeheight; 

     coord[ 1 ] = imageheight - (coord[ 1 ] - imageheight); 

     dst = sampleNearest(src, coord);    
     alpha *= fadealpha; 
     dst.a *= alpha; 
     dst.r *= alpha; 
     dst.g *= alpha; 
     dst.b *= alpha; 

     float2 pos = outCoord(); 
     pixel4 color = sampleNearest(src,pos); 

     color+=0.75*sampleNearest(src, pos+float2(0.5*2, 0))+0.25*sampleNearest(src, pos+float2(2, 0)); 
     color+=0.75*sampleNearest(src, pos-float2(0.5*2, 0))+0.25*sampleNearest(src, pos-float2(2, 0)); 
     color+=0.75*sampleNearest(src, pos+float2(0, 0.5*2))+0.25*sampleNearest(src, pos+float2(0, 2)); 
     color+=0.75*sampleNearest(src, pos-float2(0, 0.5*2))+0.25*sampleNearest(src, pos-float2(0, 2)); 

     dst = color/5.0; 
    }  
} 

}

Это хорошо работает, но я бы очень хотел, чтобы размыть выход отражения слегка дать ему глянцевый вид. У меня был Google, но все результаты кажутся невероятно сложными. Создает ли эффект размытия (подобно встроенному фильтру Flash) очень сложно сделать в Pixel Bender?

В этом случае я не могу применить фильтр Flash, поэтому это должно быть сделано в Pixel Bender.

+1

Только размытия с очень маленькими радиусами имеют смысл реализовать в пиксельном изгибе. Для больших радиусов, как работает пиксельный изгиб (тот же код выполняется на каждом пикселе изображения) делает его очень неэффективным, а другие алгоритмы будут обрабатывать его намного лучше. Например, собственный фильтр Blur во Flash. Почему бы вам не применить естественное размытие потом (используя фильтр, который охватывает только область отражения)? – Quasimondo

ответ

2

Это довольно просто, все, что вам нужно сделать, это создать новое изображение того же размера, а затем сделать каждый пиксель его в среднем по пикселям в этом положении и окружающим в изображении, которое вы хотите размыть , Результат больше размывается, чем больше пикселей вы берете. Например, вы можете размыть каждый пиксель с помощью пикселей выше, внизу, влево и вправо. Или вы можете использовать пиксель, и все остальные 8 касаются ... Если вы хотите, вы также можете придать предыдущему пикселю больше веса, чем окружающие, для другого эффекта. Лучший способ - просто попробовать материал, пока не получите желаемый эффект.

Кстати, первый вид размытия называется «Средний». Последний способ можно сделать, используя гауссовское распределение для взвешивания пикселей, если вы используете многие из них - размытие по Гауссу.