スタンドアローンモードでシェーダーを使用する場合は、出力の用途に依存せずに、シェーダーの処理が実行されます。実行するシェーダーを指定し、入力およびパラメーター値を設定し、結果のデータを配置するオブジェクトを指定します。次の 2 つの場合に、スタンドアローンモードでシェーダーを使用できます。
-
イメージ以外のデータの処理:スタンドアローンモードでは、ビットマップイメージデータではなく、任意のバイナリデータまたは数値データをシェーダーに渡すように選択できます。シェーダーの結果は、ビットマップイメージデータのほか、バイナリデータまたは数値データとして返されるように選択できます。
-
バックグラウンド処理:スタンドアローンモードでシェーダーを実行する場合、シェーダーはデフォルトで非同期で実行されます。これにより、アプリケーションの実行が続行している間、シェーダーがバックグラウンドで実行され、シェーダーの処理が完了するとコードに通知されます。実行時間の長いシェーダーを使用しても、シェーダーの実行中にアプリケーションのユーザーインターフェイスやその他の処理が一時停止することはありません。
スタンドアローンモードでシェーダーを実行するには、ShaderJob オブジェクトを使用します。まず、ShaderJob オブジェクトを作成し、実行するシェーダーを表す Shader オブジェクトにこれをリンクします。
var job:ShaderJob = new ShaderJob(myShader);
次に、シェーダーが使用する入力またはパラメーター値を設定します。バックグラウンドでシェーダーを実行している場合は、ShaderJob オブジェクトの
complete
イベントのリスナーも登録します。シェーダーの処理が完了すると、リスナーが呼び出されます。
function completeHandler(event:ShaderEvent):void
{
// do something with the shader result
}
job.addEventListener(ShaderEvent.COMPLETE, completeHandler);
次に、シェーダー処理の完了時に処理結果が書き込まれるオブジェクトを作成します。このオブジェクトを、ShaderJob オブジェクトの
target
プロパティに割り当てます。
var jobResult:BitmapData = new BitmapData(100, 75);
job.target = jobResult;
ShaderJob をイメージ処理に使用している場合は、BitmapData インスタンスを
target
プロパティに割り当てます。バイナリまたは数値データの処理を行う場合は、ByteArray オブジェクトまたは Vector.<Number> インスタンスを
target
プロパティに割り当てます。この場合は、ShaderJob オブジェクトの
width
および
height
プロパティを設定して、
target
オブジェクトに出力されるデータの大きさを指定する必要があります。
注意:
ShaderJob オブジェクトの
shader
、
target
、
width
および
height
プロパティを一度に設定するには、
ShaderJob()
コンストラクターに引数を渡します。例えば、次のようになります。
var job:ShaderJob = new ShaderJob(myShader, myTarget, myWidth, myHeight);
シェーダーを実行する準備ができたら、ShaderJob オブジェクトの
start(
) メソッドを呼び出します。
job.start();
デフォルトでは、
start()
の呼び出しによって、ShaderJob が非同期で実行されます。この場合、プログラムは、シェーダーの完了を待機せずに、直ちに次のコード行を続行します。シェーダー処理が完了すると、ShaderJob オブジェクトは自身の
complete
イベントリスナーを呼び出し、完了を通知します。この時点で(つまり、
complete
イベントリスナーの本体内)、
target
オブジェクトにはシェーダー処理の結果が含まれています。
注意:
target
プロパティオブジェクトを使用するのではなく、リスナーメソッドに渡されたイベントオブジェクトから直接シェーダーの結果を取得できます。イベントオブジェクトは、ShaderEvent インスタンスです。ShaderEvent オブジェクトには、
target
プロパティとして設定したオブジェクトのデータ型に応じて、結果にアクセスするために使用できる 3 つのプロパティがあります。これらは、
ShaderEvent.bitmapData
、
ShaderEvent.byteArray
、
ShaderEvent.vector
です。
他の方法として、
true
引数を
start()
メソッドに渡すこともできます。この場合は、シェーダー処理が同期的に実行されます。すべてのコード(ユーザーインターフェイスやその他のイベントとの対話など)は、シェーダーの実行中に停止します。シェーダーが完了すると、
target
オブジェクトにはシェーダーの結果が含まれ、プログラムは次のコード行を続行します。
job.start(true);