ホーム > Flash (ActionScript) > [Flash Player 10 #4] PixelBender のファイルを使わずにカスタムフィルターを定義

[Flash Player 10 #4] PixelBender のファイルを使わずにカスタムフィルターを定義

すっかり FlashPlayer 10 の魅力に取り付かれています。

‘08.10.09 追記:
CS4 からはメタデータを使ってファイルの埋め込みができるようになるようなので、こんな面倒臭いことしなくても大丈夫です。

通常、Shader を使用するときは pbj 形式のファイルが必要ですが、今回はこのファイルを使用せずにカスタムフィルターを作成するという試み。結果から言うと大成功でした。これで他の BitmapFilter 同様、import するだけでカスタムフィルターが使用できます。このやり方は流行ると思うなぁ。Adobe の人もこういう使い方を想定しているんでしょう、きっと。

まずはカスタムフィルターのコード。

package
{
    import flash.display.Shader;
    import flash.filters.ShaderFilter;
    import flash.utils.ByteArray;

    public class ColorizeFilter extends ShaderFilter
    {
        // ここが重要!
        // あらかじめ、PixelBender のバイナリデータをベクター情報として格納しておく。
        private static var _data:Vector.<int> = Vector.<int>([-91,1,0,0,0,-92,11,0,67,111,108,111,114,70,105,108,116,101,114,-96,12,110,97,109,101,115,112,97,99,101,0,109,117,116,97,0,-96,12,118,101,110,100,111,114,0,109,117,116,97,0,-96,8,118,101,114,115,105,111,110,0,1,0,-96,12,100,101,115,99,114,105,112,116,105,111,110,0,84,104,105,115,32,102,105,108,116,101,114,32,70,105,108,108,32,99,111,108,111,114,46,0,-95,1,2,0,0,12,95,79,117,116,67,111,111,114,100,0,-95,1,4,1,0,15,99,111,108,111,114,0,-94,4,100,101,102,97,117,108,116,86,97,108,117,101,0,0,0,0,0,0,0,0,0,0,0,0,0,63,-128,0,0,-94,12,100,101,115,99,114,105,112,116,105,111,110,0,99,111,108,111,114,0,-93,0,4,115,114,99,0,-95,2,4,2,0,15,100,115,116,0,48,3,0,-15,0,0,16,0,29,4,0,-13,3,0,27,0,1,4,0,-13,1,0,27,0,29,2,0,-13,4,0,27,0]);
        private static var _byteCode:ByteArray;

        private var _color:uint;

        public function ColorizeFilter(color:uint):void
        {
            // ムービーを通して初めての new 時のみ、Vector を ByteArray に変換する。
            if (_byteCode == null)
            {
                _byteCode = new ByteArray();

                for (var i:int = 0, l:int = _data.length; i < l; i++)
                {
                    _byteCode.writeByte(_data[i]);
                }
            }

            super(new Shader(_byteCode));

            this.color = color;
        }

        public function get color():uint
        {
            return _color;
        }

        public function set color(value:uint):void
        {
            _color = value;
            // プロパティのセッター内で Shader にデータを渡す。
            shader.data.color.value = [value >> 16, value >> 8 & 0xFF, value & 0xFF];
        }
    }
}

実際に使用するときのコード。

var data:BitmapData = Bitmap(new image()).bitmapData;

data.applyFilter(
    data,
    data.rect,
    new Point(),
    new ColorizeFilter(0xFF0000)
);

addChild(new Bitmap(data));

こんな感じで通常のフィルターと同じように import して new するだけで使用できます。今回のコード一式も例のごとく libspark に上げてますので、必要な方は http://www.libspark.org/svn/as3/Astro/ShaderFilter/CustomFilter/ 以下をチェックアウトしてください。

カテゴリー: Flash (ActionScript) タグ: , ,
  1. コメントはまだありません。
  1. トラックバックはまだありません。