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混合创建半透明区域。
颜色=αfCf+(1−αf)Cb
颜
色
=
α
f
C
f
+
(
1
−
α
f
)
C
b
其中Cb是背景色,Cf是前景色,αf是前景色的α值。这个公式被成对地应用于每个颜色分量。例如,假设前景色为(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)=0.6
R
=
(
1.0
×
0.6
+
0
×
0.4
)
=
0.6
G=(0.4×0.6+0.5×0.4)=0.44
G
=
(
0.4
×
0.6
+
0.5
×
0.4
)
=
0.44
B=(0×0.6+1.0×0.4)=0.40
B
=
(
0
×
0.6
+
1.0
×
0.4
)
=
0.40
下图显示了这种混合操作的结果。
显示alpha混合的图像。
像素格式
D2D1_COLOR_F结构没有描述如何在内存中表示像素。在大多数情况下,这并不重要。Direct2D处理将颜色信息转换为像素的所有内部细节。但是,如果直接在内存中使用位图,或者将Direct2D与Direct3D或GDI结合使用,则可能需要了解像素格式。
DXGI_FORMAT枚举定义了一个像素格式的列表。该列表相当长,但其中只有少数与Direct2D相关。(其他的被Direct3D使用)。
像素格式 | 描述 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | 这是最常见的像素格式。所有像素分量(红色,绿色,蓝色和阿尔法)都是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模式 | 应将描述 |
---|---|
D2D1_ALPHA_MODE_IGNORE | 不执行阿尔法混合。Alpha值被忽略。 |
D2D1_ALPHA_MODE_STRAIGHT | 直的阿尔法。像素的颜色分量表示alpha混合之前的颜色强度。 |
D2D1_ALPHA_MODE_PREMULTIPLIED | 预乘alpha。像素的颜色分量表示颜色强度乘以阿尔法值。由于alpha混合公式中的项(αf×Cf)是预先计算的,因此此格式比直接alpha更有效。但是,这种格式不适合存储在图像文件中。 |
这里是直接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中应用转换