DirectComposition (效果)

注意

針對Windows 10上的應用程式,我們建議使用 Windows.UI.Composition API,而不是 DirectComposition。 如需詳細資訊,請參閱 使用視覺層將傳統型應用程式現代化

本主題討論 Microsoft DirectComposition 效果的基本概念,並描述 DirectComposition 支援的效果類型。

本主題包含下列幾節:

什麼是 DirectComposition 效果?

DirectComposition 效果 是在視覺效果點陣化期間套用的點陣圖作業,以某種方式變更視覺效果的外觀。

DirectComposition 會藉由採用視覺子樹狀結構,並在套用效果之前將它轉譯成單一點陣圖來建立效果。 例如,若要建立 3D 透視轉換效果,DirectComposition 會產生視覺子樹狀結構的影像,然後將影像紋理到根據 3D 轉換效果產生的矩陣轉換的 3D 平面。

DirectComposition 支援下列類型的效果。

效果類型 描述
不透明度 設定整個視覺效果的不透明度。
3D 檢視方塊轉換 將立體 (3D) 透視轉換效果套用至視覺效果。

 

注意

將效果套用至 3D 立體內容時,DirectComposition 不會進行特殊處理。 這表示當效果套用至該內容時,3D 內容可能會扭曲。

 

不透明度

不透明度效果可讓您設定在呈現視覺效果時套用至整個視覺效果的不透明度因數。 它與 Alpha 遮罩不同,因為相同的不透明度因數會套用至視覺效果中的所有圖元。 不透明度指定為介於 0 (完全透明) 到 1 的值, (完全不透明) 。

不透明度因數會從父視覺效果套用至子視覺效果,但巢狀不透明度設定的可見效果不會顯示在個別子視覺效果的屬性值中。 例如,如果根視覺效果有 50% (0.5) 不透明度,且其中一個子系的其中一個子系具有 20 (% (0.2) 不透明度,該子系的淨不透明度會轉譯為 0.1) ,但子系的 Opacity 屬性值仍為 0.2。

3D 透視轉換效果

本節描述 DirectComposition 用於執行 3D 透視轉換效果的座標空間。 它也描述 DirectComposition 支援的 3D 透視轉換效果類型。

注意

