支持的像素格式和 Alpha 模式
本主题介绍 Direct2D 的各个部分支持的像素格式和 alpha 模式,包括每个呈现目标类型、ID2D1Bitmap 和 ID2D1ImageSource。 它包含下列部分。
- DXGI 图像源支持的 YUV 格式
- 为呈现目标指定像素格式
- ID2D1HwndRenderTarget 支持的格式
- ID2D1DeviceContext 支持的格式
- 兼容的呈现目标支持的格式
- DXGI Surface 呈现目标支持的格式
- WIC Bitmap 呈现目标支持的格式
- ID2D1DCRenderTarget 支持的格式
- 指定 ID2D1Bitmap 的像素格式
- 使用不支持的格式
- 关于 Alpha 模式
- 相关主题
DXGI 图像源支持的 YUV 格式
ID2D1ImageSource 是像素的抽象提供程序。 它可以从 WIC(CreateImageSourceFromWic 或 IDXGISurface (CreateImageSourceFromDxgi)实例化。
ID2D1ImageSourceFromWic 支持与 ID2D1Bitmap 相同的像素格式和 alpha 模式集。
除此之外,从 IDXGISurface 实例化的 ID2D1ImageSource 也支持一些 YUV 像素格式,包括分割成多个曲面的平面数据。 有关每个像素格式的要求的详细信息,请参阅 CreateImageSourceFromDxgi。
Format |
---|
DXGI_FORMAT_AYUV |
DXGI_FORMAT_NV12 |
DXGI_FORMAT_YUY2 |
DXGI_FORMAT_P208 |
DXGI_FORMAT_V208 |
DXGI_FORMAT_V408 |
DXGI_FORMAT_R8_UNORM |
DXGI_FORMAT_R8G8_UNORM |
为呈现目标指定像素格式
创建呈现目标时,必须指定其像素格式。 若要指定像素格式,请使用 D2D1_PIXEL_FORMAT 结构设置 D2D1_RENDER_TARGET_PROPERTIES 结构的 pixelFormat 成员。 然后,将该结构传递给相应的 Create 方法,例如 ID2D1Factory::CreateHwndRenderTarget。
D2D1_PIXEL_FORMAT 结构有两个字段:
- format,一个描述每个像素中通道大小和排列的 DXGI_FORMAT 值,以及
- alpha,一个描述 alpha 信息的解释方式的 D2D1_ALPHA_MODE 值。
以下示例创建一个 D2D1_PIXEL_FORMAT 结构,并使用它来指定 ID2D1HwndRenderTarget 的像素格式和 alpha 模式。
RECT rc;
GetClientRect(m_hwnd, &rc);
D2D1_SIZE_U size = D2D1::SizeU(
rc.right - rc.left,
rc.bottom - rc.top
);
// Create a pixel format and initial its format
// and alphaMode fields.
D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(
DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_IGNORE
);
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties();
props.pixelFormat = pixelFormat;
// Create a Direct2D render target.
hr = m_pD2DFactory->CreateHwndRenderTarget(
props,
D2D1::HwndRenderTargetProperties(m_hwnd, size),
&m_pRT
);
不同的呈现目标支持不同的格式和 alpha 模式组合。 以下部分列出了每个呈现目标支持的格式和 alpha 组合。
ID2D1HwndRenderTarget 支持的格式
ID2D1HwndRenderTarget 支持的格式取决于它是使用硬件还是软件呈现,或者 Direct2D 默认是否自动处理呈现模式。
注意
建议你使用 DXGI_FORMAT_B8G8R8A8_UNORM 作为像素格式来提高性能。 这对软件呈现目标特别有用。 BGRA 格式目标的性能优于 RGBA 格式。
创建 ID2D1HwndRenderTarget 时,可以使用 D2D1_RENDER_TARGET_PROPERTIES 结构指定呈现选项。 选项包括像素格式,如前一节所述。 使用此结构的类型字段可以指定呈现目标是呈现到硬件还是软件,或者 Direct2D 是否应自动确定呈现模式。
若要启用 Direct2D 以确定呈现器目标是使用硬件还是软件呈现,请使用 D2D1_RENDER_TARGET_TYPE_DEFAULT 设置。
下表列出了使用 D2D1_RENDER_TARGET_TYPE_DEFAULT 设置创建的 ID2D1HwndRenderTarget 对象的受支持格式。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
若要强制呈现目标使用硬件呈现,请使用 D2D1_RENDER_TARGET_TYPE_HARDWARE 设置。 下表列出了显式使用硬件呈现的 ID2D1HwndRenderTarget 对象的受支持格式。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
若要强制呈现目标使用软件呈现,请使用 D2D1_RENDER_TARGET_TYPE_SOFTWARE 设置。 下表列出了显式使用软件呈现的 ID2D1HwndRenderTarget 对象的受支持格式。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
无论 ID2D1HwndRenderTarget 是否为硬件加速,默认情况下,DXGI_FORMAT_UNKNOWN 格式使用 DXGI_FORMAT_B8G8R8A8,而 D2D1_ALPHA_MODE_UNKNOWN alpha 模式使用 D2D1_ALPHA_MODE_IGNORE。
ID2D1DeviceContext 支持的格式
从 Windows 8 开始,设备上下文利用更多 Direct3D 增强色格式,例如:
- DXGI_FORMAT_B8G8R8A8_UNORM_SRGB
- DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
- DXGI_FORMAT_R16G16B16A16_UNORM
- DXGI_FORMAT_R16G16B16A16_FLOAT
- DXGI_FORMAT_R32G32B32A32_FLOAT
使用 ID2D1DeviceContext::IsDxgiFormatSupported 方法查看格式是否适用于特定的设备上下文。 这些格式也可能适用于 ID2D1HwndRenderTarget。
这些格式是 Windows 7 中 ID2D1HwndRenderTarget 接口支持的格式之外的格式。 有关详细信息,请参阅设备和设备上下文。
兼容的呈现目标支持的格式
兼容的呈现目标(由 ID2D1RenderTarget::CreateCompatibleRenderTarget 方法之一创建的 ID2D1BitmapRenderTarget)继承创建它的呈现目标的受支持格式和 alpha 模式。 兼容的呈现目标还支持以下格式和 alpha 模式组合,无论其父级支持什么。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
默认情况下,DXGI_FORMAT_UNKNOWN 格式使用父呈现目标格式,D2D1_ALPHA_MODE_UNKNOWN alpha 模式默认使用 D2D1_ALPHA_MODE_PREMULTIPLIED。
DXGI Surface 呈现目标支持的格式
DXGI 呈现目标是一个 ID2D1RenderTarget,它是由 ID2D1Factory::CreateDxgiSurfaceRenderTarget 方法之一创建的。 它支持以下格式和 alpha 模式组合。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
注意
该格式必须与 DXGI 图面呈现目标绘制到的 DXGI 图面的格式匹配。
默认情况下,DXGI_FORMAT_UNKNOWN 格式使用 DXGI 图面格式。 不要将 D2D1_ALPHA_MODE_UNKNOWN alpha 模式与 DXGI 图面呈现目标一起使用。 它没有默认值,将导致 DXGI 图面呈现目标创建失败。
WIC Bitmap 呈现目标支持的格式
WIC 呈现目标是一个 ID2D1RenderTarget,它是由 ID2D1Factory::CreateWicBitmapRenderTarget 方法之一创建的。 它支持以下格式和 alpha 模式组合。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
WIC 位图目标的像素格式必须与 WIC 位图的像素格式匹配。
默认情况下,DXGI_FORMAT_UNKNOWN 格式使用 WIC 位图格式;而默认情况下,D2D1_ALPHA_MODE_UNKNOWN alpha 模式使用 WIC 位图 alpha 模式。
ID2D1DCRenderTarget 支持的格式
ID2D1DCRenderTarget 支持以下格式和 alpha 模式组合。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
请勿将 DXGI_FORMAT_UNKNOWN 格式或 D2D1_ALPHA_MODE_UNKNOWN alpha 模式与 ID2D1DCRenderTarget 一起使用。 它没有默认值,将导致 ID2D1DCRenderTarget 创建失败。
指定 ID2D1Bitmap 的像素格式
通常,ID2D1Bitmap 对象支持以下格式和 alpha 模式(有一些限制,将在下面的段落中描述)。
Format | Alpha 模式 |
---|---|
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT |
DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_UNKNOWN | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_B8G8R8X8_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC1_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_BC1_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC1_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_BC2_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_BC2_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC2_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_UNKNOWN |
DXGI_FORMAT_BC3_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_PREMULTIPLIED |
DXGI_FORMAT_BC3_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_IGNORE |
DXGI_FORMAT_BC3_UNORM(仅 Windows 8.1 及更高版本) | D2D1_ALPHA_MODE_UNKNOWN |
当使用 ID2D1RenderTarget::CreateSharedBitmap 方法时,可以使用 D2D1_BITMAP_PROPERTIES 结构的 pixelFormat 字段来指定新呈现目标的像素格式。 它必须与 ID2D1Bitmap 源的像素格式匹配。
使用 CreateBitmapFromWicBitmap 方法时,可以使用 D2D1_BITMAP_PROPERTIES 结构的 pixelFormat 字段(而不是 D2D1_RENDER_TARGET_PROPERTIES 结构的 pixelFormat 成员)来指定新呈现目标的像素格式。 它必须与 WIC 位图源的像素格式匹配。
注意
有关对块压缩 (BCₙ) 像素格式的支持的详细信息,请参阅块压缩。
支持的 WIC 格式
使用 CreateBitmapFromWicBitmap 方法从 WIC 位图创建位图时,或者将 CreateSharedBitmap 方法与 IWICBitmapLock 配合使用时,WIC 源必须采用 Direct2D 支持的格式。
WIC 格式 | 相应的 DXGI 格式 | 相应的 alpha 模式 |
---|---|---|
GUID_WICPixelFormat8bppAlpha | DXGI_FORMAT_A8_UNORM | D2D1_ALPHA_MODE_STRAIGHT 或 D2D1_ALPHA_MODE_PREMULTIPLIED |
GUID_WICPixelFormat32bppPRGBA | DXGI_FORMAT_R8G8B8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED 或 D2D1_ALPHA_MODE_IGNORE |
GUID_WICPixelFormat32bppBGR | DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_IGNORE |
GUID_WICPixelFormat32bppPBGRA | DXGI_FORMAT_B8G8R8A8_UNORM | D2D1_ALPHA_MODE_PREMULTIPLIED |
有关如何将 WIC 位图转换为受支持的格式的示例,请参阅如何从文件加载位图。
使用不支持的格式
使用前面表中列出的像素格式和 alpha 模式以外的任何组合会导致 D2DERR_UNSUPPORTED_PIXEL_FORMAT 或 E_INVALIDARG 错误。
关于 Alpha 模式
关于预乘和直 Alpha 模式
D2D1_ALPHA_MODE 枚举指示 alpha 通道是使用预乘 alpha、直 alpha 还是应忽略并被视为不透明。 对于直 alpha,alpha 通道指示与颜色透明程度相对应的值。
无论目标格式如何,Direct2D 绘图命令和画笔始终将颜色视为直接 alpha。
使用预乘 alpha 时,每个颜色通道都按 alpha 值进行缩放。 通常,没有颜色通道值大于 alpha 通道值。 如果采用预乘格式的颜色通道值大于 alpha 通道,则标准源过度混合数学将创建加法混合。
alpha 通道本身的值在直接和预乘 alpha 中相同。
直和预乘 Alpha 之间的差异
使用直 alpha 描述 RGBA 颜色时,颜色的 alpha 值存储在 alpha 通道中。 例如,若要描述 60% 不透明的红色,请使用以下值:(255, 0, 0, 255 * 0.6) = (255, 0, 0, 153)。 255 值表示全红色,153(即 255% 的 60%)表示颜色应不透明度为 60%。
使用预乘 alpha 描述 RGBA 颜色时,每个颜色乘以 alpha 值:(255 * 0.6, 0 * 0.6, 0 * 0.6, 255 * 0.6) = (153, 0, 0, 153)。
无论呈现目标的 alpha 模式如何,D2D1_COLOR_F 值始终解释为直 alpha。 例如,当指定 ID2D1SolidColorBrush 的颜色以与使用预乘 alpha 模式的呈现目标一起使用时,请指定颜色,就像呈现目标使用直线 alpha 时一样。 使用画笔进行绘制时,Direct2D 会将颜色转换为目标格式。
呈现目标的 Alpha 模式
无论 alpha 模式设置如何,呈现目标的内容都支持透明度。 例如,如果绘制一个部分透明的红色矩形,其呈现目标的 alpha 模式为 D2D1_ALPHA_MODE_IGNORE,则该矩形将显示为粉红色(如果背景为白色)。
如果在 alpha 模式为 D2D1_ALPHA_MODE_PREMULTIPLIED 时绘制一个部分透明的红色矩形,该矩形将显示为粉红色(假设背景为白色),并且你可以将其查看到呈现目标后面的任何内容。 当使用 ID2D1DCRenderTarget 呈现到透明窗口或使用兼容的呈现目标(CreateCompatibleRenderTarget 方法创建的呈现器目标)创建支持透明度的位图时,这非常有用。
ClearType 和 Alpha 模式
如果为呈现目标指定了除 D2D1_ALPHA_MODE_IGNORE 之外的 alpha 模式,则文本抗锯齿模式会自动从 D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE 更改为 D2D1_TEXT_ANTIALIAS_MODE GRAYSCALE。 (当将 alpha 模式指定为 D2D1_ALPHA_MODE_UNKNOWN 时,Direct2D 会根据呈现目标的类型为你设置 alpha。)
可以使用 SetTextAntialiasMode 方法将文本抗锯齿模式更改回 D2D1_TEXT_ANTIALIAS_MODE CLEARTYPE,但将 ClearType 文本呈现到透明图面可能会产生不可预知的结果。 如果要将 ClearType 文本呈现为透明呈现目标,建议使用以下两种技术之一。
- 使用 PushAxisAlignedClip 方法将呈现目标剪辑到要呈现文本的区域,然后调用 Clear 方法并指定不透明颜色,然后呈现文本。
- 使用 DrawRectangle 在呈现文本的区域后面绘制不透明的矩形。