Jeśli moduł cieniujący jest używany w trybie autonomicznym, wówczas przetwarzanie modułu cieniującego działa niezależnie od przeznaczenia wyniku działania modułu cieniującego. Należy określić moduł cieniujący do uruchomienia, ustawić dane wejściowe i wartości parametrów, a następnie wyznaczyć obiekt, do którego zostaną wstawione dane wynikowe. Moduł cieniujący może być używany w trybie autonomicznym z dwóch powodów:
-
Przetwarzanie danych nieobrazowych: w trybie autonomicznym użytkownik wybiera dowolne dane binarne lub liczbowe, które są przekazywane do modułu cieniującego zamiast danych bitmapy. Wynik działania modułu cieniującego może zostać zwrócony jako dane binarne lub dane liczbowe, a także jako dane bitmapy.
-
Przetwarzanie w tle: po uruchomieniu modułu cieniującego w trybie autonomicznym domyślnie moduł działa w sposób asynchroniczny. Oznacza to, że moduł działa w tle, a aplikacja nie przerywa działania — kod zostaje powiadomiony o zakończeniu przetwarzania przez moduł cieniujący. Możliwe jest korzystanie z modułu cieniującego, którego działanie trwa długo, ale nie spowoduje to zawieszenia interfejsu aplikacji użytkownika ani innych operacji przetwarzania podczas działania modułu cieniującego.
W celu uruchomienia modułu cieniującego w trybie autonomicznym należy użyć klasy ShaderJob. Najpierw należy użyć obiektu ShaderJob i połączyć go z obiektem Shader reprezentującym moduł cieniujący przeznaczony do uruchomienia:
var job:ShaderJob = new ShaderJob(myShader);
Następnie należy ustawić dowolne wartości wejściowe lub wartości parametrów, jakich oczekuje moduł cieniujący. Jeśli moduł cieniujący jest uruchamiany w tle, można również zarejestrować detektor dla zdarzenia
complete
obiektu ShaderJob. Detektor zostanie wywołany, gdy moduł cieniujący zakończy pracę:
function completeHandler(event:ShaderEvent):void
{
// do something with the shader result
}
job.addEventListener(ShaderEvent.COMPLETE, completeHandler);
Następnie należy utworzyć obiekt, do którego po zakończeniu operacji zostanie zapisany wynik działania modułu cieniującego. Obiekt ten należy przypisać do właściwości
target
obiektu ShaderJob.
var jobResult:BitmapData = new BitmapData(100, 75);
job.target = jobResult;
Jeśli do przetwarzania obrazu jest stosowana klasa ShaderJob, należy przypisać wystąpienie klasy BitmapData do właściwości
target
. Jeśli przetwarzane są dane binarne lub liczbowe, należy przypisać obiekt ByteArray lub wystąpienie klasy Vector.<Number> do właściwości
target
. W takim przypadku należy ustawić właściwości
width
i
height
obiektu ShaderJob w celu określenia ilości danych, jakie zostaną przekazane na wyjściu do obiektu
target
.
Uwaga:
Właściwości
shader
,
target
,
width
i
height
obiektu ShaderJob można ustawić w jednym kroku, przekazując argumenty do konstruktora
ShaderJob()
na przykład za pomocą kodu
var zadanie:ShaderJob = new ShaderJob(modul_cieniujacy, element_docelowy, szerokosc, wysokosc);
.
Po przygotowaniu uruchomienia modułu cieniującego należy wywołać metodę
start()
obiektu ShaderJob.
job.start();
Domyślnie wywołanie metody
start()
powoduje, że obiekt ShaderJob działa asynchronicznie. W takim przypadku wykonywanie programu jest kontynuowane bezpośrednio z kolejnym wierszem kodu — program nie oczekuje na zakończenie działania modułu cieniującego. Po zakończeniu działania modułu cieniującego obiekt ShaderJob wywołuje jego detektory zdarzenia
complete
, powiadamiając je o zakończeniu. W tym punkcie (w treści detektora zdarzenia
complete
) obiekt
target
zawiera wynik działania modułu cieniującego.
Uwaga:
Zamiast korzystać z właściwości
target
obiektu, można pobrać wynik działania modułu cieniującego bezpośrednio z obiektu zdarzenia, który został przekazany do metody detektora. Obiekt zdarzenia jest wystąpieniem klasy ShaderEvent. Obiekt ShaderEvent ma trzy właściwości, za pomocą których można uzyskać dostęp do wyniku — w zależności od typu danych obiektu ustawionego jako właściwość
target
:
ShaderEvent.bitmapData
,
ShaderEvent.byteArray
i
ShaderEvent.vector
.
Innym rozwiązaniem jest przekazanie argumentu
true
do metody
start()
. W tym przypadku moduł cieniujący będzie działał w sposób synchroniczny. Wykonywanie całego kodu (łącznie z interakcjami z interfejsem użytkownika i innymi zdarzeniami) zostaje wstrzymane podczas działania modułu cieniującego. Po zakończeniu działania modułu cieniującego obiekt
target
zawiera wynik działania modułu, a działanie programu jest kontynuowane od następnego wiersza kodu.
job.start(true);