ピクセルベンダーを使ったモザイクフィルター

(サンプル一覧を表示する)

FlashDevelop を使って、ピクセルベンダーを使ったモザイクフィルターのテストをしてみました。
これは、Flash Player 10 以降でないと動作しません。

ants Lab. さんの記事で、ピクセルベンダーという、
ピクセル処理用言語の解説が書かれていたので、そのままソースコードをお借りしています。
これは Flash だけでなく、PhotoShop のフィルターとしても使えるようです。
ピクセルシェーダーの言語の詳細は分かりませんが、これを使うことで
ピクセル単位の処理を GPU に任せるというようなことが可能になるようです。
対応していないグラフィックカードの場合、CPU でエミュレーションするみたいです。
(追記 : Flash では GPU を使わないみたいです。。)

ピクセルベンダーのコード (.pbk) は、FlashDevelop ではコンパイルできないので、
変更する時は Adobe Labs から Pixel Bender Toolkit をダウンロードする必要があります。

写真素材は、LittleHut さんからお借りしました。
Flash の実行画面
ピクセルベンダーを使ったモザイクフィルター

Flashプレーヤーが入っていないか、JavaScriptが無効になっているようです。

Get Adobe Flash player

ピクセルベンダーを使ったモザイクフィルター
Flash の画面上でマウスを移動させてみてください。

ソースコード

package 
{
	import flash.display.Bitmap;
	import flash.display.BlendMode;
	import flash.display.Shader;
	import flash.display.ShaderParameter;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.ShaderFilter;
	
	/**
	 * ピクセルブレンダーを使ったモザイクフィルターのサンプル
	 * @author Hikipuro
	 */
	public class Main extends Sprite 
	{
		/**
		 * コンパイル済みのシェーダ
		 */
		[Embed(source="mosaic.pbj", mimeType="application/octet-stream")]
		private var myShader:Class;
		
		/**
		 * 画面に表示する画像
		 */
		[Embed(source='../image/test001.jpg')]
		private var image:Class;
		
		/**
		 * 画面に表示する画像のビットマップ
		 */
		private var bitmap:Bitmap;
		
		/**
		 * シェーダ
		 */
		private var shader:Shader;
		
		/**
		 * コンストラクタ
		 */
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
		
		/**
		 * 初期化メソッド
		 * @param	e
		 */
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			
			// シェーダの作成
			// コードは埋め込みファイルから取得
			shader = new Shader();
			shader.byteCode = new myShader();
			
			// 画面に表示する画像の準備
			bitmap = Bitmap(new image);
			addChild(bitmap);
			
			// マウス移動イベントの登録
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
		}
		
		/**
		 * マウス移動イベント
		 * @param	event
		 */
		private function onMouseMove(event:MouseEvent):void
		{
			// position パラメータの更新
			var param:ShaderParameter = shader.data["position"];
			param.value = [mouseX, mouseY];
			
			// フィルターとして適用
			var filter:ShaderFilter = new ShaderFilter(shader);
			bitmap.filters = [filter];
		}
	}
	
}
		

FlashDevelop 3.0.0 Beta9 では、Shader クラス等のコード補完が利かないので、
FlashDevelop 3.0.0 RC1 以降を使った方が良いと思います。
また、古い Flex SDK では、コンパイルできないかもしれません。

外部リンク