Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   PixelBender эффект свечения (http://www.flasher.ru/forum/showthread.php?t=119566)

TERRORist 24.12.2008 01:24

PixelBender эффект свечения
 
Хочу создать фильтр свечения ярких объектов (скажем если сфоткана яркая точка то вокруг нее появится мягкий свет) в pixelbender...

Я знаю как узнать координаты самых ярких пикселей, проблема как их потом "размыть" по соседним... Кто нить может помочь?

Проблема в том что циклы он не поддерживает, выходит при радиусе размытия скажем 20 пикселей мне придется вручную писать 2*(20^2)=800 if'ов? :eek:

вот что я уже написал:

Код:

<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;
    }
}

скриптик окрасит светлые пиксели в кардинально белый цвет
как теперь размыть это дело?

flash33 24.12.2008 01:52

Что б
Цитата:

скриптик окрасит светлые пиксели в кардинально белый цвет
бендер не нужен (threshold). Вы уверены что и для остального без бендера не обойтись? ;)

TERRORist 24.12.2008 01:55

А вы запускали этот скрипт? это не совсем theshold...
Мне нужно чтобы FSP был приличный.

silin 24.12.2008 13:05

такой вариант навскидку,
производительность не тестировал, с pixelbender не сравнивал
Код AS3:

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);


TERRORist 24.12.2008 15:34

6.5 fps... только для статической картинки такое можно использовать

silin 24.12.2008 15:52

а сколько pixelbender такую же картинку считает?

TERRORist 24.12.2008 16:58

да в том то и дело что я не могу получить аналогичный результат в пиксельбендере поэтому я и создал тему!)

скриптик только threshold находит а размыть и наложить его не может...

по идее должен работать не медленнее чем твой скрипт с битмапдатами

silin 24.12.2008 17:03

да не обязательно аналогичный, хотя бы тот, что светлые пиксели красит сколько считает?

TERRORist 24.12.2008 17:39

О, я все таки догадался... если сделать копию объекта и чтобы бендеровский скрипт делал альфу равной 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';
}

http://www.imageup.ru/img9/test77728.jpg

silin 25.12.2008 12:19

слегка офтоп,
не про свечение, а про производительность ShaderFilter
поскольку TERRORist закроил сравнение :), нарисовал свой тест
картинку считаем или через ShaderFilter со скриптом из 1го поста или
тремя threshold'ами из 4го поста, результат счета немного разный, но это неважно - хотелось просто сравнить производительность
ощутимой разницы не обнаруживается, да и та в сторону преимущества threshold'а

понятно, что речь о только о простых вещах, но все ж..


Часовой пояс GMT +4, время: 10:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.