使用著色器做為濾鏡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];
}
}
}
如需有關套用濾鏡的詳細資訊,請參閱建立與套用濾鏡。 |
|