Hatena::ブログ(Diary)

最速チュパカブラ研究会

 | 

2008年5月18日

AstroのShaderFilter 17:23

AstroことFlash Player 10では、プログラマブルシェーダのようなモデルで独自の画像フィルタを記述できるShaderFilterというものがお目見えしました。そこで、このShaderFilterを早速使ってみました。

screenshot

http://www.libspark.org/svn/as3/Astro/ShaderFilter/Mudflow/index.html (要Flash Player 10)

古典的な2Dメタボールです。グラディウスVの通称「バスクリン」の真似ですが、グラディウスのほうは白飛びでメタボールっぽく見せているのに対して、こちらはちゃんと閾値で切る処理をやっています。下図のように、輝度が閾値以上のところだけ残すという処理をShaderFilterでやります。

2d metaball

Astroのシェーダのモデルは下図のような感じ。元画像を入力として受け取り、ピクセルを出力するのがShader。3DCGのシェーダと違って、座標変換との絡みがないので実に簡単です。シェーディングしてないのにシェーダという名称はどうなんだという気もしますが。

shader model

実際のシェーダのコードは以下。

<languageVersion : 1.0;>

kernel MetaballFilter
<   namespace : "gyuque";
    vendor : "gyuque";
    version : 1;
    description : "2d metaball";
>
{
        parameter float thresh
    <
        minValue: float(0);
        maxValue: float(1);
        defaultValue: float(0.5);
        description: "thresh";
    >;

        parameter pixel4 color
    <
        defaultValue: pixel4(1,0,0,1);
        description: "output color";
    >;

    input image4 src;
    output pixel4 dst;

    void
    evaluatePixel()
    {
        pixel4 sp = sampleNearest(src,outCoord());
        
        dst = sp.r >= thresh ? color : pixel4(0,0,0,0);
    }
}

長々と書いてありますが、本質的な部分は、この2行だけ。

 pixel4 sp = sampleNearest(src,outCoord()); // 元画像から、出力側と同じ位置のピクセルを取得

 dst = sp.r >= thresh ? color : pixel4(0,0,0,0); // 閾値未満なら透明なピクセルを出力する

AS側の記述については、以下のページを参照のこと

ところで、まともなGPUが載ったマシンを持っていないので分らないんですが、ちゃんとHWアクセラレーション効くんでしょうか

 | 
Connection: close