本主题介绍 Direct2D 的各个部分支持的像素格式和 alpha 模式,包括每种呈现目标类型、 ID2D1Bitmap ID2D1ImageSource 。 其中包含以下各节。

  • DXGI 图像源支持的 YUV 格式
  • 为呈现器目标指定像素格式
  • ID2D1HwndRenderTarget 支持的格式
  • ID2D1DeviceContext 支持的格式
  • 兼容呈现器目标支持的格式
  • DXGI Surface 呈现目标支持的格式
  • WIC 位图呈现目标支持的格式
  • ID2D1DCRenderTarget 支持的格式
  • 为 ID2D1Bitmap 指定像素格式
  • 支持的 WIC 格式
  • 使用不受支持的格式
  • 关于 Alpha 模式
  • 关于预乘和直 Alpha 模式
  • 直 Alpha 和预乘 Alpha 之间的差异
  • 呈现器目标的 Alpha 模式
  • ClearType 和 Alpha 模式
  • DXGI 图像源支持的 YUV 格式

    ID2D1ImageSource 是像素的抽象提供程序。 可以从 WIC ( CreateImageSourceFromWic IDXGISurface ( CreateImageSourceFromDxgi ) 实例化它。

    ID2D1ImageSourceFromWic 支持与 ID2D1Bitmap 相同的像素格式和 alpha 模式集。

    除了上述格式,从 IDXGISurface 实例化的 ID2D1ImageSource 还支持一些 YUV 像素格式,包括拆分为多个图面的平面数据。 有关每种像素格式的要求的详细信息,请参阅 CreateImageSourceFromDxgi

    为呈现器目标指定像素格式

    创建呈现器目标时,必须指定其像素格式。 若要指定像素格式,请使用 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 模式

    无论 ID2D1HwndRenderTarget 是否为硬件加速, DXGI_FORMAT_UNKNOWN 格式默认使用 DXGI_FORMAT_B8G8R8A8D2D1_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 Surface 呈现器目标支持的格式

    DXGI 呈现目标是由 ID2D1Factory::CreateDxgiSurfaceRenderTarget 方法之一创建的 ID2D1RenderTarget。 它支持以下格式和 alpha 模式组合。

    Alpha 模式

    默认情况下,DXGI_FORMAT_UNKNOWN格式使用 DXGI 图面格式。 不要将 D2D1_ALPHA_MODE_UNKNOWN alpha 模式与 DXGI 图面呈现目标一起使用。 它没有默认值,将导致 DXGI 图面呈现目标创建失败。

    WIC 位图呈现目标支持的格式

    WIC 位图呈现目标是由 ID2D1Factory::CreateWicBitmapRenderTarget 方法之一创建的 ID2D1RenderTarget。 它支持以下格式和 alpha 模式组合。

    Alpha 模式

    WIC 位图目标的像素格式必须与 WIC 位图的像素格式匹配。

    DXGI_FORMAT_UNKNOWN格式默认使用 WIC 位图格式,D2D1_ALPHA_MODE_UNKNOWN alpha 模式默认使用 WIC 位图 alpha 模式。

    ID2D1DCRenderTarget 支持的格式

    ID2D1DCRenderTarget 支持以下格式和 alpha 模式组合。

    Alpha 模式

    请勿将 DXGI_FORMAT_UNKNOWN 格式或 D2D1_ALPHA_MODE_UNKNOWN alpha 模式与 ID2D1DCRenderTarget 一起使用。 它没有默认值,将导致 ID2D1DCRenderTarget 创建失败。

    为 ID2D1Bitmap 指定像素格式

    通常, ID2D1Bitmap 对象支持以下格式和 alpha 模式, (一些限制,如以下段落中所述。)

    Alpha 模式

    使用 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_FORMATE_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