仕事の忙しいのは続いているのですが、合間を見てPixelBenderの勉強を今更ながらじわじわと始めています。
何故かと言うと、実は画像の処理がよくわかっておらず、PixelBenderのソースコードを見てこれならいけるんじゃなかろうかと。
また、先日行ったAdobeMaxでもFITCの人がPixelBender速いぜ!みたいな事を言っておられましたので、少しやってみようかなと。
まず、導入の仕方やチュートリアルは以下の記事を参考にしました。
Adobe Pixel Benderでのブレンド、フィルタおよび塗りの作成
この記事だけでも十分にわかりやすいのですが、
AdobeのウェブサイトにPixel Bender ExchangeというPixcelBenderファイルの公開サイトがあります。
(実は私の欲しかったものはここでまかなえてしまったのですが。。)
このファイルを見て、PixelBenderToolkitのヘルプを見て、という感じで進めていきました。ただ、実際にFlashで適用させるにはFlash10で書き出さなければならない。。。でもCS4持ってない。。ということでWonderflを利用させてもらっているのですが、思いっきりはまってしまいました。
まずShaderをフィルタとして使用する場合は何の問題も無くFlash側で使用出来ました。
思うような動作を実現できなかったのが、blendShaderにShaderを設定する場合です。
2つの画像を使用する場合はblendShaderでブレンドするという形になります。
やりたかったのは2つの画像のクロスフェードだったのですが、一番最初のフレームで最後に設定した後、フレームを進めてblendShaderにShaderを設定しても反映されませんでした。
(サンプルはコマンドになってますが、EnterFrameで散々いろいろやったあげくの悪あがきです)
ようするに以下のように書いた場合は
_fadeShader = new Shader(_pbloader.data);
_fadeShader.data.intencity.value = [0.3];
_container2.blendShader = _fadeShader;
//以下が適用される
_fadeShader.data.intencity.value = [0.5];
_container2.blendShader = _fadeShader;
後ろのintencityが0.5が適用されて、
~
_fadeShader.data.intencity.value = [0.5];
_container2.blendShader = _fadeShader;
addEventListener(Event.ENTER_FRAME,enterFrameHandler);
}
private function enterFrameHandler(e:Event):void{
//こちらは反映されない
_fadeShader.data.intencity.value = [0.3];
_container2.blendShader = _fadeShader;
}
とした場合は最初に設定したintencityが0.5が適用されます。
ちなみに後者のPixcelBenderソースコード貼っておきます。
kernel CrossFade
< namespace : "northprint";
vendor : "";
version : 1;
description : "CrossFade";
>
{
input image4 src;
input image4 src2;
output pixel4 dst;
parameter float intencity
<
minValue:0.0;
maxValue:1.0;
defaultValue:0.5;
>;
void
evaluatePixel()
{
float4 frontPixcel = sampleNearest(src,outCoord());
float4 backPixcel = sampleNearest(src2,outCoord());
dst = mix(frontPixcel,backPixcel,intencity);
}
}
これだけで画像のミックスが出来ちゃう。
これが動的に変えられないのは悲しいです。(そもそもこういう事を意図されていないのかもしれませんが。。描画が更新されていないだけ???)
まだよく分かっていないながら使っているので、もう少しがんばってみようと思います。間違ってるよ!という場合は指摘いただけると泣いて喜びます。