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 класса для реализации пользовательского эффекта на основе одного шейдера пикселей.
Ниже показано, как создать пользовательский эффект.
- PixelShader Загрузите байт-код из предварительно скомпилированного языка заливки высокого уровня (HLSL).
- Определите свойства зависимостей, представляющие параметры эффекта и Brushвходные данные на основе поверхности. Используйте одну из RegisterPixelShaderSamplerProperty перегрузок, чтобы связать эти входные данные с регистрируемыми номерами, на которые ссылаются в байт-коде HLSL.
Количество выборок ограничено 4.
При использовании шейдера PS 3.0 применяются следующие ограничения.
При назначении шейдера PS 3.0 число выборок увеличивается до 8. Назначьте шейдер PS 3.0 перед другими шейдерами, чтобы включить регистрацию 8 примеров.
Используется полный предел регистра констант шейдера 224 для с плавающей запятой. Дополнительные сведения см. в ps_3_0.
Следующие типы данных поддерживаются только в шейдерах PS 3.0. Исключение возникает, если они используются в более низких версиях шейдера:
-
intи типы, преобразованные в : , ,intuintbytesbytelongulongshortushortchar 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.
Note
Шейдеры 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, HandoffBehavior) |
Применяется к указанному объекту AnimationClockDependencyProperty. Если свойство уже анимировано, используется указанный HandoffBehavior параметр. (Унаследовано от Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
Применяется к указанному объекту AnimationClockDependencyProperty. Если свойство уже анимировано, SnapshotAndReplace используется поведение передачи. (Унаследовано от Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Применяет анимацию к указанному DependencyProperty. Анимация запускается при отрисовки следующего кадра. Если указанное свойство уже анимировано, используется указанный HandoffBehavior параметр. (Унаследовано от Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
Применяет анимацию к указанному DependencyProperty. Анимация запускается при отрисовки следующего кадра. Если указанное свойство уже анимировано, SnapshotAndReplace используется поведение передачи. (Унаследовано от 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 |
| 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, DependencyProperty) |
Этот член поддерживает инфраструктуру Windows Presentation Foundation (WPF) и не предназначен для использования непосредственно из кода. (Унаследовано от Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Убедитесь, что для элемента данных, который только что был установлен, установлены DependencyObjectType соответствующие указатели контекста. (Унаследовано от Freezable) |
| OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Переопределяет DependencyObject реализацию OnPropertyChanged(DependencyPropertyChangedEventArgs) для вызова всех Changed обработчиков в ответ на изменение свойства зависимостей типа Freezable. (Унаследовано от Freezable) |
| PixelShaderConstantCallback(Int32) |
Связывает значение свойства зависимостей с регистром с плавающей запятой шейдера пикселей. |
| PixelShaderSamplerCallback(Int32, SamplingMode) |
Связывает значение свойства зависимостей с регистром примера шейдера пикселей и регистром SamplingMode. |
| PixelShaderSamplerCallback(Int32) |
Связывает значение свойства зависимостей с регистром образца шейдера пикселей. |
| ReadLocalValue(DependencyProperty) |
Возвращает локальное значение свойства зависимостей, если оно существует. (Унаследовано от DependencyObject) |
| ReadPreamble() |
Гарантирует, что Freezable доступ к ней осуществляется из допустимого потока. Наследующие метод Freezable должны вызывать этот метод в начале любого API, который считывает элементы данных, которые не являются свойствами зависимостей. (Унаследовано от Freezable) |
| RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode) |
Связывает свойство зависимостей с регистром образца шейдера и шейдером SamplingMode. |
| RegisterPixelShaderSamplerProperty(String, Type, Int32) |
Связывает свойство зависимостей с регистром образца шейдера. |
| 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) |