在 DirectComposition 中,將 3D 效果套用至視覺化樹狀結構中的多個層級,與使用完整 3D 引擎的方式不同,例如 Microsoft Direct3D。 例如,請考慮具有單一子視覺效果的父視覺效果。 如果子視覺效果以 z 方向向前旋轉, (繞 Y 軸) 90 度,則子視覺邊緣的邊緣會面向檢視器,因此,由於點陣圖沒有真正的深度) ,因此我們預期視覺效果無法看見 (。 如果父視覺效果接著以負 Z 方向向後旋轉, (以 90 度繞著 Y 軸) 旋轉,則我們可能會預期子視覺效果完全 (,因為轉換會彼此否定) 。 不過,在 DirectComposition 中,這不是這種情況。 子視覺效果不會顯示,因為它已「壓平合併成」父點陣圖。

 

DirectComposition 3D 座標空間

3D 轉換效果的 DirectComposition 座標空間會尋找點陣圖表面左上角的原點 (0,0,0) ,而正 X 軸值會往右、正 y 軸值往下往下,以及向外向檢視者的正 Z 軸值。 下圖顯示 DirectComposition 3D 座標空間。

directcompostion 3d 座標空間

3D 旋轉轉換效果

3D 旋轉轉換效果會依旋轉軸向量 [x,y,z] 的指定角度旋轉三維中的視覺效果,其位於 (x,y,z) 。 角度是以度為單位指定。 預設旋轉軸向量為 [0,0,-1],而預設中心點 (0,0,0) 。

使用 IDCompositionDevice::CreateRotateTransform3D 方法來建立 3D 旋轉轉換物件。 方法會擷取可用來設定物件屬性的 IDCompositionRotateTransform3D 介面。

3D 縮放轉換效果

3D 縮放轉換效果會使視覺效果變大或更小。 它會縮放 [x,y,z] 方向的視覺效果,其中心點 (x,y,z) 。 預設中心點 (0,0,0) 。

使用 IDCompositionDevice::CreateScaleTransform3D 方法來建立 3D 縮放轉換物件。 方法會擷取可用來設定物件屬性的 IDCompositionScaleTransform3D 介面。

3D 轉譯轉換效果

3D 轉譯轉換效果會變更視覺效果在 [x,y,z] 方向中的位置。

使用 IDCompositionDevice::CreateTranslateTransform3D 方法來建立 3D 翻譯轉換物件。 方法會擷取可用來設定物件屬性的 IDCompositionTranslateTransform3D 介面。

3D 矩陣轉換效果

IDCompositionMatrixTransform3D介面可讓您定義自己的 4 by-4 轉換矩陣,並將其套用至視覺效果。 如果您需要套用無法透過其他 DirectComposition 3D 轉換效果介面取得的 3D 透視轉換效果類型,這個介面會很有用。 您可以填滿 D3DMATRIX 結構並將其傳遞至 IDCompositionMatrixTransform3D::SetMatrix 方法,以定義矩陣。 或者,您可以使用 IDCompositionMatrixTransform3D::SetMatrixElement 方法來設定矩陣的每個元素。

3D 轉換效果群組

IDCompositionDevice::CreateTransform3DGroup會建立一組 3D 轉換效果,您可以套用至視覺效果做為群組。 陣列可以包含任意數目的轉換物件,而且可以包含矩陣、旋轉、縮放和轉譯轉換。 3D 轉換物件的集合會產生轉換,其值為集合中個別轉換矩陣的矩陣乘法。

群組中個別轉換的順序很重要。 例如,如果您第一次旋轉,然後縮放,則轉譯會得到與第一次轉譯、旋轉、縮放結果不同的結果。 DirectComposition 會遵循您在轉換 3D 群組內指定 3D 轉換的順序,與 2D 轉換的方式相同。 此外,在套用目前視覺效果中的所有 3D 轉換之後,3D 檢視方塊轉換會導致視覺化樹狀結構扁平化。 這麼做可確保場景盡可能接近 3D。

效果物件

若要將效果套用至視覺效果,您必須先建立並設定效果物件的屬性,該物件代表您想要在視覺效果上產生的效果類型。 然後,您必須將效果物件套用至視覺效果的 Effect 屬性。

若要建立效果物件,請使用下列其中一個 IDCompositionDevice 介面方法,為您想要的效果類型建立效果物件。 下列方法會建立效果物件:

上述每個方法都會擷取可用來設定新建立效果物件的屬性的介面。 使用 介面方法來視需要設定屬性,以產生您想要的視覺效果。

效果物件的大部分屬性都可以產生動畫效果。 若要建立特定屬性的動畫效果,請建立動畫物件,並將其套用至您想要產生動畫效果的屬性;否則,請將 屬性設定為靜態值,以產生您想要的效果。 如需動畫屬性的詳細資訊,請參閱 動畫

若要將效果物件套用至視覺效果,請呼叫 IDCompositionVisual::SetEffect 方法。 當您將效果套用至視覺效果時,效果會套用至該視覺效果根目錄的整個視覺效果子樹。 例如,如果您將視覺效果的不透明度設定為 50%,則視覺效果子樹狀結構中所有子視覺效果的不透明度將會減少 50%。 您可以將相同的效果物件套用至一或多個視覺效果。 如果您在將效果物件套用至視覺效果之後修改其屬性,則會重新撰寫所有視覺效果以反映變更。

藉由使用效果群組物件,您可以同時將多個效果套用至視覺效果。 請先呼叫 IDCompositionDevice::CreateEffectGroup 來建立效果群組物件,然後使用物件的 IDCompositionEffectGroup 介面將效果新增至群組。

DirectComposition 概念