访问着色器元数据

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 (字符串): "Adobe::Example"

  • vendor (字符串): "Bob Jones"

  • version (字符串): "1"

  • description (字符串): "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 属性的动态属性。每个元数据值都会添加到一个名为 metadata 的 Vector 实例。请注意,此示例假设已创建了名为 myShader 的 Shader 实例:

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

有关增加着色器输入和参数提取的此示例版本,请参阅 识别着色器输入和参数 。有关输入和参数属性的详细信息,请参阅 指定着色器输入和参数值