在独立模式下使用着色器时,着色器处理的运行独立于其输出结果的用途。指定要执行的着色器、设置输入值和参数值,及指定用于放置结果数据的对象。在以下两种情形中,可以考虑以独立模式使用着色器:
-
处理非图像数据:在独立模式下,您可以选择将任意二进制数据或数值数据(而非位图图像数据)传递给着色器。除位图图像数据外,您还可以选择将着色器结果以二进制数据或数值数据的形式返回。
-
背景处理:以独立模式运行着色器时,着色器默认为异步运行。这表示,在您的应用程序继续运行的同时,着色器以后台方式运行,并在其处理结束时通知您的代码。您可以使用运行耗时的着色器,它在运行时不会导致应用程序用户界面或其他处理响应迟缓。
使用 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 对象的
width
和
height
属性,以指定输出到
target
对象的数据量。
注:
您可以一步完成 ShaderJob 对象
shader
、
target
、
width
和
height
属性的设置,方法是将相应的参数传递给
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.bitmapData
、
ShaderEvent.byteArray
和
ShaderEvent.vector
。
或者,可以将
true
参数传递给
start()
方法。在该情形下,着色器操作将同步执行。所有代码(包括与用户界面及所有其他事件的交互)在着色器执行时暂停。着色器完成处理后,
target
对象包含着色器结果,程序继续执行下一行代码。
job.start(true);