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