ShaderEffect Класс

Определение

Предоставляет настраиваемый эффект растрового изображения с использованием объекта PixelShader.

public ref class ShaderEffect abstract : System::Windows::Media::Effects::Effect
public abstract class ShaderEffect : System.Windows.Media.Effects.Effect
type ShaderEffect = class
    inherit Effect
Public MustInherit Class ShaderEffect
Inherits Effect
Наследование

Примеры

В следующем примере кода показано, как наследовать от ShaderEffect класса .

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Reflection;

namespace ShaderEffectDemo
{

    public class ThresholdEffect : ShaderEffect
    {
        private static PixelShader _pixelShader =
            new PixelShader() { UriSource = MakePackUri("ThresholdEffect.fx.ps") };

        public ThresholdEffect()
        {
            PixelShader = _pixelShader;

            UpdateShaderValue(InputProperty);
            UpdateShaderValue(ThresholdProperty);
            UpdateShaderValue(BlankColorProperty);
        }

        // MakePackUri is a utility method for computing a pack uri
        // for the given resource. 
        public static Uri MakePackUri(string relativeFile)
        {
            Assembly a = typeof(ThresholdEffect).Assembly;

            // Extract the short name.
            string assemblyShortName = a.ToString().Split(',')[0];

            string uriString = "pack://application:,,,/" +
                assemblyShortName +
                ";component/" +
                relativeFile;

            return new Uri(uriString);
        }

        ///////////////////////////////////////////////////////////////////////
        #region Input dependency property

        public Brush Input
        {
            get { return (Brush)GetValue(InputProperty); }
            set { SetValue(InputProperty, value); }
        }

        public static readonly DependencyProperty InputProperty =
            ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(ThresholdEffect), 0);

        #endregion

        ///////////////////////////////////////////////////////////////////////
        #region Threshold dependency property

        public double Threshold
        {
            get { return (double)GetValue(ThresholdProperty); }
            set { SetValue(ThresholdProperty, value); }
        }

        public static readonly DependencyProperty ThresholdProperty =
            DependencyProperty.Register("Threshold", typeof(double), typeof(ThresholdEffect),
                    new UIPropertyMetadata(0.5, PixelShaderConstantCallback(0)));

        #endregion

        ///////////////////////////////////////////////////////////////////////
        #region BlankColor dependency property

        public Color BlankColor
        {
            get { return (Color)GetValue(BlankColorProperty); }
            set { SetValue(BlankColorProperty, value); }
        }

        public static readonly DependencyProperty BlankColorProperty =
            DependencyProperty.Register("BlankColor", typeof(Color), typeof(ThresholdEffect),
                    new UIPropertyMetadata(Colors.Transparent, PixelShaderConstantCallback(1)));

        #endregion
    }
}

В следующем примере кода показан шейдер, соответствующий предыдущему ShaderEffect классу.

// Threshold shader 

// Object Declarations

sampler2D implicitInput : register(s0);
float threshold : register(c0);
float4 blankColor : register(c1);

//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(implicitInput, uv);
    float intensity = (color.r + color.g + color.b) / 3;
    
    float4 result;
    if (intensity > threshold)
    {
        result = color;
    }
    else
    {
        result = blankColor;
    }
    
    return result;
}

В следующем коде XAML показано, как использовать пользовательский эффект шейдера.

<Window x:Class="ShaderEffectDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:ShaderEffectDemo"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <local:ThresholdEffect x:Key="thresholdEffect" Threshold="0.25" BlankColor="Orange" />
    </Window.Resources>
    
    <Grid Effect="{StaticResource thresholdEffect}">

    </Grid>
</Window>

Комментарии

Наследуйте ShaderEffect от класса для реализации пользовательского эффекта на основе одного пиксельного шейдера.

Ниже показано, как создать пользовательский эффект.

  1. PixelShader Загрузите из предварительно скомпилированного байт-кода HLSL.

  2. Определите свойства зависимостей, представляющие параметры эффекта и Brushвходные данные на основе поверхности. Используйте одну из RegisterPixelShaderSamplerProperty перегрузок, чтобы связать эти входные данные с регистрами, на которые ссылается байт-код HLSL.

Количество выборок ограничено 4.

