仕事の忙しいのは続いているのですが、合間を見て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); } }
これだけで画像のミックスが出来ちゃう。
これが動的に変えられないのは悲しいです。(そもそもこういう事を意図されていないのかもしれませんが。。描画が更新されていないだけ???)
まだよく分かっていないながら使っているので、もう少しがんばってみようと思います。間違ってるよ!という場合は指摘いただけると泣いて喜びます。

始めてコメントします。
僕も最近触り始めたのですが、同じような問題が昨日解決しました。
一旦blendModeを別の設定に切り替えてやると、シェーダーオブジェクトを再度解釈してくれるようです。
<イメージ>
ldr.blendMode = BlendMode.NORMAL; // ←これ
ldr.blendShader = shd;
ちょっとやな動きですね。blendShaderにセットしただけで再度解釈してほしいものですが。
>たまち様
ありがとうございます!!!感謝感謝です!
本当に泣けてきました。
しかし本当に嫌な動きですね。。。