在独立模式下使用着色器

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 执行图像处理,则为 target 属性指派一个 BitmapData 实例。如果要处理二进制数据或数值数据,则指派 ByteArray 对象或 Vector.<Number> 实例给 target 属性。在该情形下,您必须设置 ShaderJob 对象的 widthheight 属性,以指定输出到 target 对象的数据量。

注: 您可以一步完成 ShaderJob 对象 shadertargetwidthheight 属性的设置,方法是将相应的参数传递给 ShaderJob() 构造函数,如: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);