При использовании шейдера PS 3.0 применяются следующие ограничения.

  • При назначении шейдера PS 3.0 количество выборок увеличивается до 8. Назначьте шейдер PS 3.0 перед другими шейдерами, чтобы включить регистрацию 8 выборок.

  • Используется полный регистр констант шейдера в 224 для числа с плавающей точкой. Дополнительные сведения см. в разделе ps_3_0.

  • Следующие типы данных поддерживаются только в шейдерах PS 3.0. Исключение возникает, если они используются в более ранних версиях шейдеров.

    • intи типы, которые можно преобразовать в int: uint, bytesbyte, , long, ulong, short, , ushortchar

    • bool

  • Если допустимый шейдер PS 3.0 загружен на компьютер, не поддерживающий аппаратное обеспечение PS 3.0, шейдер игнорируется. Если шейдер недопустим, исключение не создается.

  • Если на компьютере есть несколько карта видео, поведение определяется наименее возможностями видео карта. Например, если на компьютере есть две видеоадаптеры, одна из которых поддерживает PS 3.0, а другая — нет, поведение будет таким же, как если бы компьютер не поддерживал PS 3.0.

  • Если компьютер поддерживает отрисовку PS 3.0 на оборудовании, но назначен недопустимый шейдер PS 3.0, InvalidPixelShaderEncountered возникает событие. Примером недопустимого шейдера PS 3.0 является скомпилированный с флагом ps_3_sw . Класс ShaderEffect принимает только шейдеры PS 3.0, скомпилированные с флагом ps_3_0 , переданным fxc.exe. Дополнительные сведения см. в разделе Effect-Compiler Tool.

Примечание

Шейдеры PS 2.0 запускаются при отрисовке в программном обеспечении. Однако даже если PS 3.0 поддерживается оборудованием системы, шейдеры PS 3.0 не запускаются во время программной отрисовки.

Конструкторы

ShaderEffect()

Инициализирует новый экземпляр класса ShaderEffect.

Поля

PixelShaderProperty

Идентифицирует свойство зависимостей PixelShader.

Свойства

CanFreeze

Возвращает значение, которое указывает, можно ли сделать объект неизменяемым.

(Унаследовано от Freezable)
DdxUvDdyUvRegisterIndex

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

DependencyObjectType

Возвращает объект , DependencyObjectType который заключает в оболочку тип СРЕДЫ CLR данного экземпляра.

(Унаследовано от DependencyObject)
Dispatcher

Возвращает объект Dispatcher, с которым связан этот объект DispatcherObject.

(Унаследовано от DispatcherObject)
EffectMapping

При переопределении в производном классе преобразовывает ввод и координатные системы мыши с помощью эффекта.

(Унаследовано от Effect)
HasAnimatedProperties

Возвращает значение, которое указывает, сопоставлены ли один или несколько объектов AnimationClock любому из свойств зависимостей этого объекта.

(Унаследовано от Animatable)
IsFrozen

Получает значение, указывающее, доступен ли объект для изменения в настоящее время.

(Унаследовано от Freezable)
IsSealed

Получает значение, указывающее, является ли этот экземпляр в данный момент запечатанным (доступным только для чтения).

(Унаследовано от DependencyObject)
PaddingBottom

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

PaddingLeft

Возвращает или задает значение, показывающее, что текстура вывода эффекта больше, чем текстура ввода вдоль левого края.

PaddingRight

Возвращает или задает значение, показывающее, что текстура вывода эффекта больше, чем текстура ввода вдоль правого края.

PaddingTop

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

PixelShader

Получает или задает объект PixelShader для использования применительно к эффекту.

Методы

ApplyAnimationClock(DependencyProperty, AnimationClock)

Применяет AnimationClock к заданному DependencyProperty. Если свойство уже анимировано, используется эстафетное поведение SnapshotAndReplace.

