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);