在 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 |
介于 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
下图显示了此混合操作的结果。
像素格式
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 像素布局。
若要获取呈现目标的像素格式,请调用 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 应用程序的性能。