Direct2D 颜色简介

认识颜色

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

REDGREENBLUECOLOR
000Black
100Red
010Green
001Blue
011Cyan
101Magenta
110Yellow
111White

颜色值

这些颜色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 FORMATDESCRIPTION
DXGI_FORMAT_B8G8R8A8_UNORMThis 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_UNORMPixel 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_UNORMThis 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 MODEDESCIPTION
D2D1_ALPHA_MODE_IGNORENo alpha blending is performed. Alpha values are ignored.
D2D1_ALPHA_MODE_STRAIGHTStraight alpha. The color components of the pixel represent the color intensity prior to alpha blending.
D2D1_ALPHA_MODE_PREMULTIPLIEDPremultiplied 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 计算。

大佬,给点反馈?

平均评分 / 5. 投票数:

很抱歉,这篇文章不能帮助到你

请让我们改进这篇文章

告诉我们我们如何改善这篇文章?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注