套件 | flash.display |
類別 | public class Shader |
繼承 | Shader Object |
子類別 | ColorBurnShader, ColorDodgeShader, ColorShader, ExclusionShader, HueShader, LuminosityMaskShader, LuminosityShader, SaturationShader, SoftLightShader |
語言版本: | ActionScript 3.0 |
執行階段版本: | Flash Player 10, AIR 1.5 |
shader
屬性。
著色器會定義可在影像中所有像素上執行 (一次一個像素) 的函數。每一次呼叫函數的結果就是影像中該像素座標上的輸出色彩。著色器可以指定一個或多個輸入影像,而這些影像的內容可以用來決定函數的輸出。著色器也可以指定一個或多個參數,而這些參數的輸入值可以用來計算函數輸出。在單一著色器執行作業期間,輸入與參數值都是常數。為一不同的地方就是像素座標 (其色彩為函數結果)。著色器函數會呼叫多個輸出像素座標來同時執行以提升著色器執行作業效率。
著色器位元組碼可以在執行階段透過 URLLoader 實體來載入。下列範例示範在執行階段載入著色器位元組碼檔案,並將其與 Shader 實體連結。
var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, onLoadComplete); loader.load(new URLRequest("myShader.pbj")); var shader:Shader; function onLoadComplete(event:Event):void { // Create a new shader and set the loaded data as its bytecode shader = new Shader(); shader.byteCode = loader.data; // You can also pass the bytecode to the Shader() constructor like this: // shader = new Shader(loader.data); // do something with the shader }
您也可以在編譯階段使用 [Embed]
中繼資料標籤將著色器內嵌到 SWF 中。只有當您使用 Flex SDK 來編譯 SWF,才能使用 [Embed]
中繼資料標籤。 [Embed]
標籤的 source
參數會指向著色器檔案,而其 mimeType
參數則是 "application/octet-stream"
,如以下範例所示:
[Embed(source="myShader.pbj", mimeType="application/octet-stream)] var MyShaderClass:Class; // ... // create a new shader and set the embedded shader as its bytecode var shaderShader = new Shader(); shader.byteCode = new MyShaderClass(); // You can also pass the bytecode to the Shader() constructor like this: // var shader:Shader = new Shader(new MyShaderClass()); // do something with the shader
不管是哪一項,您都可以將原始著色器 (即為 URLLoader.data
屬性或是 [Embed]
資料類別的實體) 連結至 Shader 實體。如以上範例所示,您可以透過兩種方式來執行這項作業。您可以將著色器位元組碼當成引數傳遞給 Shader()
建構函式。或者,您可以將它設為 Shader 實體的 byteCode
屬性。
一旦建立了 Shader 實體,就可以將其應用於以下任何一種情況:
- 著色器填色:使用著色器輸出做為以繪圖 API 繪製的內容填色。將 Shader 實體當成引數傳遞給
Graphics.beginShaderFill()
方法。 - 著色器濾鏡:著色器輸出可以當作圖像濾鏡來使用,並套用至顯示物件。將 Shader 實體指派給 ShaderFilter 實體的
shader
屬性。 - 混合模式:著色器的輸出會在兩個重疊的顯示物件之間顯示為混合色彩。將 Shader 實體指派給兩個顯示物件上層的
blendShader
屬性。 - 背景著色器處理:著色器會在背景執行以避免凍結顯示的可能,並在處理完成時傳送事件。將 Shader 實體指派給 ShaderJob 實體的
shader
屬性。
GPU 顯示不支援著色器填色、濾鏡與混合。
行動裝置瀏覽器支援:行動裝置瀏覽器不支援此功能。
AIR 描述檔支援:所有桌上型電腦作業系統都支援此項功能,但所有行動裝置都不支援。AIR for TV 裝置不支援。如需有關跨多個描述檔之 API 支援的詳細資訊,請參閱 AIR 描述檔支援。
相關 API 元素
flash.display.Graphics.beginShaderFill()
flash.display.ShaderJob
flash.filters.ShaderFilter
flash.net.URLLoader
屬性 | 定義自 | ||
---|---|---|---|
byteCode : ByteArray [唯寫]
此 Shader 實體的原始著色器位元組碼。 | Shader | ||
constructor : Object
類別物件的參照或是特定物件實體的建構函數。 | Object | ||
data : ShaderData
針對 Shader 實體提供參數、輸入影像,與中繼資料的存取能力。 | Shader | ||
precisionHint : String
著色器所執行的數學運算精確度。 | Shader |
方法 | 定義自 | ||
---|---|---|---|
建立新的 Shader 實體。 | Shader | ||
指出物件是否有已定義的指定屬性。 | Object | ||
指出 Object 類別的實體是否位於指定為參數的物件原型鏈中。 | Object | ||
指出指定的屬性是否存在,以及是否可列舉。 | Object | ||
為迴圈作業設定動態屬性的可用性。 | Object | ||
傳回代表此物件的字串,根據地區特定慣例進行格式化。 | Object | ||
會傳回指定之物件的字串形式。 | Object | ||
會傳回指定之物件的基本值。 | Object |
byteCode | 屬性 |
data | 屬性 |
data:ShaderData
語言版本: | ActionScript 3.0 |
執行階段版本: | Flash Player 10, AIR 1.5 |
針對 Shader 實體提供參數、輸入影像,與中繼資料的存取能力。代表著色器參數的 ShaderParameter 物件、代表著色器輸入影像的 ShaderInput 物件,以及其他代表著色器中繼資料的值都會在建立 Shader 實體時,當作 data
屬性物件的屬性來動態新增。這些屬性可以用來內觀著色器並設定參數與輸入值。
如需存取與操作 data
物件動態屬性的詳細資訊,請參閱 ShaderData 類別說明。
實作
public function get data():ShaderData
public function set data(value:ShaderData):void
相關 API 元素
precisionHint | 屬性 |
precisionHint:String
語言版本: | ActionScript 3.0 |
執行階段版本: | Flash Player 10, AIR 1.5 |
著色器所執行的數學運算精確度。
precisionHint
屬性的可能值集合是由 ShaderPrecision 類別中的常數所定義。
預設值為 ShaderPrecision.FULL
。將精確度設為 ShaderPrecision.FAST
可以犧牲精確度來加速數學運算。
完整精確度模式 (ShaderPrecision.FULL
) 會以 IEEE 32 位元浮動標準的完整寬度來計算所有數學運算,而且在所有平台上都提供一致的行為。在此模式中,例如三角法函數與指數函數的數學運作速度會比較緩慢。
快速精確度模式 (ShaderPrecision.FAST
) 是針對最佳效能所設計的,但是無法針對不同的平台和個別 CPU 組態以一致的方式運作。在許多情況中,這種層級的精確度已經足以建立沒有可見雜訊的圖像特效。
精確度模式選擇會影響下列著色器作業。在含有 SSE 指令集的 Intel 處理器上處理這些作業速度會比較快:
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
atan(x, y)
exp(x)
exp2(x)
log(x)
log2(x)
pow(x, y)
reciprocal(x)
sqrt(x)
實作
public function get precisionHint():String
public function set precisionHint(value:String):void
相關 API 元素
Shader | () | 建構函式 |
請注意,此範例假設和應用程式輸出目錄相同的目錄中存在一個名為「donothing.pbj」的著色器位元組碼檔案。您可以在 ShaderData 類別範例中取得 DoNothing 著色器的 Pixel Bender 原始碼。
package { import flash.display.Shader; import flash.display.Sprite; import flash.events.Event; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; public class LoadedShaderExample extends Sprite { private var loader:URLLoader; public function LoadedShaderExample() { loader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.BINARY; loader.addEventListener(Event.COMPLETE, loadCompleteHandler); loader.load(new URLRequest("donothing.pbj")); } private function loadCompleteHandler(event:Event):void { var shader:Shader = new Shader(); shader.byteCode = loader.data; // do something with the Shader instance } } }
請注意,此範例假設和應用程式原始碼相同的目錄中存在一個名為「donothing.pbj」的著色器位元組碼檔案,且使用 Flex SDK 來編譯 SWF。您可以在 ShaderData 類別範例中取得 DoNothing 著色器的 Pixel Bender 原始碼。
package { import flash.display.Shader; import flash.display.Sprite; public class EmbeddedShaderExample extends Sprite { [Embed(source="donothing.pbj", mimeType="application/octet-stream")] private static var DoNothingShader:Class; public function EmbeddedShaderExample() { var shader:Shader = new Shader(); shader.byteCode = new DoNothingShader(); // do something with the Shader instance } } }
Tue Jun 12 2018, 03:47 PM Z