混合效果

使用混合效果來結合 2 個影像。 此效果有 26 種混合模式。

這個效果的 CLSID 是CLSID_D2D1Blend。

混合範例

以下是混合效果之每個混合模式的範例影像。 下一節中有混合模式和對應模式屬性的完整清單

所有可用混合模式的效果範例螢幕快照。

以下是另一個使用排除模式的範例。

影像 1 之前
效果之前的第一個來源影像。
影像 2 之前
效果之前的第二個影像。
之後
轉換之後的影像。
ComPtr<ID2D1Effect> blendEffect;
m_d2dContext->CreateEffect(CLSID_D2D1Blend, &blendEffect);

blendEffect->SetInput(0, bitmap);
blendEffect->SetInput(1, bitmapTwo);
blendEffect->SetValue(D2D1_BLEND_PROP_MODE, D2D1_BLEND_MODE_EXCLUSION);

m_d2dContext->BeginDraw();
m_d2dContext->DrawImage(blendEffect.Get());
m_d2dContext->EndDraw();

效果屬性

顯示名稱和索引列舉 描述
[模式]
D2D1_BLEND_PROP_MODE
用於效果的混合模式。 如需詳細資訊,請參閱 混合模式 。 此類型為D2D1_BLEND_MODE。
預設值為 D2D1_BLEND_MODE_MULTIPLY。

混合模式

下表顯示此效果的所有混合模式。 計算效果輸出所需的協助程式函式在下一節中。

色彩:OPRGB = f(FRGB,B RGB) * FA * B A + FRGB * FA * (1 - B A) + BRGB * BA * (1 - FA)

Alpha:OA = FA * (1 - BA) + BA

其中:

  • OPRGB 是預乘的輸出色彩
  • OA 為輸出 Alpha
  • BRGB 是未預乘的目的地色彩
  • BA 是目的地 Alpha
  • FRGB 是未預乘的來源色彩
  • FA 是來源 Alpha
  • f(SRGB, DRGB) 是一種混合函式,會因混合模式而異

某些混合模式需要從色調、飽和度、亮度(HSL)色彩空間轉換成 RGB。

