识别着色器输入和参数

指定着色器输入和参数值的第一步是确定要使用的特定着色器是否需要输入图像或参数。每个 Shader 实例都有一个包含 ShaderData 对象的 data 属性。如果着色器定义了任何输入或参数,则这些输入或参数可作为该 ShaderData 对象的属性进行访问。属性的名称与在着色器源代码中为输入和参数指定的名称相匹配。例如,如果着色器定义了一个名为 src 的输入,则 ShaderData 对象具有一个名为 src 的属性用于表示该输入。每个表示输入的属性都是一个 ShaderInput 实例,而每个表示参数的属性都是一个 ShaderParameter 实例。

理想情况下,着色器的创作者会提供着色器文档,用于指示着色器所需的输入图像值和参数、其所表示的内容以及正确的值等等。

但是,如果着色器不带有文档(并且您没有其源代码),则可以检查着色器数据以确定输入和参数。表示输入和参数的属性会动态添加到 ShaderData 对象。因此,可以使用 for..in 循环检查 ShaderData 对象,以确定其关联着色器是否定义了输入或参数。如访问着色器元数据中所述,为着色器定义的任何元数据值还可以作为添加到 Shader.data 属性的动态属性进行访问。在使用这种方法识别着色器输入和参数时,请检查动态属性的数据类型。如果属性是 ShaderInput 实例,则表示输入。如果是 ShaderParameter 实例,则表示参数。其它情况下,则是元数据值。下面的示例演示如何使用 for..in 循环检查着色器的 data 属性的动态属性。每个输入(ShaderInput 对象)都会添加到一个名为 inputs 的 Vector 实例。每个参数(ShaderParameter 对象)都会添加到一个名为 parameters 的 Vector 实例。最后,所有元数据属性都会添加到一个名为 metadata 的 Vector 实例。请注意,此示例假设已创建了名为 myShader 的 Shader 实例:

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