Поделиться через


Эффекты (DirectComposition)

Примечание

Для приложений на Windows 10 рекомендуется использовать API Windows.UI.Composition вместо DirectComposition. Дополнительные сведения см. в статье Модернизация классического приложения с помощью визуального слоя.

В этом разделе рассматриваются основы эффектов Microsoft DirectComposition и типы эффектов, поддерживаемых DirectComposition.

Этот раздел состоит из следующих подразделов.

Что такое эффект DirectComposition?

Эффект DirectComposition — это операция растрового изображения, которая применяется во время растеризации визуального элемента, чтобы каким-то образом изменить внешний вид визуального элемента.

DirectComposition создает эффект, принимая визуальное поддерево и отрисовывая его в одном растровом рисунке перед применением эффекта. Например, чтобы создать эффект преобразования трехмерной перспективы, DirectComposition создает изображение визуального поддеревого дерева, а затем текстурирует изображение на трехмерной плоскости, которая преобразуется в соответствии с результирующей матрицей эффекта трехмерного преобразования.

DirectComposition поддерживает следующие типы эффектов.

Тип эффекта Описание
Непрозрачность Задает прозрачность всего визуального элемента.
Трехмерные преобразования перспективы Применяет трехмерный (трехмерный) эффект преобразования перспективы к визуальному элементу.

 

Примечание

DirectComposition не выполняет специальную обработку при применении эффектов к трехмерного стереосодержимого. Это означает, что трехмерное содержимое может показаться искаженным при применении к нему эффекта.

 

Непрозрачность

Эффект непрозрачности позволяет задать коэффициент непрозрачности, применяемый ко всему визуальному элементу при отрисовки визуального элемента. Он отличается от альфа-маски тем, что один и тот же коэффициент непрозрачности применяется ко всем пикселям в визуальном элементе. Непрозрачность указывается как значение в диапазоне от 0 (полностью прозрачный) до 1 (полностью непрозрачный).

Коэффициент непрозрачности применяется от родительских к дочерним визуальным элементам, но видимые эффекты вложенных параметров непрозрачности не указываются в значении свойства отдельных дочерних визуальных элементов. Например, если корневой визуальный элемент имеет непрозрачность 50 % (0,5), а один из его дочерних элементов — 20 % (0,2), чистая прозрачность для этого дочернего элемента отображается как 10 % (0,1), но значение свойства Opacity дочернего элемента по-прежнему будет равно 0,2.

Эффекты преобразования трехмерной перспективы

В этом разделе описывается пространство координат, которое DirectComposition использует для выполнения эффектов преобразования трехмерной перспективы. В нем также описываются типы эффектов преобразования трехмерной перспективы, поддерживаемых DirectComposition.

Примечание

В DirectComposition применение трехмерных эффектов к нескольким уровням визуального дерева работает не так же, как при использовании полной трехмерной подсистемы, такой как Microsoft Direct3D. Например, рассмотрим родительский визуальный элемент с одним дочерним визуальным элементом. Если дочерний визуальный элемент поворачивается вперед в направлении Z (вокруг оси Y) на 90 градусов, край дочернего визуального элемента будет обращен к средству просмотра, поэтому мы ожидаем, что визуальный элемент не будет виден (так как растровое изображение не имеет реальной глубины). Если затем родительский визуальный элемент поворачивается назад в направлении отрицательного Z (вокруг оси Y) на 90 градусов, можно ожидать, что дочерний визуальный элемент станет полностью видимым (так как преобразования отрицают друг друга). Однако в DirectComposition это не так. Дочерний визуальный элемент не будет виден, так как он был "плоский" в родительском растровом рисунке.

 

Трехмерное координатное пространство DirectComposition

Координатное пространство DirectComposition для эффектов трехмерного преобразования находит источник (0,0,0) в левом верхнем углу поверхности растрового изображения, при этом положительные значения оси X двигаются справа, положительные значения оси Y движущегося вниз и положительные значения оси Z, исходящие наружу от источника, к средству просмотра. На этом рисунке показано 3D-пространство координат DirectComposition.

3d-координатное пространство directcompostion

Эффект преобразования трехмерного поворота

Трехмерный эффект поворота поворачивает визуальный элемент в трех измерениях на указанный угол относительно вектора оси вращения [x,y,z], расположенного в указанной центральной точке (x,y,z). Угол указывается в градусах. Вектор оси вращения по умолчанию — [0,0,–1], а центральная точка по умолчанию — (0,0,0).

Используйте метод IDCompositionDevice::CreateRotateTransform3D для создания объекта преобразования трехмерного поворота. Метод извлекает интерфейс IDCompositionRotateTransform3D , который можно использовать для задания свойств объекта .

