使用著色器做為濾鏡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 程式碼是以下列兩個方法為基礎所撰寫:
這個範例使用的著色器是隨附於 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]; } } } 如需有關套用濾鏡的詳細資訊,請參閱建立與套用濾鏡。 |
|