在 Direct2D 中使用颜色

Direct2D 使用 RGB 颜色模型,其中颜色是通过组合红色、绿色和蓝色的不同值形成的。 第四个分量 alpha 测量像素的透明度。 在 Direct2D 中,每个组件都是一个浮点值,范围为 [0.0 1.0]。 对于三种颜色分量,该值测量颜色的强度。 对于 alpha 分量,0.0 表示完全透明,1.0 表示完全不透明。 下表显示了 100% 强度的各种组合产生的颜色。

Red 绿色 蓝色 Color
0 0 0 黑色
1 0 0 Red
0 1 0 绿色
0 0 1 蓝色
0 1 1 青色
1 0 1 洋红色
1 1 0 黄色
1 1 1 White

显示 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。 像素的颜色分量表示 alpha 混合之前的颜色强度。
D2D1_ALPHA_MODE_PREMULTIPLIED 预乘 alpha。 像素的颜色分量表示颜色强度乘以 alpha 值。 与直 alpha 相比,此格式的呈现效率更高,因为 alpha 混合公式中的术语 (af Cf) 是预先计算的。 但是,此格式不适合存储在图像文件中。

下面是直 alpha 与预乘 alpha 之间的差异的示例。 假设所需颜色为纯红色, (100% 强度) ,alpha 为 50%。 作为 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 中应用转换