フィルターでのシェーダーの使用Flash Player 10 以降、Adobe AIR 1.5 以降 フィルターでのシェーダーの使用は、ActionScript で他のフィルターを使用する場合と同じです。フィルターとしてシェーダーを使用する場合は、フィルターされたイメージ(表示オブジェクトまたは BitmapData オブジェクト)がシェーダーに渡されます。シェーダーは入力イメージを使用してフィルター出力を作成します。これは通常、元のイメージが変更されたイメージです。フィルターされたオブジェクトが表示オブジェクトである場合、シェーダーの出力は、画面上のフィルターされた表示オブジェクトの位置に表示されます。フィルターされたオブジェクトが BitmapData オブジェクトである場合は、シェーダーの出力が、applyFilter() メソッドが呼び出される BitmapData オブジェクトのコンテンツになります。 フィルターとしてシェーダーを使用するには、まず、シェーダーのロードまたは埋め込みで説明している手順で Shader オブジェクトを作成します。次に、Shader オブジェクトにリンクされた ShaderFilter オブジェクトを作成します。ShaderFilter オブジェクトは、フィルターされたオブジェクトに適用されるフィルターです。任意のフィルターを適用する場合と同じように、このフィルターをオブジェクトに適用します。これを表示オブジェクトの filters プロパティに渡すか、または BitmapData オブジェクトの applyFilter() メソッドを呼び出します。例えば、次のコードでは、ShaderFilter オブジェクトを作成し、homeButton という名前の表示オブジェクトにフィルターを適用します。 var myFilter:ShaderFilter = new ShaderFilter(myShader); homeButton.filters = [myFilter]; フィルターとしてシェーダーを使用する場合は、シェーダーに最低 1 つの入力を定義する必要があります。例に示すように、コードでは入力値を設定しません。その代わり、フィルターされた表示オブジェクトまたは BitmapData オブジェクトが入力イメージとして設定されています。2 つ以上の入力を使用するシェーダーでは、最初の 1 つ以外の入力値を指定します。 フィルターによって、元のイメージのサイズが変更される場合があります。例えば、一般的なドロップシャドウ効果では、イメージに追加されるシャドウを含んでいるピクセルが追加されます。イメージのサイズを変更するシェーダーを使用する場合は、イメージサイズをどのくらい変更するかを示す leftExtension、rightExtension、topExtension および bottomExtension の各プロパティを設定します。 次の例は、フィルターとしてシェーダーを使用する方法を示します。この例では、フィルターによってイメージの赤、緑、青チャンネルの値が反転されます。この結果、イメージの「負」のバージョンが生成されます。 注意: この例で使用しているシェーダーは、Pixel Bender Toolkit に含まれている、invertRGB.pbk という Pixel Bender カーネルです。Pixel Bender Toolkit インストールディレクトリからカーネルのソースコードをロードできます。ソースコードをコンパイルし、ソースコードと同じディレクトリにバイトコードファイルを保存します。
重要な ActionScript コードは、次の 2 つのメソッドにあります。
この例で使用しているシェーダーは、Pixel Bender Toolkit に含まれている、「invertRGB.pbk」という Pixel Bender カーネルのサンプルです。Pixel Bender Toolkit インストールディレクトリの invertRGB.pbk ファイルからソースコードを利用できます。ソースコードをコンパイルし、ActionScript ソースコードと同じディレクトリに、「invertRGB.pbj」という名前でバイトコードファイルを保存します。 この例の ActionScript コードは次のようになります。Flash Builder の ActionScript のみのプロジェクトでは、このクラスをメインアプリケーションクラスとして使用します。または、Flash Professional の FLA ファイルでは、ドキュメントクラスとして使用します。 package { import flash.display.GradientType; import flash.display.Graphics; import flash.display.Shader; import flash.display.Shape; import flash.display.Sprite; import flash.filters.ShaderFilter; import flash.events.Event; import flash.geom.Matrix; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; public class InvertRGB extends Sprite { private var shader:Shader; private var loader:URLLoader; public function InvertRGB() { init(); } private function init():void { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onLoadComplete); loader.load(new URLRequest("invertRGB.pbj")); } private function onLoadComplete(event:Event):void { shader = new Shader(loader.data); var target:Shape = new Shape(); addChild(target); var g:Graphics = target.graphics; var c:Array = [0x990000, 0x445500, 0x007799]; var a:Array = [255, 255, 255]; var r:Array = [0, 127, 255]; var m:Matrix = new Matrix(); m.createGradientBox(w, h); g.beginGradientFill(GradientType.LINEAR, c, a, r, m); g.drawRect(10, 10, w, h); g.endFill(); var invertFilter:ShaderFilter = new ShaderFilter(shader); target.filters = [invertFilter]; } } } フィルターの適用について詳しくは、フィルターの作成と適用を参照してください。 |
![]() |