在獨立模式中使用著色器

Flash Player 10 以及更新的版本,Adobe AIR 1.5 以及更新的版本

當您在獨立模式中使用著色器時,著色器程序的執行方式與輸出的使用方式無關。您必須指定要執行的著色器、設定輸入和參數值,然後指定要在其中放置結果資料的物件。基於下列兩個原因,您可以在獨立模式中使用著色器:

  • 處理非影像的資料:在獨立模式中,您可以選擇將任意二進位或數字資料 (而非點陣圖影像資料) 傳遞至著色器。除了點陣圖影像資料以外,您還可以選擇要以二進位資料或數字資料傳回著色器結果。

  • 背景處理:當您在獨立模式中執行著色器時,著色器預設會以非同步方式執行。這表示,在應用程式繼續執行期間,著色器會於背景執行,而在著色器處理完成時,您的程式碼會收到通知。您可以使用需要長時間執行的著色器,在執行期間,著色器並不會導致應用程式使用者介面或其它程序發生無法回應的情況。

您可以使用 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 物件的 widthheight 屬性,指定要輸出至 target 物件的資料量。

備註: 您可以傳遞引數至 ShaderJob() 建構函式,一次設定 ShaderJob 物件的 shadertargetwidthheight 屬性,如下所示:var job:ShaderJob = new ShaderJob(myShader, myTarget, myWidth, myHeight);

當您要開始執行著色器時,請呼叫 ShaderJob 物件的 start() 方法:

job.start();

根據預設,呼叫 start() 可以讓 ShaderJob 以非同步方式執行。在這種情況下,程式會立刻從下一行程式碼繼續執行,而不需要等待著色器作業完成。當著色器作業完成時,ShaderJob 物件會呼叫其 complete 事件偵聽程式,告知這些偵聽程式作業已經完成。在這個時候 (也就是在 complete 事件偵聽程式的主體中),target 物件會包含著色器作業結果。

備註: 您可以直接從傳遞至偵聽程式方法的事件物件擷取著色器結果,而不必使用 target 屬性。這個事件物件是 ShaderEvent 實體。視您設定為 target 屬性之物件的資料類型,ShaderEvent 物件具有可用來存取結果的三個屬性:ShaderEvent.bitmapDataShaderEvent.byteArrayShaderEvent.vector

此外,您也可以傳遞 true 引數至 start() 方法。在這種情況下,著色器作業會以同步方式執行。如此一來,所有程式碼 (包括與使用者介面的互動及其它事件) 都會暫停,直到著色器作業完成為止。當著色器作業完成時,target 物件會包含著色器結果,然後程式會從下一行程式碼繼續執行。

job.start(true);