Action Script3 / Pixel Bender Compound Эффект размытия? - PullRequest
3 голосов
/ 14 ноября 2009

Мне нужен фильтр размытия Action Script3 / Pixel Bender с возможностью отображения.

У нас есть такое изображение, мы хотим применить такую ​​карту размытия, чтобы получить такой результат

альтернативный текст http://livedocs.adobe.com/en_US/AfterEffects/8.0/images/ef_182.png

Его также называют эффектом сложного размытия.

Кто-нибудь видел, как это делается с AS3 / Pixel Bender?

Кто-нибудь знает, где скачать такой эффект с источником?

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

У меня есть очень старая версия этого эффекта с разрешением до пикселя: http://www.quasimondo.com/archives/000564.php (включая источник as2)

Он работает путем создания нескольких размытых растровых изображений с радиусом размытия, увеличивающимся от 0 (или минимального радиуса, который вы выбираете) до максимального радиуса. Чем больше шагов размытия вы сделаете, тем лучше будет качество. Используя фильтр paletteMap, вы создаете маски для каждого слоя размытия таким образом, чтобы градиент перекрывался между каждым последовательным слоем. Затем вы рисуете каждый слой размытия поверх следующего, используя его маску.

Эту вторую фазу смешивания я бы, вероятно, предпочел бы сделать с пиксельным бендером.

3 голосов
/ 15 ноября 2009

Вы можете просто нарисовать размытое изображение (с изменением альфа-канала на карту значений размытия) на его оригинале, чтобы имитировать эффект.

Поскольку пиксель-бендер во Flash не поддерживает петли, создать хороший фильтр размытия сложно.

2 голосов
/ 24 ноября 2009

Следующий .pbk должен это сделать. Вы можете взглянуть на комментарии, чтобы увидеть, как бы вы усилили эффект размытия.

<languageVersion : 1.0;>
kernel NewFilter
<   namespace : "Your Namespace";
    vendor : "Your Vendor";
    version : 1;
    description : "your description";
>
{
    input image4 src1;
    input image4 src2;
    output pixel4 dst;

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

        // based on the current whiteness of pixel in src2 blur by a percentage.
        float4 val = sampleNearest(src2,pos);
        float percent = val[0];

        // this takes into account only the closest level of pixels to make the blur more in depth 
        // you can add the next 16 or even the 24 after that. 
        float4 pix = sampleNearest(src1,pos);
        float4 pixNE = sampleNearest(src1,float2(pos.x+1.0, pos.y+1.0));
        float4 pixE = sampleNearest(src1,float2(pos.x+1.0, pos.y));
        float4 pixSE = sampleNearest(src1,float2(pos.x+1.0, pos.y-1.0));
        float4 pixS = sampleNearest(src1,float2(pos.x, pos.y-1.0));
        float4 pixSW = sampleNearest(src1,float2(pos.x-1.0, pos.y-1.0));
        float4 pixW = sampleNearest(src1,float2(pos.x-1.0, pos.y));
        float4 pixNW = sampleNearest(src1,float2(pos.x-1.0, pos.y+1.0));
        float4 pixN = sampleNearest(src1,float2(pos.x, pos.y+1.0));

        float4 result;
        // the result is the whiteness percentage of the original pixel averaged with the surrounding pixels.
        // if you added more of the surrounding pixels you can consider them in the weighted average also and get a deeper blur.
        result[0] = percent*pix[0]+(1.0-percent)*(pixNE[0]+pixE[0]+pixSE[0]+pixS[0]+pixSW[0]+pixW[0]+pixNW[0]+pixN[0])/8.0;
        result[1] = percent*pix[1]+(1.0-percent)*(pixNE[1]+pixE[1]+pixSE[1]+pixS[1]+pixSW[1]+pixW[1]+pixNW[1]+pixN[1])/8.0;
        result[2] = percent*pix[2]+(1.0-percent)*(pixNE[2]+pixE[2]+pixSE[2]+pixS[2]+pixSW[2]+pixW[2]+pixNW[2]+pixN[2])/8.0;
        result[3] = pix[3];

        dst = result;
    }
}
...