Windows桌面应用程序(1-2-4-8th) 在Direct2D中使用颜色

时间:2021-03-17 08:10:27

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 白色

Windows桌面应用程序(1-2-4-8th) 在Direct2D中使用颜色
显示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混合创建半透明区域。
= α 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
G = ( 0.4 × 0.6 + 0.5 × 0.4 ) = 0.44
B = ( 0 × 0.6 + 1.0 × 0.4 ) = 0.40
下图显示了这种混合操作的结果。
Windows桌面应用程序(1-2-4-8th) 在Direct2D中使用颜色
显示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像素布局。
Windows桌面应用程序(1-2-4-8th) 在Direct2D中使用颜色
显示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中应用转换


原文链接:Using Color in Direct2D