Quando usate uno shader in modalità autonoma, l'elaborazione dello shader avviene in modo indipendente da come prevedete di sfruttare l'output. Specificate uno shader da eseguire, impostate i valori di input e dei parametri e progettate un oggetto in cui devono essere inseriti i dati risultanti. Potete utilizzare uno shader in modalità autonoma per due motivi:
-
Elaborazione di dati non di immagine: in modalità autonoma, potete scegliere di passare allo shader dati binari o numerici arbitrari, anziché dati di un'immagine bitmap. Potete scegliere di restituire il risultato dello shader come dati binari o numerici oltre che come dati di un'immagine bitmap.
-
Elaborazione in background: quando eseguite uno shader in modalità autonoma, per impostazione predefinita lo shader viene eseguito in modo asincrono, ovvero viene eseguito in background mentre l'applicazione continua a funzionare. Al termine dell'elaborazione dello shader viene inviata notifica al codice. Potete utilizzare uno shader che richiede un tempo di esecuzione prolungato senza bloccare l'interfaccia utente dell'applicazione o eventuali altri processi di elaborazione eseguiti contemporaneamente allo shader.
Potete usare un oggetto ShaderJob per eseguire uno shader in modalità autonoma. In primo luogo create l'oggetto ShaderJob e lo collegate all'oggetto Shader che rappresenta lo shader da eseguire:
var job:ShaderJob = new ShaderJob(myShader);
Quindi, impostate i valori di input o dei parametri previsti dallo shader. Se eseguite lo shader in background, registrate inoltre un listener per l'evento
complete
dell'oggetto Shader che viene chiamato al termine dell'elaborazione dello shader:
function completeHandler(event:ShaderEvent):void
{
// do something with the shader result
}
job.addEventListener(ShaderEvent.COMPLETE, completeHandler);
Create quindi un oggetto in cui deve essere scritto il risultato dell'operazione dello shader al termine dell'operazione. Assegnate questo oggetto alla proprietà
target
dell'oggetto ShaderJob:
var jobResult:BitmapData = new BitmapData(100, 75);
job.target = jobResult;
Assegnate un'istanza di BitmapData alla proprietà
target
se utilizzate l'oggetto ShaderJob per eseguire l'elaborazione di immagini. Se invece elaborate dati binari o numerici, assegnate un oggetto BitArray o un'istanza diVector.<numero> alla proprietà
target
. In questo caso, dovete impostare le proprietà
width
e
height
dell'oggetto ShaderJob per specificare la quantità di dati da restituire all'oggetto
target
.
Nota:
potete impostare le proprietà
shader
,
target
,
width
e
height
dell'oggetto ShaderJob in un solo passaggio passando argomenti al costruttore
ShaderJob()
in questo modo:
var job:ShaderJob = new ShaderJob(myShader, myTarget, myWidth, myHeight);
Quando siete pronti a eseguire lo shader, chiamate il metodo
start()
dell'oggetto ShaderJob:
job.start();
Per impostazione predefinita, la chiamata a
start()
causa l'esecuzione asincrona di ShaderJob, pertanto l'esecuzione del programma continua subito con la riga successiva di codice e non viene atteso il completamento dell'esecuzione dello shader. Al termine dell'esecuzione dello shader, l'oggetto ShaderJob chiama i listener dell'evento
complete
per notificare il termine dell'esecuzione. A questo punto, ovvero nel corpo del listener dell'evento
complete
, l'oggetto
target
contiene il risultato dell'operazione dello shader.
Nota:
anziché utilizzare l'oggetto proprietà
target
, potete recuperare il risultato dello shader direttamente dall'oggetto evento che viene passato al metodo del listener. L'oggetto evento è un'istanza di ShaderEvent. L'oggetto ShaderEvent dispone di tre proprietà che possono essere utilizzate per accedere al risultato, in base al tipo di dati dell'oggetto che impostate come proprietà
target
:
ShaderEvent.bitmapData
,
ShaderEvent.byteArray
e
ShaderEvent.vector
.
In alternativa, potete passare un argomento
true
al metodo
start()
affinché il funzionamento dello shader avvenga in modo sincrono. Tutto il codice, compresa l'interazione con l'interfaccia utente e altri eventi, verrà interrotto temporaneamente durante l'esecuzione dello shader. Al termine dell'esecuzione dello shader, l'oggetto
target
contiene il risultato dello shader e il programma continua con la riga di codice successiva.
job.start(true);