(Унаследовано от Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Применяет AnimationClock к заданному DependencyProperty. Если свойство уже является анимированным, используется указанное поведение HandoffBehavior.

(Унаследовано от Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Применяет анимацию к указанному DependencyProperty. Анимация начинается при отрисовке следующего кадра. Если указанное свойство уже анимировано, используется поведение перемещения SnapshotAndReplace.

(Унаследовано от Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Применяет анимацию к указанному DependencyProperty. Анимация начинается при отрисовке следующего кадра. Если указанное свойство уже является анимированным, используется указанное поведение HandoffBehavior.

(Унаследовано от Animatable)
CheckAccess()

Определяет, имеет ли вызывающий поток доступ к этому DispatcherObject.

(Унаследовано от DispatcherObject)
ClearValue(DependencyProperty)

Очищает локальное значение свойства. Очищаемое свойство задается идентификатором DependencyProperty.

(Унаследовано от DependencyObject)
ClearValue(DependencyPropertyKey)

Очищает локальное значение доступного только для чтения свойства. Очищаемое свойство задается ключом DependencyPropertyKey.

(Унаследовано от DependencyObject)
Clone()

Создает изменяемый клон данного объекта ShaderEffect, делая глубокие копии значений этого объекта. При копировании свойств зависимостей объекта этот метод копирует ссылки на ресурсы и привязки данных (которые могут уже не быть разрешимыми), но не копирует анимации и их текущие значения.

CloneCore(Freezable)

Делает экземпляр клоном (глубокой копией) указанного объекта Freezable, используя базовые (без анимации) значения свойств.

CloneCurrentValue()

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

CloneCurrentValueCore(Freezable)

Делает экземпляр изменяемым клоном (глубокой копией) указанного объекта Freezable с использованием текущих значений свойств.

CoerceValue(DependencyProperty)

Приводит значение указанного свойства зависимостей. Это осуществляется путем вызова какой-либо функции CoerceValueCallback, указанной в метаданных свойства зависимостей, которое существует в вызывающем объекте DependencyObject.

(Унаследовано от DependencyObject)
CreateInstance()

Инициализирует новый экземпляр класса Freezable.

(Унаследовано от Freezable)
CreateInstanceCore()

Создает новый экземпляр производного класса Freezable.

Equals(Object)

Определяет, является ли указанный DependencyObject эквивалентом текущего DependencyObject.

(Унаследовано от DependencyObject)
Freeze()

Делает текущий объект неизменяемым и присваивает его свойству IsFrozen значение true.

(Унаследовано от Freezable)
FreezeCore(Boolean)

Делает данный объект Animatable неизменяемым или определяет, может ли он быть сделан неизменяемым.

(Унаследовано от Animatable)
GetAnimationBaseValue(DependencyProperty)

Возвращает не анимированное значение указанного объекта DependencyProperty.

(Унаследовано от Animatable)
GetAsFrozen()

Создает фиксированную копию объекта Freezable, используя базовые (не анимационные) значения свойств. Так как копия является фиксированной, копируются только ссылки на фиксированные вложенные объекты.

(Унаследовано от Freezable)
GetAsFrozenCore(Freezable)

Делает экземпляр зафиксированной копией указанного Freezable, используя базовые (без анимации) значения свойств.

GetCurrentValueAsFrozen()

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

(Унаследовано от Freezable)
GetCurrentValueAsFrozenCore(Freezable)

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

GetHashCode()

Возвращает хэш-код для данного объекта DependencyObject.

(Унаследовано от DependencyObject)
GetLocalValueEnumerator()

Создает специализированный перечислитель для определения свойств зависимостей, которые локально установили значения для данного DependencyObject.

(Унаследовано от DependencyObject)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
GetValue(DependencyProperty)

Возвращает текущее действующее значение свойства зависимостей в этом экземпляре DependencyObject.

(Унаследовано от DependencyObject)
InvalidateProperty(DependencyProperty)

Повторно вычисляет действующее значение для указанного свойства зависимостей.

(Унаследовано от DependencyObject)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
OnChanged()

Вызывается при изменении текущего объекта Freezable.

(Унаследовано от Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Обеспечивает создание соответствующих указателей контекста для элемента данных типа DependencyObjectType, который был только что задан.

(Унаследовано от Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Этот элемент поддерживает инфраструктуру Windows Presentation Foundation (WPF) и не предназначен для использования непосредственно из кода.

(Унаследовано от Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Переопределяет реализацию DependencyObject для OnPropertyChanged(DependencyPropertyChangedEventArgs), чтобы также вызвать любой обработчик Changed в ответ на изменение свойства зависимостей типа Freezable.

(Унаследовано от Freezable)
PixelShaderConstantCallback(Int32)

Связывает значение свойства зависимостей с регистром константы с плавающей точкой построителя текстуры.

PixelShaderSamplerCallback(Int32)

Связывает значение свойства зависимостей с регистром образца построителя текстуры.

PixelShaderSamplerCallback(Int32, SamplingMode)

Связывает значение свойства зависимостей с регистром образца построителя текстуры и объектом SamplingMode.

ReadLocalValue(DependencyProperty)

Возвращает локальное значение свойства зависимостей, если таковое существует.

(Унаследовано от DependencyObject)
ReadPreamble()

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

(Унаследовано от Freezable)
RegisterPixelShaderSamplerProperty(String, Type, Int32)

Связывает свойство зависимостей с регистром образца построителя текстуры.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Связывает свойство зависимостей с регистром образца построителя текстуры и объектом SamplingMode.

SetCurrentValue(DependencyProperty, Object)

Задает значение свойства зависимостей, не меняя источник значения.

(Унаследовано от DependencyObject)
SetValue(DependencyProperty, Object)

Задает локальное значение свойства зависимостей, указанного идентификатором этого свойства.

(Унаследовано от DependencyObject)
SetValue(DependencyPropertyKey, Object)

Задает локальное значение свойства зависимости только для чтения, определяемое идентификатором DependencyPropertyKey свойства зависимостей.

(Унаследовано от DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Возвращает значение, которое указывает, следует ли процессам сериализации выполнять сериализацию значения для предоставленного свойства зависимостей.

(Унаследовано от DependencyObject)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)
UpdateShaderValue(DependencyProperty)

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

VerifyAccess()

Обеспечивает наличие у вызывающего потока доступ к этому DispatcherObject.

(Унаследовано от DispatcherObject)
WritePostscript()

Вызывает событие Changed для объекта Freezable и вызывает его метод OnChanged(). Классы, производные от Freezable, должны вызывать этот метод в конце любого API, который изменяет члены класса, не сохраненные в виде свойств зависимостей.

(Унаследовано от Freezable)
WritePreamble()

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

(Унаследовано от Freezable)

События

Changed

Происходит, когда изменяется класс Freezable или объект, который входит в его состав.

(Унаследовано от Freezable)

Применяется к

См. также раздел