Gölgelendiriciyi filtre olarak kullanma

Flash Player 10 ve üstü, Adobe AIR 1.5 ve üstü

Gölgelendiricinin filtre olarak kullanılması, ActionScript'teki herhangi bir filtrenin kullanılmasına benzer. Gölgelendiriciyi filtre olarak kullandığınızda, filtre uygulanan görüntü (görüntüleme nesnesi veya BitmapData nesnesi) gölgelendiriciye iletilir. Gölgelendirici, genellikle orijinal görüntünün değiştirilmiş bir sürümü olan filtre çıktısını oluşturmak için girdi görüntüsünü kullanır. Filtre uygulanan nesne bir görüntüleme nesnesiyse, ekranda filtre uygulanan görüntüleme nesnesi yerine gölgelendiricinin çıktısı görüntülenir. Filtre uygulanan nesne bir BitmapData nesnesiyse, gölgelendiricinin çıktısı, applyFilter() yöntemi çağrılan BitmapData nesnesinin içeriği olur.

Bir gölgelendiriciyi filtre olarak kullanmak için, ilk olarak Gölgelendirici yükleme veya gömme bölümünde açıklandığı gibi Shader nesnesini oluşturursunuz. Daha sonra Shader nesnesine bağlanmış bir ShaderFilter nesnesi oluşturursunuz. ShaderFilter nesnesi, filtre uygulanmış nesneye uygulanan filtredir. Bunu herhangi bir filtreyi uyguladığınız şekilde bir nesneye uygulayabilirsiniz. Bunu görüntüleme nesnesinin filters özelliğine iletirsiniz veya bir BitmapData nesnesinde applyFilter() öğesini çağırırsınız. Örneğin, aşağıdaki kod bir ShaderFilter nesnesi oluşturur ve homeButton adındaki bir görüntüleme nesnesine filtreyi uygular.

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

Gölgelendiriciyi filtre olarak kullandığınızda, gölgelendiricinin en az bir girdiyle tanımlanması gerekir. Örnekte gösterildiği gibi, girdi değerini kodunuzda ayarlamazsınız. Bunun yerine, filtre uygulanmış görüntüleme nesnesi veya BitmapData nesnesi, girdi görüntüsü olarak ayarlanır. Birden çok girdi bekleyen bir gölgelendirici kullanırsanız, bu bir girdi dışındaki tüm girdiler için bir değer sağlamanız gerekir.

Bazı durumlarda filtre, orijinal görüntünün boyutlarını değiştirir. Örneğin, tipik bir gölge efekti, görüntüye eklenen gölgeyi içeren fazladan pikseller ekler. Görüntü boyutlarını değiştiren bir gölgelendirici kullandığınızda, görüntü boyutunun ne kadar değişmesini istediğinizi belirtmek için leftExtension, rightExtension, topExtension ve bottomExtension özelliklerini ayarlayın.

Aşağıdaki örnekte bir gölgelendiricinin filtre olarak kullanılması gösterilmektedir. Bu örnekteki filtre, görüntünün kırmızı, yeşil ve mavi kanal değerlerini tersine çevirir. Sonuçta görüntünün "negatif" sürümü elde edilir.

Not: Bu örneğin kullandığı gölgelendirici, Pixel Bender Araç Kiti'ne dahil edilen invertRGB.pbk Pixel Bender çekirdeğidir. Pixel Bender Araç Kiti yükleme dizininden çekirdek için kaynak kodu yükleyebilirsiniz. Kaynak kodu derleyin ve bayt kodu dosyasını kaynak koduyla aynı dizine kaydedin.

Bu iki örnekte önemli ActionScript kodu bulunur:

  • init(): Uygulama yüklendiğinde init() yöntemi çağrılır. Bu yöntemde kod, gölgelendirici bayt kodu dosyasını yükler.

  • onLoadComplete(): onLoadComplete() yönteminde kod, shader adında bir Shader nesnesi oluşturur. Daha sonra target adında bir nesne oluşturur ve bu nesnenin içeriklerini çizer. target nesnesi, solda kırmızı, ortada sarı-yeşil ve sağda açık mavi olan doğrusal degrade renkle doldurulmuş bir dikdörtgendir. Filtre uygulanmamış nesne şöyle görünür:

    Filtre uygulandığında renkler ters çevrilir ve böylece dikdörtgen şöyle görünür:

Bu örneğin kullandığı gölgelendirici, Pixel Bender Araç Kiti'ne dahil edilen “invertRGB.pbk” örnek Pixel Bender çekirdeğidir. Kaynak kod, Pixel Bender Araç Kiti yükleme dizininde “invertRGB.pbk” dosyasında mevcuttur. Kaynak kodu derleyin ve bayt kodu dosyasını ActionScript kaynak kodunuzla aynı dizine “invertRGB.pbj” adıyla kaydedin.

Aşağıda, bu örneğin ActionScript kodu verilmiştir. Bu sınıfı Flash Builder'da yalnızca ActionScript projesi için ana uygulama sınıfı olarak veya Flash Professional'da FLA dosyasının belge sınıfı olarak kullanın:

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]; 
        } 
    } 
}

Filtreleri uygulama hakkında daha fazla bilgi için, bkz. Filtreler oluşturma ve uygulama.