![]() |
|
||||||||||
|
|||||
|
Хочу создать фильтр свечения ярких объектов (скажем если сфоткана яркая точка то вокруг нее появится мягкий свет) в pixelbender...
Я знаю как узнать координаты самых ярких пикселей, проблема как их потом "размыть" по соседним... Кто нить может помочь? Проблема в том что циклы он не поддерживает, выходит при радиусе размытия скажем 20 пикселей мне придется вручную писать 2*(20^2)=800 if'ов? ![]() вот что я уже написал: <languageVersion: 1.0;>
kernel glowWhite
< namespace : "AIF";
vendor : "Adobe Systems, Inc.";
version : 1;
description : "Glows white"; >
{
input image4 src;
output float4 dst;
parameter float threshold
<
minValue:float(0.01);
maxValue:float(1.0);
defaultValue:float(0.5);
>;
parameter float multiplier
<
minValue:float(0.01);
maxValue:float(5.0);
defaultValue:float(2);
>;
// evaluatePixel(): The function of the filter that actually does the
// processing of the image. This function is called once
// for each pixel of the output image.
void
evaluatePixel()
{
// Obtain the input pixel color
float4 inputColor = sampleNearest(src, outCoord());
// Calculate (1 - channel) for each of the RGB channels
dst.rgb = inputColor.rgb;
float2 pos = outCoord();
float4 sampled1 = sampleNearest(src, float2(pos.x, pos.y+2.0));
if(sampled1.r>threshold && sampled1.g>threshold && sampled1.b>threshold){
dst.rgb *= multiplier;
}
// set the alpha value equal to the alpha of the input
dst.a = inputColor.a;
}
}
как теперь размыть это дело? |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,155
|
Что б
Цитата:
![]() |
|
|||||
|
такой вариант навскидку,
производительность не тестировал, с pixelbender не сравнивал var srcBmd:BitmapData = new Pic(0, 0); var resBmd:BitmapData = srcBmd.clone(); var tmpBmd:BitmapData = new BitmapData(resBmd.width, resBmd.height, true, 0); var level:int = 0xAA; var clr:int = 0xFFFFFFFF; var blurVal:int = 16; tmpBmd.threshold(resBmd, resBmd.rect, new Point(), ">", level << 16, clr, 0x00FF0000); tmpBmd.threshold(resBmd, resBmd.rect, new Point(), ">", level << 8, clr, 0x0000FF00); tmpBmd.threshold(resBmd, resBmd.rect, new Point(), ">", level , clr, 0x000000FF); tmpBmd.applyFilter(tmpBmd, tmpBmd.rect, new Point(), new BlurFilter(16,16)); resBmd.draw(tmpBmd); tmpBmd.dispose(); var bmp1:Bitmap = new Bitmap(srcBmd); addChild(bmp1); var bmp2:Bitmap = new Bitmap(resBmd); bmp2.x = bmp2.width + 20; addChild(bmp2); |
|
|||||
|
да в том то и дело что я не могу получить аналогичный результат в пиксельбендере поэтому я и создал тему!)
скриптик только threshold находит а размыть и наложить его не может... по идее должен работать не медленнее чем твой скрипт с битмапдатами |
|
|||||
|
О, я все таки догадался... если сделать копию объекта и чтобы бендеровский скрипт делал альфу равной 0 у всех пикселей кроме засвеченных, и наложить на него обычный встроенный в флеш блюр, эффект становится таким же!
замерял все FPS на стареньком 1.7 ггц селерончике с кучей запущенной ерунды, показывает >1000 FPS. то есть 0 ms выполнение.. Может я меряю неправильно? function oef(e:Event=null):void
{
var t1:int=getTimer();
var sf:ShaderFilter=new ShaderFIlter(shader);
glow.filters=[sf, new GlowFilter(0xFFFFFFF, 1, 30, 30, 3, 2)];
fps.text=(getTimer()-t1)+'ms';
}
![]() Последний раз редактировалось TERRORist; 24.12.2008 в 17:52. |
|
|||||
|
слегка офтоп,
не про свечение, а про производительность ShaderFilter поскольку TERRORist закроил сравнение , нарисовал свой тесткартинку считаем или через ShaderFilter со скриптом из 1го поста или тремя threshold'ами из 4го поста, результат счета немного разный, но это неважно - хотелось просто сравнить производительность ощутимой разницы не обнаруживается, да и та в сторону преимущества threshold'а понятно, что речь о только о простых вещах, но все ж.. |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:21. |
|
|
« Предыдущая тема | Следующая тема » |
|
|