使用著色器做為濾鏡

Flash Player 10 以及更新的版本,Adobe AIR 1.5 以及更新的版本

使用著色器做為濾鏡就像在 ActionScript 中使用其它任何濾鏡一樣。當您使用著色器做為濾鏡時,已套用濾鏡的影像 (顯示物件或 BitmapData 物件) 會傳遞至著色器。著色器會使用輸入影像建立濾鏡輸出,這個輸出通常是原始影像的修改版本。如果已套用濾鏡的物件是顯示物件,著色器的輸出就會顯示在螢幕上,取代已套用濾鏡的顯示物件。如果已套用濾鏡的物件是 BitmapData 物件,著色器的輸出就會是已呼叫其 applyFilter() 方法之 BitmapData 物件的內容。

若要使用著色器做為濾鏡,您必須先建立 Shader 物件,如 載入或嵌入著色器 所述。然後,再建立連結至 Shader 物件的 ShaderFilter 物件。ShaderFilter 物件是套用至已套用濾鏡之物件的濾鏡。如同套用任何濾鏡一般,您能以相同方式將這個濾鏡套用至物件。接著,再將這個物件傳遞至顯示物件的 filters 屬性,或者對 BitmapData 物件呼叫 applyFilter() 方法。例如,下列程式碼會建立 ShaderFilter 物件,並對名為 homeButton 的顯示物件套用濾鏡。

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

當您使用著色器做為濾鏡時,必須使用至少一個輸入來定義著色器。如上述範例所示,您不需在程式碼中設定輸入值,程式碼會將已套用濾鏡的顯示物件或 BitmapData 物件設定做為輸入影像。如果您將使用一個以上的輸入來定義著色器,則必須為第一個輸入之後的任何輸入提供值。

在某些情況下,濾鏡會變更原始影像的尺寸。例如,典型的陰影特效會加入額外的像素,其中包含已加入至影像的陰影。當您使用會變更影像尺寸的著色器時,請設定 leftExtension rightExtension topExtension bottomExtension 屬性,指出希望的影像大小變更量。

在下列範例中,會示範如何使用著色器做為濾鏡。在這個範例中,濾鏡會將影像的紅色、綠色和藍色色版值變成相反值,以產生具有「負片」特效的影像。

備註: 這個範例使用的著色器是隨附於 Pixel Bender Toolkit 的 invertRGB.pbk Pixel Bender 核心。您可以從 Pixel Bender Toolkit 的安裝目錄載入這個核心的原始碼。請編譯這個原始碼,並將位元組碼檔案儲存在與原始碼相同的目錄中。

這個重要的 ActionScript 程式碼是以下列兩個方法為基礎所撰寫:

  • init() :載入應用程式時,會呼叫 init() 方法。在這個方法中,程式碼會載入著色器位元組碼檔案。

  • onLoadComplete() :在 onLoadComplete() 方法中,程式碼會建立名為 shader 的 Shader 物件,再建立及繪製名為 target 之物件的內容。 target 物件是以線性漸層顏色填滿的矩形,漸層顏色在左邊為紅色,中間為黃綠色,右邊為淡藍色。未套用濾鏡的物件看起來如下:

    套用濾鏡之後,矩形會呈現相反的顏色,看起來如下:

這個範例使用的著色器是隨附於 Pixel Bender Toolkit 的「invertRGB.pbk」樣本 Pixel Bender 核心。您可以在 Pixel Bender Toolkit 安裝目錄的「invertRGB.pbk」檔案中找到原始碼。請編譯這個原始碼,並將位元組碼檔案 (命名為「invertRGB.pbj」) 儲存在與 ActionScript 原始碼相同的目錄中。

下面列出這個範例的 ActionScript 程式碼。範例中會使用這個類別做為主應用程式類別,供 Flash Builder 中的 ActionScript 專案使用,或者做為文件類別以供 Flash Professional 中的 FLA 檔使用:

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

如需有關套用濾鏡的詳細資訊,請參閱 建立與套用濾鏡