Używanie modułu cieniującego jako filtra

Flash Player 10 i nowsze wersje, Adobe AIR 1.5 i nowsze wersje

Używanie modułu cieniującego jako filtra przypomina używanie dowolnych innych filtrów w kodzie ActionScript. Jeśli moduł cieniujący jest używany jako filtr, filtrowany obraz (obiekt wyświetlany lub obiekt BitmapData) jest przekazywany do modułu cieniującego. Moduł cieniujący korzysta z obrazu wejściowego w celu utworzenia wyniku działania filtru, który zwykle jest zmodyfikowaną wersją obrazu oryginalnego. Jeśli obiekt filtrowany jest obiektem wyświetlanym, wówczas wynik działania modułu cieniującego jest wyświetlany na ekranie zamiast filtrowanego obiektu wyświetlanego. Jeśli filtrowany obiekt jest obiektem BitmapData, wówczas wynik działania modułu cieniującego staje się zawartością obiektu BitmapData, którego metoda applyFilter() została wywołana.

W celu użycia modułu cieniującego jako filtru najpierw należy utworzyć obiekt Shader zgodnie z opisem w sekcji Wczytywanie lub osadzanie modułu cieniującego . Następnie należy utworzyć obiekt ShaderFilter połączony z obiektem Shader. Obiekt ShaderFilter jest filtrem stosowanym dla filtrowanego obiektu. Filtr jest stosowany dla obiektu w taki sam sposób, jak dowolny inny filtr. Należy przekazać go do właściwości filters obiektu ekranowego lub wywołać metodę applyFilter() dla obiektu BitmapData. Na przykład poniższy kod tworzy obiekt ShaderFilter i stosuje filtr do obiektu ekranowego o nazwie homeButton .

var myFilter:ShaderFilter = new ShaderFilter(myShader); 
homeButton.filters = [myFilter];

Jeśli moduł cieniujący jest używany jako filtr, wówczas moduł musi zostać zdefiniowany z co najmniej jednym obiektem wejściowym. Zgodnie z tym, co prezentuje przykład, obiekt wejściowy nie jest ustawiany w kodzie. Zamiast tego filtrowany obiekt wyświetlany BitmapData jest ustawiony jako obraz wejściowy. Jeśli używany jest moduł cieniujący, który oczekuje na więcej niż jeden obiekt wejściowy, należy udostępnić wartość dla każdego obiektu wejściowego następującego po pierwszym.

W niektórych przypadkach filtr zmienia rozmiary obrazu oryginalnego. Na przykład: typowy efekt cienia dodaje dodatkowe piksele zawierające cień dodany do obrazu. Jeśli używany jest moduł cieniujący, który zmienia rozmiary obrazu, należy ustawić właściwości leftExtension , rightExtension , topExtension i bottomExtension w taki sposób, aby określały stopień zmiany wielkości obrazu.

Poniższy przykład prezentuje użycie modułu cieniującego jako filtru. Filtr w tym przykładzie odwraca wartości kanałów koloru czerwonego, zielonego i niebieskiego na obrazie. Wynikiem jest negatyw obrazu.

Uwaga: Moduł cieniujący używany w tym przykładzie wykorzystuje jądro invertRGB.pbk Pixel Bender, które jest dostępne w pakiecie Pixel Bender Toolkit. Kod źródłowy jądra można załadować z katalogu instalacyjnego pakietu Pixel Bender Toolkit. Następnie należy skompilować źródłowy kod i zapisać plik kodu bajtowego w tym samym katalogu, w którym znajduje się kod źródłowy.

Istotny kod ActionScript znajduje się w dwóch metodach:

  • init() : Metoda init() jest wywoływana podczas wczytywania aplikacji. W tej metodzie kod wczytuje plik kodu bajtowego modułu cieniującego.

  • onLoadComplete() : W metodzie onLoadComplete() kod tworzy obiekt Shader o nazwie shader . Następnie tworzy i rysuje zawartość obiektu o nazwie target . Obiekt target jest prostokątem wypełnionym kolorem o gradiencie liniowym — czerwony po lewej stronie, pomarańczowo-zielony w środku i jasnoniebieski po prawej stronie. Obiekt przed filtrowaniem wygląda następująco:

    Po zastosowaniu filtru następuje odwrócenie kolorów, co sprawia, że prostokąt wygląda tak:

Moduł cieniujący używany w tym przykładzie wykorzystuje jądro „invertRGB.pbk Pixel Bender, które jest dostępne w pakiecie Pixel Bender Toolkit. Kod źródłowy jest dostępny w pliku „invertRGB.pbk” w katalogu instalacyjnym pakietu Pixel Bender Toolkit. Należy skompilować kod źródłowy i zapisać plik kodu bajtowego w pliku o nazwie „invertRGB.pbj” w tym samym katalogu, w którym znajduje się kod źródłowy ActionScript.

Oto kod tego przykładu w języku ActionScript. Ta aplikacja może być używana jako główna klasa aplikacji dla projektu zawierającego tylko kod ActionScript w programie Flash Builder lub jako klasa document dla pliku FLA w programie Flash Professional:

package 
{ 
    import flash.display.GradientType; 
    import flash.display.Graphics; 
    import flash.display.Shader; 
    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.filters.ShaderFilter; 
    import flash.events.Event; 
    import flash.geom.Matrix; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
     
    public class InvertRGB extends Sprite 
    { 
        private var shader:Shader; 
        private var loader:URLLoader; 
         
        public function InvertRGB() 
        { 
            init(); 
        } 
         
        private function init():void 
        { 
            loader = new URLLoader(); 
            loader.dataFormat = URLLoaderDataFormat.BINARY; 
            loader.addEventListener(Event.COMPLETE, onLoadComplete); 
            loader.load(new URLRequest("invertRGB.pbj")); 
        } 
         
         
        private function onLoadComplete(event:Event):void 
        { 
            shader = new Shader(loader.data); 
             
            var target:Shape = new Shape(); 
            addChild(target); 
             
            var g:Graphics = target.graphics; 
            var c:Array = [0x990000, 0x445500, 0x007799]; 
            var a:Array = [255, 255, 255]; 
            var r:Array = [0, 127, 255]; 
            var m:Matrix = new Matrix(); 
            m.createGradientBox(w, h); 
            g.beginGradientFill(GradientType.LINEAR, c, a, r, m); 
            g.drawRect(10, 10, w, h); 
            g.endFill(); 
             
            var invertFilter:ShaderFilter = new ShaderFilter(shader); 
            target.filters = [invertFilter]; 
        } 
    } 
}

Więcej informacji na temat stosowania filtrów zawiera sekcja Tworzenie i stosowanie filtrów .