Använda en skuggning som ett filter

Flash Player 10 och senare, Adobe AIR 1.5 och senare

Att använda en skuggning som ett filter går till ungefär som att använda andra filter i ActionScript. När du använder en skuggning som ett filter skickas den filtrerade bilden (ett visningsobjekt eller BitmapData-objekt) till skuggningen. Skuggningen använder indatabilden för att skapa filterutdata, som vanligtvis är en modifierad version av den ursprungliga bilden. Om det filtrerade objektet är ett visningsobjekt visas skuggningens utdata på skärmen i stället för det filtrerade visningsobjektet. Om det filtrerade objektet är ett BitmapData-objekt blir skuggningens utdata innehållet i det BitmapData-objekt vars applyFilter()-metod anropas.

Om du vill använda en skuggning som filter måste du först skapa Shader-objektet på det sätt som beskrivs i Läsa in eller bädda in en skuggning. Sedan skapar du ett ShaderFilter-objekt som länkas till Shader-objektet. ShaderFilter-objektet är filtret som används på det filtrerade objektet. Du tillämpar det på ett objekt på samma sätt som du tillämpar andra filter. Du skickar det till egenskapen filters för ett visningsobjekt eller anropar metoden applyFilter() för ett BitmapData-objekt. Följande exempelkod skapar ett ShaderFilter-objekt och använder filtret på visningsobjektet med namnet homeButton.

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

När du använder en skuggning som filter måste skuggningen definieras med minst en inmatning. Så som exemplet visar ska du inte ställa in indatavärdet i koden. I stället ställs det filtrerade visningsobjektet eller BitmapData-objektet in som indatabilden. Om du använder en skuggning som förväntar fler än en inmatning, anger du ett värde för alla inmatningar utöver den första.

I vissa fall ändrar ett filter dimensionerna för den ursprungliga bilden. En vanlig skuggeffekt lägger till exempel till extra pixlar som innehåller skuggan som läggs till i bilden. När du använder en skuggning som ändrar bildens dimensioner ställer du in egenskaperna leftExtension, rightExtension, topExtension och bottomExtension för att ange hur mycket bilden ska ändra storlek.

I exemplet nedan visas hur du använder en skuggning som filter. Filtret i det här exemplet inverterar de röda, gröna och blå kanalvärdena för en bild. Resultatet blir en ”negativ” version av bilden.

Obs! Skuggningen som det här exemplet använder är Pixel Bender-kärnan invertRGB.pbk som ingår i Pixel Bender Toolkit. Du kan läsa in källkoden för kärnan från installationskatalogen för Pixel Bender Toolkit. Kompilera källkoden och spara bytekodfilen i samma katalog som källkoden.

Den viktiga ActionScript-koden finns i dessa två metoder:

  • init(): Metoden init() anropas när programmet läses in. I den här metoden läser koden in skuggningens bytekodfil.

  • onLoadComplete(): I metoden onLoadComplete() skapar koden Shader-objektet med namnet shader. Sedan skapas och ritas innehållet i ett objekt med namnet target. Objektet target är en rektangel som fylls med en linjär övertoningsfärg som är röd till vänster, gulgrön i mitten och ljusblå till höger. Det ofiltrerade objektet ser ut så här:

    När filtret som används på färgen inverteras ser rektangeln ut så här:

Skuggningen som det här exemplet använder är Pixel Bender-kärnan invertRGB.pbk som ingår i Pixel Bender Toolkit. Källkoden finns i filen invertRGB.pbk i installationskatalogen för Pixel Bender Toolkit. Kompilera källkoden och spara bytekodfilen med namnet invertRGB.pbj som finns i samma katalog som ActionScript-källkoden.

Nedan finns ActionScript-koden för det här exemplet. Använd den här klassen som huvudprogramklass för ett ActionScript-projekt i Flash Builder, eller som dokumentklass för FLA-filen i 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]; 
        } 
    } 
}

Mer information om att använda filter finns i Skapa och tillämpa filter.