Эффект преобразования трехмерного масштабирования

Эффект преобразования трехмерного масштабирования делает визуальный элемент больше или меньше. Он масштабирует визуальный элемент в направлении [x,y,z] относительно центральной точки (x,y,z). Центральная точка по умолчанию — (0,0,0).

Используйте метод IDCompositionDevice::CreateScaleTransform3D для создания объекта преобразования трехмерного масштабирования. Метод извлекает интерфейс IDCompositionScaleTransform3D , который можно использовать для задания свойств объекта .

Эффект преобразования трехмерного преобразования

Эффект преобразования трехмерного преобразования изменяет положение визуального элемента в направлении [x,y,z].

Используйте метод IDCompositionDevice::CreateTranslateTransform3D для создания объекта преобразования трехмерного преобразования. Метод получает интерфейс IDCompositionTranslateTranslateTransform3D , который можно использовать для задания свойств объекта .

Эффект преобразования трехмерной матрицы

Интерфейс IDCompositionMatrixTransform3D позволяет определить собственную матрицу преобразования "4 на 4" и применить ее к визуальному элементу. Этот интерфейс полезен, если необходимо применить тип эффекта преобразования трехмерной перспективы, который недоступен через другие интерфейсы эффектов 3D-преобразования DirectComposition. Матрица определяется путем заполнения структуры D3DMATRIX и ее передачи в метод IDCompositionMatrixTransform3D::SetMatrix . Кроме того, можно задать каждый элемент матрицы с помощью метода IDCompositionMatrixTransform3D::SetMatrixElement .

Группа эффектов трехмерного преобразования

IDCompositionDevice::CreateTransform3DGroup создает коллекцию эффектов трехмерного преобразования, которые можно применить к визуальному элементу в виде группы. Массив может включать любое количество объектов преобразования, а также матрицу, поворот, масштабирование и преобразование. Коллекция трехмерных объектов преобразования приводит к преобразованию, значением которого является матричное умножение отдельных матриц преобразования в коллекции.

Важен порядок отдельных преобразований в группе. Например, если применяется поворот, затем масштабирование, а затем сдвиг, получается совершенно иной результат, чем если бы сначала был применен сдвиг, затем поворот, а затем масштабирование. DirectComposition учитывает порядок, в котором указываются трехмерные преобразования в трехмерной группе преобразования так же, как и для двухd-преобразований. Кроме того, трехмерные преобразования перспективы приводят к выравниванию визуального дерева после применения всех трехмерных преобразований в текущем визуальном элементе. Это делается для того, чтобы сцена выглядела как можно ближе к трехмерной.

Объекты эффектов

Чтобы применить эффект к визуальному элементу, сначала необходимо создать и задать свойства объекта эффекта, представляющего тип эффекта, который требуется создать в визуальном элементе. Затем необходимо применить объект эффекта к свойству Effect визуального элемента.

Чтобы создать объект эффекта, используйте один из следующих методов интерфейса IDCompositionDevice , чтобы создать объект эффекта для нужного типа эффекта. Следующие методы создают объекты эффектов:

Каждый из предыдущих методов извлекает интерфейс, который можно использовать для задания свойств созданного объекта эффекта. Используйте методы интерфейса, чтобы задать свойства, необходимые для создания нужного визуального эффекта.

Большинство свойств объекта эффекта можно анимировать. Чтобы анимировать определенное свойство, создайте объект анимации и примените его к свойству, которое вы хотите анимировать; В противном случае задайте для свойства статическое значение, которое создает нужный эффект. Дополнительные сведения об анимации свойств см. в разделе Анимация.

Чтобы применить объект эффекта к визуальному элементу, вызовите метод IDCompositionVisual::SetEffect . При применении эффекта к визуальному элементу он применяется ко всему поддереву визуального элемента, которое коренится в этом визуальном элементе. Например, если задать непрозрачность визуального элемента равным 50 процентам, то непрозрачность всех дочерних визуальных элементов в поддереве визуального элемента уменьшится на 50 процентов. Один и тот же объект эффекта можно применить к одному или нескольким визуальным элементам. При изменении свойств объекта эффекта после применения его к визуальным элементам все визуальные элементы будут повторно составлены в соответствии с изменением.

С помощью объекта группы эффектов можно одновременно применить несколько эффектов к визуальному элементу. Сначала вызовите IDCompositionDevice::CreateEffectGroup , чтобы создать объект группы эффектов, а затем добавьте эффекты в группу с помощью интерфейса IDCompositionEffectGroup объекта.

Основные понятия DirectComposition