共用方式為


在 Direct2D 中使用 Color

Direct2D 會使用 RGB 色彩模型,其中色彩會結合不同的紅色、綠色和藍色值來形成。 第四個元件 Alpha 會測量圖元的透明度。 在 Direct2D 中,每個元件都是浮點值,範圍為 [0.0 1.0]。 針對三個色彩元件,值會測量色彩的強度。 針對 Alpha 元件,0.0 表示完全透明,而 1.0 表示完全不透明。 下表顯示各種組合 100% 強度所產生的色彩。

紅色 綠色 藍色 色彩
0 0 0 黑色
1 0 0 紅色
0 1 0 綠色
0 0 1 藍色
0 1 1 11:青色
1 0 1 桃紅色
1 1 0 黃色
1 1 1 白色

顯示 rgb 色彩的影像。

介於 0 到 1 之間的色彩值會產生這些純色的不同陰影。 Direct2D 會使用 D2D1_COLOR_F 結構來代表色彩。 例如,下列程式碼會指定 magenta。

    // Initialize a magenta color.

    D2D1_COLOR_F clr;
    clr.r = 1;
    clr.g = 0;
    clr.b = 1;
    clr.a = 1;  // Opaque.

您也可以使用衍生自D2D1_COLOR_F結構的D2D1::ColorF類別來指定色彩。

    // Equivalent to the previous example.

    D2D1::ColorF clr(1, 0, 1, 1);

Alpha 混合

Alpha 混合會使用下列公式,將前景色彩與背景色彩混合,以建立半透明區域。

color = af * Cf + (1 - af) * Cb

其中 Cb 是背景色彩, Cf 是前景色彩, 而 af 是前景色彩的 Alpha 值。 此公式會成對套用至每個色彩元件。 例如,假設前景色彩 (R = 1.0、G = 0.4、B = 0.0) Alpha = 0.6,而背景色彩 (R = 0.0、G = 0.5、B = 1.0) 。 產生的 Alpha 混合色彩為:

R = (1.0 * 0.6 + 0 * 0.4) = .6
G = (0.4 * 0.6 + 0.5 * 0.4) = .44
B = (0 * 0.6 + 1.0 * 0.4) = .40

下圖顯示此混合作業的結果。

顯示 Alpha 混合的影像。

像素格式

D2D1_COLOR_F結構不會描述如何在記憶體中表示圖元。 在大部分情況下,這並不重要。 Direct2D 會處理將色彩資訊轉譯為圖元的所有內部詳細資料。 但是,如果您在記憶體中直接使用點陣圖,或結合 Direct2D 與 Direct3D 或 GDI,您可能需要知道像素格式。

DXGI_FORMAT列舉會定義像素格式的清單。 清單相當長,但只有一些清單與 Direct2D 相關。 (Direct3D) 會使用其他專案。

像素格式 描述
DXGI_FORMAT_B8G8R8A8_UNORM
這是最常見的像素格式。 所有圖元元件 (紅色、綠色、藍色和 Alpha) 都是 8 位不帶正負號的整數。 元件會以 BGRA 順序排列在記憶體中。 (請參閱後續的圖例。)
DXGI_FORMAT_R8G8B8A8_UNORM
圖元元件是以 RGBA 順序排列的 8 位不帶正負號的整數。 換句話說,會交換紅色和藍色元件,相對於 DXGI_FORMAT_B8G8R8A8_UNORM。 只有硬體裝置才支援此格式。
DXGI_FORMAT_A8_UNORM
此格式包含 8 位 Alpha 元件,不含 RGB 元件。 它適用于建立不透明度遮罩。 若要深入瞭解如何在 Direct2D 中使用不透明度遮罩,請參閱 相容的 A8 轉譯目標概觀

下圖顯示 BGRA 圖元配置。

顯示 bgra 圖元版面配置的圖表。

若要取得轉譯目標的像素格式,請呼叫 ID2D1RenderTarget::GetPixelFormat。 像素格式可能不符合顯示解析度。 例如,即使轉譯目標使用 32 位色彩,顯示器也可能設定為 16 位色彩。

Alpha 模式

轉譯目標也有 Alpha 模式,可定義 Alpha 值的處理方式。

Alpha 模式 說明
D2D1_ALPHA_MODE_IGNORE 不會執行 Alpha 混合。 Alpha 值會被忽略。
D2D1_ALPHA_MODE_STRAIGHT 直角 Alpha。 圖元的色彩元件代表 Alpha 混合之前的色彩強度。
D2D1_ALPHA_MODE_PREMULTIPLIED 預先乘法 Alpha。 圖元的色彩元件代表色彩濃度乘以 Alpha 值。 此格式比直接 Alpha 更有效率,因為從 Alpha 混合公式預先計算 (af Cf) 。 不過,此格式不適合儲存在影像檔案中。

以下是直線 Alpha 與預乘 Alpha 之間的差異範例。 假設所需的色彩是純紅色 (100% 的濃度,) 50% Alpha。 作為 Direct2D 類型,此色彩會以 (1、0、0、0、0.5) 表示。 使用直接 Alpha,並假設有 8 位色彩元件,圖元的紅色元件0xFF。 使用預先乘法的 Alpha,紅色元件會縮放 50% 以等於0x80。

D2D1_COLOR_F資料類型一律代表使用直接 Alpha 的色彩。 Direct2D 視需要將圖元轉換成預先乘法的 Alpha 格式。

如果您知道您的程式不會執行任何 Alpha 混合,請使用 D2D1_ALPHA_MODE_IGNORE Alpha 模式建立轉譯目標。 此模式可以改善效能,因為 Direct2D 可以略過 Alpha 計算。 如需詳細資訊,請參閱 改善 Direct2D 應用程式的效能

下一個

在 Direct2D 中套用轉換