flash.display
public class Shader
继承Shader Inheritance Object

语言版本: ActionScript 3.0
运行时版本: Flash Player 10, AIR 1.5

Shader 实例表示 ActionScript 中的 Pixel Bender 着色器内核。若要在应用程序中使用着色器,请为它创建一个 Shader 实例。然后,根据要创造的效果,按适当的方式使用该 Shader 实例。例如,若要将着色器用作滤镜,可将 Shader 实例赋予 ShaderFilter 对象的 shader 属性。

着色器定义对图像中的所有像素执行的函数(一次一个像素)。对该函数的每次调用的结果都是图像中该像素坐标处的输出颜色。着色器可以指定一个或多个输入图像,这些图像的内容可用于确定函数的输出。着色器还可以指定一个或多个参数,这些参数是可用于计算函数输出的输入值。在单一着色器执行中,输入和参数值是常量。唯一发生变化的是像素(其颜色是函数结果)的坐标。针对多个输出像素坐标的着色器函数调用将并行执行,以改进着色器执行性能。

可以使用 URLLoader 实例在运行时加载着色器字节码。下面的示例演示如何在运行时加载着色器字节码文件并将其链接到一个 Shader 实例。

var loader:URLLoader = new URLLoader();
  loader.dataFormat = URLLoaderDataFormat.BINARY;
  loader.addEventListener(Event.COMPLETE, onLoadComplete);
  loader.load(new URLRequest("myShader.pbj"));
   
  var shader:Shader;
   
  function onLoadComplete(event:Event):void {
      // Create a new shader and set the loaded data as its bytecode
      shader = new Shader();
      shader.byteCode = loader.data;
      
      // You can also pass the bytecode to the Shader() constructor like this:
      // shader = new Shader(loader.data);
      
      // do something with the shader
  }

您还可以使用 [Embed] 元数据标记在编译时将着色器嵌入 SWF。只有在使用 Flex SDK 编译 SWF 时,[Embed] 元数据标记才可用。[Embed] 标记的 source 参数指向着色器文件,并且其 mimeType 参数为“application/octet-stream”,如此例中所示:

[Embed(source="myShader.pbj", mimeType="application/octet-stream)]
  var MyShaderClass:Class;
   
  // ...
  
  // create a new shader and set the embedded shader as its bytecode
  var shaderShader = new Shader();
  shader.byteCode = new MyShaderClass();
   
  // You can also pass the bytecode to the Shader() constructor like this:
  // var shader:Shader = new Shader(new MyShaderClass());
   
  // do something with the shader

在任何一种情况下,都可以将原始着色器(URLLoader.data 属性或 [Embed] 数据类的实例)链接到 Shader 实例。如前面的示例所演示,您可以采用两种方式执行此操作。可以将着色器字节代码作为参数传递到 Shader() 构造函数。或者,可以将其设置为 Shader 实例的 byteCode 属性。

创建了 Shader 实例后,即可通过以下若干方式之一使用该实例:

查看示例

另请参见

flash.display.DisplayObject.blendShader
flash.display.Graphics.beginShaderFill()
flash.display.ShaderJob
flash.filters.ShaderFilter
flash.net.URLLoader


公共属性
 属性定义方
  byteCode : ByteArray
[只写] 此 Shader 实例的原始着色器字节代码。
Shader
 Inheritedconstructor : Object
对类对象或给定对象实例的构造函数的引用。
Object
  data : ShaderData
提供对 Shader 实例的参数、输入图像和元数据的访问。
Shader
  precisionHint : String
着色器所执行数学运算的精度。
Shader
 Inheritedprototype : Object
[静态] 对类或函数对象的原型对象的引用。
Object
公共方法
 方法定义方
  
Shader(code:ByteArray = null)
创建一个新的 Shader 实例。
Shader
 Inherited
指示对象是否已经定义了指定的属性。
Object
 Inherited
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object
 Inherited
指示指定的属性是否存在、是否可枚举。
Object
 Inherited
设置循环操作动态属性的可用性。
Object
 Inherited
返回指定对象的字符串表示形式。
Object
 Inherited
返回指定对象的原始值。
Object
属性详细信息
byteCode属性
byteCode:ByteArray  [只写]

语言版本: ActionScript 3.0
运行时版本: Flash Player 10, AIR 1.5

此 Shader 实例的原始着色器字节代码。



实现
    public function set byteCode(value:ByteArray):void
data属性 
data:ShaderData  [读写]

语言版本: ActionScript 3.0
运行时版本: Flash Player 10, AIR 1.5

提供对 Shader 实例的参数、输入图像和元数据的访问。在创建 Shader 实例时,将动态添加表示着色器参数的 ShaderParameter 对象、表示着色器输入图像的 ShaderInput 对象以及表示着色器元数据的其它值,作为 data 属性对象的属性。可以使用这些属性对着色器进行内部检查,以及设置参数和输入值。

有关访问和处理 data 对象的动态属性的信息,请参阅 ShaderData 类说明。



实现
    public function get data():ShaderData
    public function set data(value:ShaderData):void

另请参见

precisionHint属性 
precisionHint:String  [读写]

语言版本: ActionScript 3.0
运行时版本: Flash Player 10, AIR 1.5

着色器所执行数学运算的精度。

precisionHint 属性的可能值的集合由 ShaderPrecision 类中的常量定义。

默认值为 ShaderPrecision.FULL。将精度设置为 ShaderPrecision.FAST 可以加快数学运算速度,但会降低精度。

full 精度模式 (ShaderPrecision.FULL) 将按照 IEEE 32 位浮点标准的全宽计算所有数学运算,并在所有平台上提供一致的行为。在此模式下,某些数学运算(比如三角函数和指数函数)可能速度较慢。

fast 精度模式 (ShaderPrecision.FAST) 旨在获得最高性能,但在不同平台上和各种 CPU 配置下工作不一致。多数情况下,这种精度级别足以创建无可见失真的图形效果。

精度模式选择将影响以下着色器操作。在包含 SSE 指令集的 Intel 处理器上,这些操作的执行速度较快:



实现
    public function get precisionHint():String
    public function set precisionHint(value:String):void

另请参见

构造函数详细信息
Shader()构造函数
public function Shader(code:ByteArray = null)

语言版本: ActionScript 3.0
运行时版本: Flash Player 10, AIR 1.5

创建一个新的 Shader 实例。

参数
code:ByteArray (default = null) — 要链接到 Shader 的原始着色器字节代码。
示例 如何使用示例
ShaderExample.1.as

下面的示例在运行时加载着色器字节码文件,并创建一个链接到该文件的 Shader 实例。

请注意,此示例假设应用程序输出目录所在的同一目录中有一个名为“donothing.pbj”的着色器字节码文件。ShaderData 类示例中提供了 DoNothing 着色器的 Pixel Bender 源代码。

package {
    import flash.display.Shader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;

    public class LoadedShaderExample extends Sprite {
        
        private var loader:URLLoader;
        
        public function LoadedShaderExample() {
            loader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.BINARY;
            loader.addEventListener(Event.COMPLETE, loadCompleteHandler);
            loader.load(new URLRequest("donothing.pbj"));
        }
        
        private function loadCompleteHandler(event:Event):void {
            var shader:Shader = new Shader();
            shader.byteCode = loader.data;
            
            // do something with the Shader instance
        }
    }
}
ShaderExample.2.as

下面的示例通过将着色器字节码文件编译到 SWF 中来嵌入该文件,并创建一个链接到该文件的 Shader 实例。

请注意,此示例假设应用程序源代码所在的同一目录中有一个名为“donothing.pbj”的着色器字节码文件,并且使用了 Flex SDK 来编译 SWF。ShaderData 类示例中提供了 DoNothing 着色器的 Pixel Bender 源代码。

package {
    import flash.display.Shader;
    import flash.display.Sprite;

    public class EmbeddedShaderExample extends Sprite {
        
        [Embed(source="donothing.pbj", mimeType="application/octet-stream")]
        private static var DoNothingShader:Class;
        
        public function EmbeddedShaderExample() {
            var shader:Shader = new Shader();
            shader.byteCode = new DoNothingShader();
            
            // do something with the Shader instance
        }
    }
}