Direct2D 中使用 RGB 颜色模型,所有颜色都是通过红、绿、蓝三种颜色组合而成的。还有一个分量,alpha,代表像素的透明度。在 Direct2D 中,这四个分量都是浮点数,范围是 [0.0,1.0] 之间。前三个分量代表颜色的强度,对于第四分量 alpha,0.0代表完全透明,而1.0代表完全不透明。下面是常见颜色表:

Red Green Blue Color
0 0 0 Black
1 0 0 Red
0 1 0 Green
0 0 1 Blue
0 1 1 Cyan
1 0 1 Magenta
1 1 0 Yellow
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::ColorF 来指定颜色。

// Equivalent to the previous example.

D2D1::ColorF clr(1, 0, 1, 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 * 0.4) = 0.60 
G = (0.4 * 0.6 + 0.5 * 0.4) = 0.44 
B = (0.0 * 0.6 + 1.0 * 0.4) = 0.40

下面这张图展示了混合结果:

混合效果

2. 像素格式

D2D1_COLOR_F 结构体没有描述一个像素是如何存储在内存中的。在大多数的情况下,这一点无关紧要,Direct2D 会负责内部细节。但是如果你内存中使用了位图,你可能就需要知道对应的颜色格式,或者你同时使用 Direct2D、Direct3D 或者 GDI 的时候。

DXGI_FORMAT 枚举定义了像素格式列表。这个列表很长,但是仅有几种于 Direct2D 有关。

Pixel format Description
DXGI_FORMAT_B8G8R8A8_UNORM This is the most common pixel format. All pixel components (red, green, blue, and alpha) are 8-bit unsigned integers. The components are arranged in BGRA order in memory. (See illustration that follows.)
DXGI_FORMAT_R8G8B8A8_UNORM Pixel components are 8-bit unsigned integers, in RGBAorder. In other words, the red and blue components are swapped, relative to DXGI_FORMAT_B8G8R8A8_UNORM. This format is supported only for hardware devices.
DXGI_FORMAT_A8_UNORM This format contains an 8-bit alpha component, with no RGB components. It is useful for creating opacity masks. To read more about using opacity masks in Direct2D, see Compatible A8 Render Targets Overview.

下面的插图展示了 BGRA 像素布局:

颜色分量

通过 ID2D1RenderTarget::GetPixelFormat 可以获取渲染目标的像素格式。像素个是可能和显示分辨率不匹配。例如,显示可能是16位像素颜色,但是渲染目标使用的是32位颜色。

3. Alpha模式

一个渲染目标还有一个 alpha 模式的概念,其定义如何处理 alpha 值:

Alpha mode Desciption
D2D1_ALPHA_MODE_IGNORE No alpha blending is performed. Alpha values are ignored.
D2D1_ALPHA_MODE_STRAIGHT Straight alpha. The color components of the pixel represent the color intensity prior to alpha blending.
D2D1_ALPHA_MODE_PREMULTIPLIED Premultiplied alpha. The color components of the pixel represent the color intensity multiplied by the alpha value. This format is more efficient to render than straight alpha, because the term (af Cf) from the alpha-blending formula is pre-computed. However, this format is not appropriate for storing in an image file.

这里简单的举个例子,说一下 straight alpha 和 premultiplied alpha 的区别。假设想要的是50%透明度(50% alpha)的纯红色(100% intensity)。在Direct2D中,用(1,0,0,0.5)表示。使用 straight alpha,假设通道是8位的颜色分量,这个红色通道的像素值为0xFF。使用 premultiplied alpha,这个红色通道被缩放50%,即0x80。

D2D1_COLOR_F 总是用 straight alpha 代表颜色。如果你必要,Direct2D 可以将颜色转换为 premultiplied alpha 格式。

如果你知道你的程序不会用到 alpha 混合,可以使用D2D1_ALPHA_MODE_IGNORE 模式创建渲染目标。这个模式下可以提高渲染性能。因为 Direct2D 可以跳过 alpha 计算。