Bitmap 对象

注意

对于 Windows 10 上的应用,建议使用 Windows.UI.Composition API 而不是 DirectComposition。 有关详细信息,请参阅 使用视觉对象层实现桌面应用的现代化

Microsoft DirectComposition 是位图合成引擎。 它使应用程序开发人员能够组合多个位图,并以各种方式操作它们,从而在应用程序 UI 中实现有趣的视觉效果和动画。 本主题介绍 DirectComposition 支持的位图内容类型。

位图内容

应用程序通过创建可视对象,然后设置这些对象的 Content 属性 ,为 DirectComposition 提供用于撰写和动画处理的位图内容。 DirectComposition 不提供任何光栅化服务。 应用程序必须使用其他一些基于软件或硬件加速的光栅化库(如 Direct2DDirect3D )来填充要组合的位图。 撰写后,DirectComposition 将组合的位图内容传递到 桌面窗口管理器 (DWM) 以呈现到屏幕。

支持的位图内容类型 Microsoft DirectComposition 支持以下类型的位图:

视频内存位图

视频内存位图使用 Microsoft DirectX 方法在硬件中光栅化 (包括 DX 到 GDI 互操作模型) 。 它由跨进程共享图面提供支持,这些图面对调用应用程序和 DirectComposition 可见。 视频内存位图不受撕裂,因为应用程序只能从 DirectComposition 纹理的图面进行读取。

视频内容

应用程序可以使用 DirectComposition 来撰写使用绑定到 DirectComposition 图面的 DirectX 无窗口交换链的视频帧。 从概念上讲,DirectComposition 将视频内容视为一系列位图。 DirectComposition 不提供呈现视频帧的方法。

DirectComposition 支持 DirectX 无窗口交换链(即未绑定到特定窗口的交换链),并允许两个不同的应用程序跨进程边界共享无窗口交换链。 共享无窗口交换链可实现在一个进程中创建交换链并在第二个进程中与 DirectComposition 一起使用的视频方案。 无窗口交换链是使用 IDXGIFactory2::CreateSwapChainForCompositionSurface 方法创建的。

有关 DirectX 交换链的详细信息,请参阅 DXGI 概述

立体声内容

从概念上讲,立体声交换链由 Microsoft DirectX 图形基础结构 (DXGI) 表面组成,这些图面代表立体声 3D 内容的左右通道。 当立体声交换链用作视觉对象的位图资源时,DirectComposition 以立体声方式撰写。 所有非立体声内容 (单声道内容) 被视为具有相同的左右通道内容;也就是说,这两个通道使用相同的位图内容。 DirectComposition 将单独组成所有左侧内容和所有右侧内容。 如果显示设备不支持立体声,DirectComposition 会根据应用程序 () 将左右立体声通道视为单声道内容,并仅使用该数据对位图资源进行撰写。

DirectComposition 不支持创建或操作立体声内容,并且无法将单声道交换链提升为立体声对。 在向 DirectComposition 显示 DirectX 立体声内容之前,应用程序必须执行这些任务。 此外,应用程序必须为深度感知提供左右通道偏移量;DirectComposition 无法调整左右声道偏移量以修改 DirectX 立体声内容的感知深度。

当支持立体声的硬件可用时,DirectX 立体声内容将组成并持久保存到 DWM。

窗口位图

“窗口位图”不是真实位图,而是 DirectComposition 实时替换为分层顶层窗口或子窗口的光栅化的占位符。 窗口位图类似于 DWM 缩略图,只是缩略图可以包含来自许多窗口(例如拥有的非子窗口)的贡献,而 DirectComposition 窗口位图始终是一个窗口及其子窗口的表示形式。

由于 DirectComposition 有权访问所有窗口和所有视觉树的重定向图面,因此它可以在多个可视化树中重复使用一个窗口中的内容。 窗口必须分层,因为非分层窗口没有专用的重定向图面,因此,其光栅化并不总是可供 DirectComposition 使用。

若要使用窗口位图,应用程序会将视觉对象与 (HWND) 窗口句柄相关联。 之后,只要窗口的内容发生更改,包括由于与窗口关联的视觉树的更改而导致内容更改,DirectComposition 将重新撰写视觉对象。 换句话说,与 DWM 缩略图一样,DirectComposition 窗口位图是“实时的”。

将位图内容与视觉对象关联

对于所有三种位图,应用程序可以将同一位图与多个视觉对象相关联,这意味着单个内存分配可用于多次显示相同内容。

Alpha 通道

所有位图都具有每像素 32 位, (BPP) 格式,其中包括每像素透明度的 8 位。 但是,应用程序可以指定 DirectComposition 应如何使用 alpha 通道。 特别是,DirectComposition 可以遵循 alpha 通道,也可以完全忽略 alpha,在这种情况下,位图被视为完全不透明。

其他 alpha 模式将忽略 alpha 通道,但将红色、绿色和蓝色值视为每通道 alpha 值,而不是将这些通道的正常解释视为颜色强度。 此模式适用于需要子像素覆盖率信息的 ClearType 呈现。 若要使用每通道 alpha 模式,应用程序必须首先使用 Direct2DDirectWrite 将子像素覆盖率数据写入位图。 接下来,应用程序必须设置正确的 alpha 模式,并在将位图与视觉对象关联时指定文本颜色。 DirectComposition 将文本颜色与覆盖数据混合,从而根据背景生成 ClearType 混合。

如果 ClearType 算法不适用,例如位图不是像素对齐和轴对齐,或者需要绘制到中间图面,DirectComposition 可以使用位图中的子像素覆盖数据来自动生成灰度光栅化,而无需额外付费。

有关详细信息,请参阅 IDCompositionDevice::CreateSurfaceIDCompositionDevice::CreateVirtualSurface 函数的 alphaMode 参数的说明。

DirectComposition 概念