支持的像素格式和 Alpha 模式
本主题介绍 Direct2D 的各个部分支持的像素格式和 alpha 模式,包括每种呈现目标类型、 ID2D1Bitmap 和 ID2D1ImageSource。 其中包含以下各节。
- DXGI 图像源支持的 YUV 格式
- 为呈现器目标指定像素格式
- ID2D1HwndRenderTarget 支持的格式
- ID2D1DeviceContext 支持的格式
- 兼容呈现器目标支持的格式
- DXGI Surface 呈现目标支持的格式
- WIC 位图呈现目标支持的格式
- ID2D1DCRenderTarget 支持的格式
- 为 ID2D1Bitmap 指定像素格式
- 使用不受支持的格式
- 关于 Alpha 模式
- 相关主题
DXGI 图像源支持的 YUV 格式
ID2D1ImageSource 是像素的抽象提供程序。 可以从 WIC (CreateImageSourceFromWic 或 IDXGISurface (CreateImageSourceFromDxgi) 实例化它。
ID2D1ImageSourceFromWic 支持与 ID2D1Bitmap 相同的像素格式和 alpha 模式集。
除了上述格式,从 IDXGISurface 实例化的 ID2D1ImageSource 还支持一些 YUV 像素格式,包括拆分为多个图面的平面数据。 有关每种像素格式的要求的详细信息,请参阅 CreateImageSourceFromDxgi 。
格式 |
---|
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 对象支持的格式。
格式 | 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 对象支持的格式。
格式 | 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 对象支持的格式。
格式 | 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 模式组合,无论其父对象支持什么。
格式 | 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 呈现目标是由 ID2D1Factory::CreateDxgiSurfaceRenderTarget 方法之一创建的 ID2D1RenderTarget。 它支持以下格式和 alpha 模式组合。
格式 | 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 位图呈现目标支持的格式
WIC 位图呈现目标是由 ID2D1Factory::CreateWicBitmapRenderTarget 方法之一创建的 ID2D1RenderTarget。 它支持以下格式和 alpha 模式组合。
格式 | 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 模式组合。
格式 | 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 模式, (一些限制,如以下段落中所述。)
格式 | 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 位图源的像素格式匹配。
注意
有关支持块压缩 (BCn) 像素格式的详细信息,请参阅 块压缩。
支持的 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 之间的差异
使用直 alpha 描述 RGBA 颜色时,颜色的 alpha 值存储在 alpha 通道中。 例如,若要描述不透明为 60% 的红色,请使用以下值: (255、0、0、0、255 * 0.6) = (255、0、0、153) 。 255 值表示全红色,153 (255) 表示颜色的不透明度应为 60%。
使用预乘 alpha 描述 RGBA 颜色时,每种颜色乘以 alpha 值: (255 * 0.6, 0 * 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 在将呈现文本的区域后面绘制一个不透明的矩形。
相关主题