注意
对于 Windows 10 上的应用,我们建议使用 Windows.UI.Composition API 而不是 DirectComposition。 有关详细信息,请参阅 使用视觉层现代化桌面应用。
Microsoft DirectComposition 是位图合成引擎。 它使应用程序开发人员能够组合多个位图,并以多种方式对其进行作,以在应用程序 UI 中实现有趣的视觉效果和动画。 本主题介绍 DirectComposition 支持的位图内容类型。
位图内容
应用程序通过创建视觉对象,然后设置这些对象的 Content 属性,为 DirectComposition 提供位图内容来撰写和制作动画。 DirectComposition 不提供任何光栅化服务。 应用程序必须使用其他一些基于软件或硬件加速的光栅化库,例如 Direct2D 或 Direct3D 来填充要组合的位图。 撰写后,DirectComposition 会将组合位图内容传递给 桌面窗口管理器(DWM),以便呈现到屏幕。
DirectComposition 支持的位图内容类型 Microsoft DirectComposition 支持以下类型的位图:
视频内存位图
使用 Microsoft DirectX 方法(包括 DX 到 GDI 互作模型)在硬件中光栅化视频内存位图。 它由对调用应用程序和 DirectComposition 可见的跨进程共享图面提供支持。 视频内存位图不受撕裂,因为应用程序只能从 DirectComposition 纹理的图面中读取。
视频内容
应用程序可以使用 DirectComposition 编写使用 DirectX 无窗换链(绑定到 DirectComposition 图面)的视频帧。 从概念上讲,DirectComposition 将视频内容视为位图序列。 DirectComposition 不提供演示视频帧的方法。
DirectComposition 支持 DirectX 无窗换链,即不绑定到特定窗口的交换链,并使两个不同的应用程序跨进程边界共享无窗换链。 共享无窗换链可实现在一个进程中创建交换链并在第二个进程中用于 DirectComposition 的视频方案。 使用 IDXGIFactory2::CreateSwapChainForCompositionSurface 方法创建无窗换链。
有关 DirectX 交换链的详细信息,请参阅 DXGI 概述。
立体声内容
从概念上讲,立体声交换链由表示立体声 3D 内容的左右通道的 Microsoft DirectX 图形基础结构(DXGI)图面组成。 当立体声交换链用作视觉对象的位图资源时,DirectComposition 将组合在立体声中。 所有非立体声内容(单声道内容)都被视为具有相同的左右通道内容;也就是说,同一位图内容用于这两个通道。 DirectComposition 分别组合所有左侧内容和所有右侧内容。 如果显示设备不支持立体声,DirectComposition 会将左侧或右侧立体声通道(具体取决于应用程序)视为单声道内容,并且仅使用位图资源的该数据进行撰写。
DirectComposition 不支持创建或作立体声内容,并且无法将单声道交换链提升为立体声对。 应用程序必须在向 DirectComposition 呈现 DirectX 立体声内容之前执行这些任务。 此外,应用程序必须提供用于深度感知的左右通道偏移量;DirectComposition 无法调整左右通道偏移量,以修改 DirectX 立体声内容的感知深度。
当支持立体声的硬件可用时,DirectX 立体声内容将组合并持久保存到 DWM。
窗口位图
“窗口位图”不是真实位图,而是 DirectComposition 实时替换为分层顶层窗口或子窗口的光栅化占位符。 窗口位图类似于 DWM 缩略图,不同之处在于缩略图可以包含许多窗口(例如拥有的非子窗口)的贡献,而 DirectComposition 窗口位图始终只是一个窗口及其子窗口的表示形式。
由于 DirectComposition 可以访问所有窗口和所有可视化树的重定向图面,因此它可以重用多个可视化树中一个窗口中的内容。 窗口必须分层,因为非分层窗口没有专用重定向图面,因此,其光栅化并非始终可用于 DirectComposition。
若要使用窗口位图,应用程序将视觉对象与窗口句柄(HWND)相关联。 之后,每当窗口的内容发生更改时,DirectComposition 将重新组合视觉对象,包括当内容因与窗口关联的视觉树更改而更改时。 换句话说,与 DWM 缩略图一样,DirectComposition 窗口位图为“live”。
将位图内容与视觉对象相关联
对于所有三种类型的位图,应用程序可以将同一位图与多个视觉对象相关联,这意味着可以使用单个内存分配多次显示相同的内容。
Alpha 通道
所有位图都具有每像素 32 位(BPP)格式,其中包括每个像素透明度的 8 位。 但是,应用程序可以指定 DirectComposition 应如何使用 alpha 通道。 具体而言,DirectComposition 可以尊重 alpha 通道,也可以完全忽略 alpha,在这种情况下,位图被视为完全不透明。
其他 alpha 模式将忽略 alpha 通道,但将红色、绿色和蓝色值视为每通道 alpha 值,而不是将这些通道的正常解释视为颜色强度。 此模式适用于 ClearType 呈现,这需要子像素覆盖率信息。 若要使用每通道 alpha 模式,应用程序必须首先使用 Direct2D,DirectWrite 将子像素覆盖数据写入位图。 接下来,应用程序必须设置正确的 alpha 模式,并在将位图与视觉对象关联时指定文本颜色。 DirectComposition 将文本颜色与覆盖数据混合,从而生成与背景的 ClearType 混合。
如果 ClearType 算法不适用,例如,如果位图不是像素对齐和轴对齐,或者需要绘制到中间图面,DirectComposition 可以使用位图中的子像素覆盖数据来改为生成灰度光栅化,且无需额外付费。
有关详细信息,请参阅 IDCompositionDevice::CreateSurface 或 IDCompositionDevice::CreateVirtualSurface 函数的 alphaMode 参数的说明。
相关主题