DirectComposition) (效果
注意
对于 Windows 10 上的应用,建议使用 Windows.UI.Composition API 而不是 DirectComposition。 有关详细信息,请参阅 使用视觉对象层实现桌面应用的现代化。
本主题讨论 Microsoft DirectComposition 效果的基础知识,并介绍 DirectComposition 支持的效果类型。
本主题包含以下各节:
什么是 DirectComposition 效果?
DirectComposition 效果 是在视觉对象的光栅化过程中应用的位图操作,用于以某种方式更改视觉对象的外观。
DirectComposition 通过在应用效果之前获取可视子树并将其呈现为单个位图来创建效果。 例如,若要创建 3D 透视转换效果,DirectComposition 会生成可视子树的图像,然后将图像纹理化到根据 3D 转换效果生成的矩阵进行转换的 3D 平面上。
DirectComposition 支持以下类型的效果。
效果类型 | 说明 |
---|---|
不透明度 | 设置整个视觉对象的不透明度。 |
3D 透视转换 | 将三维 (3D) 透视转换效果应用于视觉对象。 |
注意
将效果应用于 3D 立体声内容时,DirectComposition 不执行特殊处理。 这意味着在应用效果时,3D 内容可能会显得失真。
不透明度
通过不透明度效果,可以设置呈现视觉对象时应用于整个视觉对象的不透明度因子。 它与 alpha 掩码的不同之处在于,相同的不透明度因子应用于视觉对象中的所有像素。 不透明度指定为介于 0 (完全透明) 到 1 (完全不透明) 的值。
不透明度因子从父视觉对象应用到子视觉对象,但嵌套不透明度设置的可见效果不会在各个子视觉对象的属性值中指示。 例如,如果根视觉对象具有 50% (0.5) 不透明度,并且其中一个子视觉对象的不透明度为 20% (0.2) 不透明度,则该子视觉对象的净不透明度呈现为 10% (0.1) ,但子视觉对象的 Opacity 属性的值仍为 0.2。
3D 透视转换效果
本部分介绍 DirectComposition 用于执行 3D 透视转换效果的坐标空间。 它还介绍了 DirectComposition 支持的 3D 透视转换效果的类型。
注意
在 DirectComposition 中,将 3D 效果应用于可视化树中的多个级别的方式与使用完整的 3D 引擎(如 Microsoft Direct3D)的方式不同。 例如,假设有一个具有单个子视觉对象的父视觉对象。 如果子视觉对象沿 z 方向向前旋转, (绕 y 轴) 90 度,则子视觉对象边缘的边缘将面向查看器,因此,由于位图没有实际深度) ,因此预期视觉对象 (不可见。 如果父视觉对象随后在 y 轴) (向负 z 方向向后旋转 90 度,则子视觉对象可能会完全明显 (,因为转换) 相互否定。 但是,在 DirectComposition 中,情况并非如此。 子视觉对象将不可见,因为它已“平展为”父位图。
DirectComposition 3D 坐标空间
3D 转换效果的 DirectComposition 坐标空间将原点 (0,0,0) 定位在位图面左上角,正 x 轴值向右移动,正 y 轴值向下移动,正 z 轴值从原点向外向观看者。 此图显示了 DirectComposition 3D 坐标空间。
3D 旋转转换效果
3D 旋转转换效果根据位于指定中心点的旋转轴矢量 [x,y,z] 的指定角度以三维方式旋转视觉对象, (x,y,z) 。 角度以度为单位指定。 默认旋转轴矢量为 [0,0,-1],默认中心点 (0,0,0) 。
使用 IDCompositionDevice::CreateRotateTransform3D 方法创建 3D 旋转转换对象。 方法检索可用于设置对象的属性的 IDCompositionRotateTransform3D 接口。
3D 缩放转换效果
3D 缩放转换效果使视觉对象更大或更小。 它以 [x,y,z] 方向缩放视觉对象, (x,y,z) 中心点。 默认中心点是 (0,0,0) 。
使用 IDCompositionDevice::CreateScaleTransform3D 方法创建 3D 缩放转换对象。 方法检索可用于设置对象的属性的 IDCompositionScaleTransform3D 接口。
3D 转换效果
3D 平移转换效果更改视觉对象在 [x,y,z] 方向上的位置。
使用 IDCompositionDevice::CreateTranslateTransform3D 方法创建 3D 转换对象。 方法检索可用于设置对象的属性的 IDCompositionTranslateTransform3D 接口。
3D 矩阵转换效果
使用 IDCompositionMatrixTransform3D 接口可以定义自己的 4-by-4 转换矩阵并将其应用于视觉对象。 如果需要应用通过其他 DirectComposition 3D 转换效果接口不可用的 3D 透视转换效果类型,此接口非常有用。 可以通过填充 D3DMATRIX 结构并将其传递给 IDCompositionMatrixTransform3D::SetMatrix 方法来定义矩阵。 或者,可以使用 IDCompositionMatrixTransform3D::SetMatrixElement 方法设置矩阵的每个元素。
3D 转换效果组
IDCompositionDevice::CreateTransform3DGroup 创建一个 3D 转换效果集合,可将这些效果作为组应用于视觉对象。 数组可以包含任意数量的转换对象,并且可以包括矩阵、旋转、缩放和平移转换。 3D 转换对象的集合生成一个转换,其值为集合中各个转换矩阵的矩阵乘法。
组中各个转换的顺序非常重要。 例如,“先旋转再缩放后平移”与“先平移再旋转后缩放”得到的结果并不一样。 DirectComposition 遵循在转换 3D 组中指定 3D 转换的顺序,与指定 2D 转换的方式相同。 此外,在应用当前视觉对象中的所有 3D 转换后,3D 透视转换会导致可视化树平展。 这样做是为了确保场景看起来尽可能接近 3D。
效果对象
若要将效果应用于视觉对象,首先需要创建并设置表示要在视觉对象上生成的效果类型的效果对象的属性。 然后,需要将效果对象应用于视觉对象的 Effect 属性。
若要创建效果对象,请使用以下 IDCompositionDevice 接口方法之一为所需效果类型创建效果对象。 以下方法创建效果对象:
上述每个方法都会检索可用于设置新创建的效果对象的属性的接口。 使用接口方法根据需要设置属性,以生成所需的视觉效果。
效果对象的大多数属性都可以进行动画处理。 若要对特定属性进行动画处理,请创建动画对象并将其应用于要进行动画处理的属性;否则,请将 属性设置为生成所需效果的静态值。 有关对属性进行动画处理的详细信息,请参阅 动画。
若要将效果对象应用于视觉对象,请调用 IDCompositionVisual::SetEffect 方法。 将效果应用于视觉对象时,该效果将应用于根植于该视觉对象的整个视觉对象子树。 因此,例如,如果将视觉对象的不透明度设置为 50%,则视觉对象子树中所有子视觉对象的不透明度将减少 50%。 可以将相同的效果对象应用于一个或多个视觉对象。 如果在将效果对象应用于视觉对象后对其进行修改,则会重新组合所有视觉对象以反映更改。
通过使用效果组对象,可以同时向视觉对象应用多个效果。 首先调用 IDCompositionDevice::CreateEffectGroup 来创建效果组对象,然后使用对象的 IDCompositionEffectGroup 接口向组添加效果。
相关主题