共用方式為


在 Direct2D 中使用顏色

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 青色
1 0 1 品紅
1 1 0 黃色
1 1 1

顯示 rgb 色彩的影像。

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

    // 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
像素元件是8位元無符號整數,按RGBA的順序。 換句話說,會交換紅色和藍色元件,相對於 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 混合之前的色彩強度。
D2D1_ALPHA_MODE_PREMULTIPLIED 預乘Alpha。 圖元的色彩元件代表色彩強度乘以 Alpha 值。 這個格式比直 Alpha 更有效率,因為 Alpha 混合公式中的字詞 (af Cf) 是預先計算的。 不過,此格式不適用於儲存在圖像檔案中。

以下是直線 Alpha 與預乘 Alpha 之間的差異範例。 假設所需的色彩是純紅色(100% 強度),具有 50% alpha。 作為 Direct2D 類型,此色彩會以 (1, 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 中套用轉換