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 支持的格式取决于它是使用硬件还是软件进行呈现,或者 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 模式
无论 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_UNKNOWN格式使用父呈现目标格式,D2D1_ALPHA_MODE_UNKNOWN alpha 模式默认使用 D2D1_ALPHA_MODE_PREMULTIPLIED。
DXGI 呈现目标是由 ID2D1Factory::CreateDxgiSurfaceRenderTarget 方法之一创建的 ID2D1RenderTarget。 它支持以下格式和 alpha 模式组合。
Alpha 模式
默认情况下,DXGI_FORMAT_UNKNOWN格式使用 DXGI 图面格式。 不要将 D2D1_ALPHA_MODE_UNKNOWN alpha 模式与 DXGI 图面呈现目标一起使用。 它没有默认值,将导致 DXGI 图面呈现目标创建失败。
WIC 位图呈现目标是由 ID2D1Factory::CreateWicBitmapRenderTarget 方法之一创建的 ID2D1RenderTarget。 它支持以下格式和 alpha 模式组合。
Alpha 模式
WIC 位图目标的像素格式必须与 WIC 位图的像素格式匹配。
DXGI_FORMAT_UNKNOWN格式默认使用 WIC 位图格式,D2D1_ALPHA_MODE_UNKNOWN alpha 模式默认使用 WIC 位图 alpha 模式。
ID2D1DCRenderTarget 支持以下格式和 alpha 模式组合。
Alpha 模式
请勿将 DXGI_FORMAT_UNKNOWN 格式或 D2D1_ALPHA_MODE_UNKNOWN alpha 模式与 ID2D1DCRenderTarget 一起使用。 它没有默认值,将导致 ID2D1DCRenderTarget 创建失败。
通常, ID2D1Bitmap 对象支持以下格式和 alpha 模式, (一些限制,如以下段落中所述。)
Alpha 模式
使用 ID2D1RenderTarget::CreateSharedBitmap 方法时,将使用D2D1_BITMAP_PROPERTIES结构的 pixelFormat 字段来指定新呈现目标的像素格式。 它必须与 ID2D1Bitmap 源的像素格式匹配。
使用 CreateBitmapFromWicBitmap 方法时,可以使用D2D1_BITMAP_PROPERTIES结构的 pixelFormat 字段 (而不是D2D1_RENDER_TARGET_PROPERTIES结构的 pixelFormat 成员) 来指定新呈现目标的像素格式。 它必须与 WIC 位图源的像素格式匹配。
有关支持块压缩 (BCn) 像素格式的详细信息,请参阅 块压缩。
使用 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 在将呈现文本的区域后面绘制一个不透明的矩形。
D2D1_PIXEL_FORMAT
D2D1_ALPHA_MODE
DXGI_FORMAT