列舉型別 方程
D2D1_BLEND_MODE_DARKEN 僅限 Alpha 的基本混合公式。 深色效果的數學公式。
D2D1_BLEND_MODE_MULTIPLY 僅限 Alpha 的基本混合公式。 乘法效果的數學公式。
D2D1_BLEND_MODE_COLOR_BURN 基本混合公式與 f(FRGB, BRGB) = Coor 燃燒效果的數學公式。
D2D1_BLEND_MODE_LINEAR_BURN 基本混合公式與 f(FRGB, BRGB) = 線性燃燒效果的數學公式。
D2D1_BLEND_MODE_DARKER_COLOR 僅限 Alpha 的基本混合公式。 深色效果的數學公式。
D2D1_BLEND_MODE_LIGHTEN 僅限 Alpha 的基本混合公式。 淺色效果的數學公式。
D2D1_BLEND_MODE_SCREEN 僅限 Alpha 的基本混合公式。 螢幕效果的數學公式。
D2D1_BLEND_MODE_COLOR_DODGE 基本混合公式與 f(FRGB, BRGB) = 色彩躲避效果的數學公式。
D2D1_BLEND_MODE_LINEAR_DODGE 基本混合公式與 f(FRGB, BRGB) = 線性躲避效果的數學公式。
D2D1_BLEND_MODE_LIGHTER_COLOR 僅限 Alpha 的基本混合公式。 較淺色彩效果的數學公式。
D2D1_BLEND_MODE_OVERLAY 基本混合公式與 f(FRGB, BRGB) = 重疊效果的數學公式。
D2D1_BLEND_MODE_SOFT_LIGHT 基本混合公式與 f(FRGB, BRGB) = 柔和光線效果的數學公式。
D2D1_BLEND_MODE_HARD_LIGHT 基本混合公式與 f(FRGB, BRGB) = 硬光效果的數學公式。
D2D1_BLEND_MODE_VIVID_LIGHT 基本混合公式與 f(FRGB, BRGB) = 生動光線效果的數學公式。
D2D1_BLEND_MODE_LINEAR_LIGHT 基本混合公式與 f(FRGB, BRGB) = 線性光線效果的數學公式。
D2D1_BLEND_MODE_PIN_LIGHT 基本混合公式與 f(FRGB, BRGB) = 針腳光線效果的數學公式。
D2D1_BLEND_MODE_HARD_MIX 基本混合公式與 f(FRGB, BRGB) = 硬混合效果的數學公式。
D2D1_BLEND_MODE_DIFFERENCE 基本混合公式與 f(FRGB, BRGB) = abs(FRGB - BRGB
D2D1_BLEND_MODE_EXCLUSION 基本混合公式與 f(FRGB,B RGB) = FRGB + BRGB 2 * F RGB * B RGB
D2D1_BLEND_MODE_HUE 僅限 Alpha 的基本混合公式。 色調混合效果的數學公式。
D2D1_BLEND_MODE_SATURATION 僅限 Alpha 的基本混合公式。 飽和混合效果的數學公式。
D2D1_BLEND_MODE_COLOR 僅限 Alpha 的基本混合公式。 色彩混合效果的數學公式。
D2D1_BLEND_MODE_LUMINOSITY 僅限 Alpha 的基本混合公式。 亮度混合效果的數學公式。
D2D1_BLEND_MODE_DISSOLVE 給:
  • 目前像素的場景座標 XY
  • 以種子座標 XY 為基礎的具決定性虛擬隨機數產生器 rand(XY),從 [0, 1] 中不偏不偏分佈的值

溶解混合效果的數學公式。
D2D1_BLEND_MODE_SUBTRACT 僅限 Alpha 的基本混合公式。 減去混合效果的數學公式。
D2D1_BLEND_MODE_DIVISION 僅限 Alpha 的基本混合公式。 除法混合效果的數學公式。

注意

針對所有 Blend 模式,輸出值會預先設定,並夾在範圍 [0, 1]。

HSL 色彩空間轉換

亮度元件是使用這裡的 RGB 權數來計算:

  • kR = 0.30
  • kG = 0.59
  • kB = 0.11

從 RGB 轉換為 HSL

數學公式,描述從 rgb 色彩到 hsl 色彩的轉換。

這會將 SL 放在範圍 [0.0, 1.0] 和 H 的範圍 [-1.0, 5.0]。

從 HSL 轉換為 RGB

若要以另一種方式來轉換,我們會使用先前計算的反函數。

如果 S = 0,則 R = G = B L =

否則,有六個色調相依案例:

如果 H 大於 0,則值位於 R>B>G 的紅色/洋紅扇區中。

數學等號步驟 6 個將 hsl 色彩轉換成 rgb。

如果 H 大於或等於 0 且小於 1,則值會位於 R>G B> 所在的紅色/黃色扇區中。

數學相等步驟 6 之 6 個將 hsl 色彩轉換成 rgb。

如果 H 大於或等於 1 且小於 2,則值位於 G>R>B 的黃色/綠色扇區中。

數學等號步驟 6 的三個將 hsl 色彩轉換成 rgb。

如果 H 大於或等於 2 且小於 3,則值位於 G>B>R 的綠色/青色扇區中。

數學等號步驟四,六個將 hsl 色彩轉換成 rgb。

如果 H 大於或等於 3 且小於 4,則值位於 B>G>R 所在的青藍色扇區中。

數學等號步驟 6 之 5 將 hsl 色彩轉換成 rgb。

如果 H 大於或等於 4,則值位於 B>R>G 的藍色/洋紅扇區中。

數學等號步驟六中六個將 hsl 色彩轉換成 rgb。

由於混合模式會從兩種不同的色彩中任意組合 HSL 元件,因此轉換的 RGB 值通常會超出範圍,也就是說,一或多個通道元件可能超出 [0.0, 1.0] 的法律範圍。 透過減少飽和度,同時保留色調和亮度,這些色彩會帶回光域:

數學公式,描述在遊戲外實例所需的更正。

輸出點陣圖

這個效果的輸出位圖一律是兩個輸入影像的聯集大小。

範例指令碼

如需此效果的範例,請下載 Direct2D 複合效果模式範例

需求

需求
最低支援的用戶端 適用於 Windows 7 的 Windows 8 和平臺更新 [傳統型應用程式 |Windows 市集應用程式]
最低支援的伺服器 適用於 Windows 7 的 Windows 8 和平臺更新 [傳統型應用程式 |Windows 市集應用程式]
頁首 d2d1effects.h
程式庫 d2d1.lib、dxguid.lib

ID2D1Effect