存取著色器中繼資料

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

建立 Pixel Bender 著色器核心時,作者也可以在 Pixel Bender 原始碼中指定有關著色器的中繼資料。在 ActionScript 中使用著色器時,您也可以檢查著色器並擷取其中繼資料。

當您建立 Shader 實體並連結至 Pixel Bender 著色器時,就會建立包含有關著色器資料的 ShaderData 物件,並儲存在 Shader 物件的 data 屬性中。ShaderData 類別不會定義本身的任何屬性。但是在執行階段,則會為著色器原始碼中所定義的每個中繼資料值,以動態方式將屬性加入至 ShaderData 物件。每個屬性的名稱都與中繼資料內所指定的名稱相同。例如,假設 Pixel Bender 著色器的原始碼包含下列中繼資料定義:

namespace : "Adobe::Example"; 
vendor : "Bob Jones"; 
version : 1; 
description : "Creates a version of the specified image with the specified brightness.";

那麼,便會以下列屬性和值為該著色器建立 ShaderData 物件:

  • namespace (String): "Adobe::Example"

  • vendor (String): "Bob Jones"

  • version (String): "1"

  • description (String): "Creates a version of the specified image with the specified brightness"

由於中繼資料屬性是以動態方式加入至 ShaderData 物件,您可以使用 for..in 迴圈來檢查 ShaderData 物件。您可以使用這項技巧,查明著色器是否有任何中繼資料以及中繼資料的值。除了中繼資料屬性以外,ShaderData 物件也可以具有代表在著色器中所定義輸入和參數的屬性。當您使用 for..in 迴圈來檢查 ShaderData 物件時,請檢查每個屬性的資料類型,以判斷屬性是輸入 (ShaderInput 實體)、參數 (ShaderParameter 實體) 或中繼資料值 (String 實體)。下列範例說明如何使用 for..in 迴圈來檢查著色器 data 屬性的動態屬性。每一個中繼資料值都會加入至 Vector 實體 metadata。請注意,這個範例是假設 Shader 實體 myShader 已經建立:

var shaderData:ShaderData = myShader.data; 
var metadata:Vector.<String> = new Vector.<String>(); 
 
for (var prop:String in shaderData) 
{ 
    if (!(shaderData[prop] is ShaderInput) && !(shaderData[prop] is ShaderParameter)) 
    { 
        metadata[metadata.length] = shaderData[prop]; 
    } 
} 
 
// do something with the metadata

此範例還有另一種版本,可同時擷取著色器輸入和參數,請參閱識別著色器輸入和參數。如需有關輸入和參數屬性的詳細資訊,請參閱指定著色器輸入和參數值