Когда шейдер используется в автономном режиме, его обработка выполняется независимо от предполагаемого применения вывода. Нужно указать шейдер для выполнения, задать значения ввода и параметры, выбрать объект, в который будет помещен вывод. Использование шейдера в автономном режиме может потребоваться по двум причинам.
-
Обработка неграфических данных. В автономном режиме шейдеру можно передать произвольные двоичные или числовые данные вместо данных растрового изображения. Можно указать, что шейдер должен вернуть полученный результат как двоичные или числовые данные, в дополнение к данным растрового изображения.
-
Фоновая обработка. При работе в автономном режиме шейдер по умолчанию выполняется асинхронно. Это означает, что шейдер выполняется в фоне, не вмешиваясь в работу приложения. Вывод передается коду после завершения обработки. Так можно использовать шейдер, на выполнение которого требуется много времени, чтобы он не «замораживал» пользовательский интерфейс приложения и другие операции обработки.
Объект ShaderJob служит для выполнения шейдера в автономном режиме. Сначала создается объект ShaderJob и связывается с объектом Shader, представляющим шейдер, который нужно выполнить.
var job:ShaderJob = new ShaderJob(myShader);
Затем задаются значения ввода или параметры, необходимые для работы шейдера. Если шейдер выполняется в фоновом режиме, также необходимо зарегистрировать прослушиватель для события
complete
объекта ShaderJob. Прослушиватель вызывается после завершения работы шейдера.
function completeHandler(event:ShaderEvent):void
{
// do something with the shader result
}
job.addEventListener(ShaderEvent.COMPLETE, completeHandler);
Затем создается объект, в который будет записан вывод шейдера после завершения операции. Этот объект назначается свойству
target
объекта ShaderJob.
var jobResult:BitmapData = new BitmapData(100, 75);
job.target = jobResult;
Назначьте свойству
target
объект BitmapData, если ShaderJob используется для обработки изображения. Если же обрабатываются двоичные или числовые данные, назначьте объект ByteArray или Vector.<Number> свойству
target
. В этом случае необходимо задать свойства
width
и
height
объекта ShaderJob, чтобы указать объем данных для вывода в объект
target
.
Примечание.
Чтобы одновременно задать свойства
shader
,
target
,
width
и
height
объекта ShaderJob, нужно передать аргументы конструктору
ShaderJob()
, например:
var job:ShaderJob = new ShaderJob(myShader, myTarget, myWidth, myHeight);
Когда потребуется выполнить шейдер, вызовите метод
start(
) объекта ShaderJob.
job.start();
По умолчанию при вызове метода
start()
запускается асинхронное выполнение ShaderJob. В этом случае выполнение программы сразу переходит к следующей строке кода, а не ожидает завершения обработки шейдера. После завершения операции шейдера объект ShaderJob вызывает свои прослушиватели события
complete
, сообщая им о готовности. На этом этапе (то есть в теле прослушивателя события
complete
) объект
target
содержит результат операции шейдера.
Примечание.
Вместо использования объекта, назначенного свойству
target
, вывод шейдера непосредственно можно получить из объекта события, переданного методу прослушивателя. Объект события является экземпляром ShaderEvent. Объект ShaderEvent имеет три свойства, которые можно использовать для получения вывода в зависимости от типа данных объекта, заданного в свойстве
target
:
ShaderEvent.bitmapData
,
ShaderEvent.byteArray
и
ShaderEvent.vector
.
Также можно передать аргумент
true
методу
start()
. В этом случае операция шейдера выполняется синхронно. Выполнение всего кода (включая взаимодействие с пользовательским интерфейсом и другими событиями) приостанавливается до завершения обработки шейдера. После выполнения операции шейдера объект
target
получает вывод шейдера, и программа переходит к следующей строке кода.
job.start(true);