Utilisation d’un shader en mode autonome

Flash Player 10 et les versions ultérieures, Adobe AIR 1.5 et les versions ultérieures

Lorsque vous utilisez un shader en mode autonome, son traitement s’exécute indépendamment de l’usage prévu du résultat. Vous spécifiez le shader à exécuter, définissez les valeurs d’entrée et de paramètres, puis stipulez un objet dans lequel seront placées les données résultantes. Vous pouvez utiliser un shader en mode autonome pour deux raisons :

  • Traitement de données non graphiques : en mode autonome, vous pouvez choisir de transmettre des données binaires ou numériques arbitraires au shader au lieu de données d’image bitmap. Le cas échéant, le résultat du shader peut être renvoyé sous forme de données binaires ou numériques en plus des données d’image bitmap.

  • Traitement en arrière-plan : lorsque vous exécutez un shader en mode autonome, il est exécuté en mode asynchrone par défaut. Cela signifie que le shader s’exécute en arrière-plan pendant que votre application continue à tourner et que votre code est averti une fois le traitement du shader terminé. Vous pouvez utiliser un shader sans pour autant bloquer l’interface utilisateur de l’application ou tout autre traitement, même si la durée de son exécution est élevée.

Un objet ShaderJob permet d’exécuter un shader en mode autonome. Vous commencez par créer un objet ShaderJob et vous le liez à l’objet Shader qui représente le shader à exécuter :

var job:ShaderJob = new ShaderJob(myShader);

Vous définissez ensuite toute valeur d’entrée ou de paramètre attendue par le shader. Si vous exécutez le shader en arrière-plan, vous enregistrez également un écouteur associé à l’événement complete de l’objet ShaderJob. Votre écouteur est appelé lorsque le shader termine sa tâche :

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

Vous créez ensuite un objet dans lequel est écrit le résultat de l’opération du shader, une fois celle-ci terminée. Vous affectez cet objet à la propriété target de l’objet ShaderJob :

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

Affectez une occurrence de BitmapData à la propriété target si vous utilisez l’objet ShaderJob pour exécuter le traitement de l’image. Si vous traitez des données binaires ou numériques, affectez un objet ByteArray ou une occurrence de Vector.<Number> à la propriété target . Si tel est le cas, vous devez définir les propriétés width et height de l’objet ShaderJob pour stipuler le volume de données à créer dans l’objet target .

Remarque : vous pouvez définir les propriétés shader , target , width et height de l’objet ShaderJob en une seule étape. Pour ce faire, transmettez les arguments au constructeur ShaderJob() , comme suit : var job:ShaderJob = new ShaderJob(myShader, myTarget, myWidth, myHeight); .

Lorsque vous êtes prêt à exécuter le shader, vous appelez la méthode start( ) de l’objet ShaderJob :

job.start();

Par défaut, appeler start() entraîne l’exécution asynchrone de l’objet ShaderJob. Dans ce cas, l’exécution du programme continue et passe immédiatement à la ligne suivante de code au lieu d’attendre que le shader soit terminé. Une fois l’opération du shader terminée, l’objet ShaderJob appelle ses écouteurs d’événement complete et les avertit. A ce stade (en d’autres termes, dans le corps de votre écouteur d’événement complete ), l’objet target contient le résultat de l’opération du shader.

Remarque : au lieu d’utiliser l’objet propriété target , vous pouvez extraire directement le résultat du shader de l’objet événement qui est transmis à la méthode d’écouteur. L’objet événement est une occurrence de ShaderEvent. L’objet ShaderEvent possède trois propriétés susceptibles d’être utilisées pour accéder au résultat, selon le type de données de l’objet défini en tant que propriété target : ShaderEvent.bitmapData , ShaderEvent.byteArray et ShaderEvent.vector .

Vous pouvez également transmettre un argument true à la méthode start() . Dans ce cas, l’opération du shader s’exécute en mode synchrone. Tout le code (y compris l’interaction avec l’interface utilisateur et tout autre événement) est interrompu pendant l’exécution du shader. Une fois le shader terminé, l’objet target en contient le résultat et le programme passe à la ligne de code suivante.

job.start(true);