Использование шейдера в автономном режиме

Flash Player 10 и более поздних версий, Adobe AIR 1.5 и более поздних версий

Когда шейдер используется в автономном режиме, его обработка выполняется независимо от предполагаемого применения вывода. Нужно указать шейдер для выполнения, задать значения ввода и параметры, выбрать объект, в который будет помещен вывод. Использование шейдера в автономном режиме может потребоваться по двум причинам.

  • Обработка неграфических данных. В автономном режиме шейдеру можно передать произвольные двоичные или числовые данные вместо данных растрового изображения. Можно указать, что шейдер должен вернуть полученный результат как двоичные или числовые данные, в дополнение к данным растрового изображения.

  • Фоновая обработка. При работе в автономном режиме шейдер по умолчанию выполняется асинхронно. Это означает, что шейдер выполняется в фоне, не вмешиваясь в работу приложения. Вывод передается коду после завершения обработки. Так можно использовать шейдер, на выполнение которого требуется много времени, чтобы он не «замораживал» пользовательский интерфейс приложения и другие операции обработки.

Объект 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);