Using a shader in stand-alone mode

When you use a shader in stand-alone mode, the shader processing runs independent of how you intend to use the output. You specify a shader to execute, set input and parameter values, and designate an object into which the result data is placed. You can use a shader in stand-alone mode for two reasons:

  • Processing non-image data: In stand-alone mode, you can choose to pass arbitrary binary or number data to the shader rather than bitmap image data. You can choose to have the shader result be returned as binary data or number data in addition to bitmap image data.

  • Background processing: When you run a shader in stand-alone mode, by default the shader executes asynchronously. This means that the shader runs in the background while your application continues to run, and your code is notified when the shader processing finishes. You can use a shader that takes a long time to run and it doesn’t freeze up the application user interface or other processing while the shader is running.

You use a ShaderJob object to execute a shader in stand-alone mode. First you create the ShaderJob object and link it to the Shader object representing the shader to execute:

var job:ShaderJob = new ShaderJob(myShader);

Next, you set any input or parameter values that the shader expects. If you are executing the shader in the background, you also register a listener for the ShaderJob object’s complete event. Your listener is called when the shader finishes its work:

function completeHandler(event:ShaderEvent):void 
{ 
    // do something with the shader result 
} 
 
job.addEventListener(ShaderEvent.COMPLETE, completeHandler);

Next, you create an object into which the shader operation result is written when the operation finishes. You assign that object to the ShaderJob object’s target property:

var jobResult:BitmapData = new BitmapData(100, 75); 
job.target = jobResult;

Assign a BitmapData instance to the target property if you are using the ShaderJob to perform image processing. If you are processing binary or number data, assign a ByteArray object or Vector.<Number> instance to the target property. In that case, you must set the ShaderJob object’s width and height properties to specify the amount of data to output to the target object.

Note: You can set the ShaderJob object’s shader , target , width , and height properties in one step by passing arguments to the ShaderJob() constructor, like this: var job:ShaderJob = new ShaderJob(myShader, myTarget, myWidth, myHeight);

When you are ready to execute the shader, you call the ShaderJob object’s start( ) method:

job.start();

By default calling start() causes the ShaderJob to execute asynchronously. In that case program execution continues immediately with the next line of code rather than waiting for the shader to finish. When the shader operation finishes, the ShaderJob object calls its complete event listeners, notifying them that it is done. At that point (that is, in the body of your complete event listener) the target object contains the shader operation result.

Note: Instead of using the target property object, you can retrieve the shader result directly from the event object that’s passed to your listener method. The event object is a ShaderEvent instance. The ShaderEvent object has three properties that can be used to access the result, depending on the data type of the object you set as the target property: ShaderEvent.bitmapData , ShaderEvent.byteArray , and ShaderEvent.vector .

Alternatively, you can pass a true argument to the start() method. In that case the shader operation executes synchronously. All code (including interaction with the user interface and any other events) pauses while the shader executes. When the shader finishes, the target object contains the shader result and the program continues with the next line of code.

job.start(true);