ShaderEffect Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Fornece um efeito bitmap personalizado usando um 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
- Herança
Exemplos
O exemplo de código a seguir mostra como derivar da ShaderEffect classe.
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
}
}
O exemplo de código a seguir mostra um sombreador que corresponde à classe anterior 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;
}
O XAML a seguir mostra como usar o efeito de sombreador personalizado.
<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>
Comentários
Deriva da ShaderEffect classe para implementar um efeito personalizado com base em um único sombreador de pixel.
As etapas a seguir mostram como criar um efeito personalizado.
Carregue um PixelShader código de byte HLSL (Linguagem de Sombreamento de Alto Nível) pré-compilado.
Defina propriedades de dependência que representam os parâmetros do efeito e as Brushentradas de superfície baseadas. Use uma das RegisterPixelShaderSamplerProperty sobrecargas para associar essas entradas a números de registro referenciados no código de byte HLSL.
O número de amostradores é limitado a 4.
As restrições a seguir se aplicam ao usar um sombreador PS 3.0.
Quando um sombreador PS 3.0 é atribuído, o número de amostradores aumenta para 8. Atribua o sombreador PS 3.0 antes de outros sombreadores para habilitar o registro de 8 samplers.
O limite de registro de constante de sombreador completo de 224 para floats é usado. Para obter mais informações, consulte ps_3_0.
Os tipos de dados a seguir têm suporte apenas em sombreadores PS 3.0. Uma exceção será gerada se elas forem usadas em versões de sombreador inferior.
inte tipos conversíveis paraint:uint, ,byte,sbyte,long,ulong, ,short, ,ushortcharbool
Se um sombreador PS 3.0 válido for carregado em um computador que não tenha suporte de hardware para PS 3.0, o sombreador será ignorado. Se o sombreador for inválido, nenhuma exceção será gerada.
Se um computador tiver mais de uma placa de vídeo, o comportamento será definido pela placa de vídeo menos capaz. Por exemplo, se o computador tiver duas placas de vídeo, uma das quais dá suporte ao PS 3.0 e outra não, o comportamento será o mesmo que se o computador não der suporte ao PS 3.0.
Se um computador der suporte à renderização do PS 3.0 em hardware, mas um sombreador PS 3.0 inválido for atribuído, o InvalidPixelShaderEncountered evento será gerado. Um exemplo de um sombreador PS 3.0 inválido é um compilado com o
ps_3_swsinalizador. A ShaderEffect classe aceita apenas sombreadores PS 3.0 compilados com ops_3_0sinalizador passado para fxc.exe. Para obter mais informações, consulte Effect-Compiler Tool.
Note
Os sombreadores PS 2.0 são executados durante a renderização no software. No entanto, mesmo que o PS 3.0 seja compatível com o hardware do sistema, os sombreadores PS 3.0 não são executados durante a renderização de software.
Construtores
| Nome | Description |
|---|---|
| ShaderEffect() |
Inicializa uma nova instância da classe ShaderEffect. |
Campos
| Nome | Description |
|---|---|
| PixelShaderProperty |
Identifica a PixelShader propriedade de dependência. |
Propriedades
| Nome | Description |
|---|---|
| CanFreeze |
Obtém um valor que indica se o objeto pode ser tornado inmodificável. (Herdado de Freezable) |
| DdxUvDdyUvRegisterIndex |
Obtém ou define um valor que indica o registro de sombreador a ser usado para os derivados parciais das coordenadas de textura em relação ao espaço de tela. |
| DependencyObjectType |
Obtém o DependencyObjectType que encapsula o tipo CLR dessa instância. (Herdado de DependencyObject) |
| Dispatcher |
Obtém o Dispatcher que DispatcherObject está associado. (Herdado de DispatcherObject) |
| EffectMapping |
Quando substituído em uma classe derivada, transforma sistemas de entrada e coordenadas do mouse por meio do efeito. (Herdado de Effect) |
| HasAnimatedProperties |
Obtém um valor que indica se um ou mais AnimationClock objetos estão associados a qualquer uma das propriedades de dependência desse objeto. (Herdado de Animatable) |
| IsFrozen |
Obtém um valor que indica se o objeto é modificável no momento. (Herdado de Freezable) |
| IsSealed |
Obtém um valor que indica se essa instância está lacrada no momento (somente leitura). (Herdado de DependencyObject) |
| PaddingBottom |
Obtém ou define um valor que indica que a textura de saída do efeito é maior que sua textura de entrada ao longo da borda inferior. |
| PaddingLeft |
Obtém ou define um valor que indica que a textura de saída do efeito é maior que sua textura de entrada ao longo da borda esquerda. |
| PaddingRight |
Obtém ou define um valor que indica que a textura de saída do efeito é maior que sua textura de entrada ao longo da borda direita. |
| PaddingTop |
Obtém ou define um valor que indica que a textura de saída do efeito é maior que sua textura de entrada ao longo da borda superior. |
| PixelShader |
Obtém ou define o PixelShader que usar para o efeito. |
Métodos
| Nome | Description |
|---|---|
| ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
Aplica-se a AnimationClockum DependencyProperty . Se a propriedade já estiver animada, a especificada HandoffBehavior será usada. (Herdado de Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
Aplica-se a AnimationClockum DependencyProperty . Se a propriedade já estiver animada, o SnapshotAndReplace comportamento de entrega será usado. (Herdado de Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Aplica uma animação ao especificado DependencyProperty. A animação é iniciada quando o próximo quadro é renderizado. Se a propriedade especificada já estiver animada, a especificada HandoffBehavior será usada. (Herdado de Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
Aplica uma animação ao especificado DependencyProperty. A animação é iniciada quando o próximo quadro é renderizado. Se a propriedade especificada já estiver animada, o SnapshotAndReplace comportamento de entrega será usado. (Herdado de Animatable) |
| CheckAccess() |
Determina se o thread de chamada tem acesso a isso DispatcherObject. (Herdado de DispatcherObject) |
| ClearValue(DependencyProperty) |
Limpa o valor local de uma propriedade. A propriedade a ser desmarcada é especificada por um DependencyProperty identificador. (Herdado de DependencyObject) |
| ClearValue(DependencyPropertyKey) |
Limpa o valor local de uma propriedade somente leitura. A propriedade a ser desmarcada é especificada por um DependencyPropertyKey. (Herdado de DependencyObject) |
| Clone() |
Cria um clone modificável desse ShaderEffect objeto, fazendo cópias profundas dos valores desse objeto. Ao copiar as propriedades de dependência desse objeto, esse método copia referências de recurso e associações de dados (que podem não ser mais resolvidas), mas não animações ou seus valores atuais. |
| CloneCore(Freezable) |
Torna a instância um clone (cópia profunda) dos valores de propriedade base (não animados) especificados Freezable . |
| CloneCurrentValue() |
Cria um clone modificável desse ShaderEffect objeto, fazendo cópias profundas dos valores atuais desse objeto. Referências de recurso, associações de dados e animações não são copiadas, mas seus valores atuais são copiados. |
| CloneCurrentValueCore(Freezable) |
Torna a instância um clone modificável (cópia profunda) do especificado Freezable usando valores de propriedade atuais. |
| CoerceValue(DependencyProperty) |
Coagi o valor da propriedade de dependência especificada. Isso é feito invocando qualquer CoerceValueCallback função especificada nos metadados de propriedade para a propriedade de dependência como ela existe na chamada DependencyObject. (Herdado de DependencyObject) |
| CreateInstance() |
Inicializa uma nova instância da classe Freezable. (Herdado de Freezable) |
| CreateInstanceCore() |
Cria uma nova instância da Freezable classe derivada. |
| Equals(Object) |
Determina se um fornecido DependencyObject é equivalente ao atual DependencyObject. (Herdado de DependencyObject) |
| Freeze() |
Torna o objeto atual inmodificável e define sua IsFrozen propriedade como |
| FreezeCore(Boolean) |
Torna esse Animatable objeto inmodificável ou determina se ele pode ser tornado inmodificável. (Herdado de Animatable) |
| GetAnimationBaseValue(DependencyProperty) |
Retorna o valor não animado do especificado DependencyProperty. (Herdado de Animatable) |
| GetAsFrozen() |
Cria uma cópia congelada dos valores de Freezablepropriedade base (não animados). Como a cópia está congelada, todos os sub-objetos congelados são copiados por referência. (Herdado de Freezable) |
| GetAsFrozenCore(Freezable) |
Torna a instância um clone congelado dos valores de propriedade base (não animados) especificados Freezable . |
| GetCurrentValueAsFrozen() |
Cria uma cópia congelada do Freezable uso de valores de propriedade atuais. Como a cópia está congelada, todos os sub-objetos congelados são copiados por referência. (Herdado de Freezable) |
| GetCurrentValueAsFrozenCore(Freezable) |
Torna a instância atual um clone congelado do especificado Freezable. Se o objeto tiver propriedades de dependência animadas, seus valores animados atuais serão copiados. |
| GetHashCode() |
Obtém um código hash para isso DependencyObject. (Herdado de DependencyObject) |
| GetLocalValueEnumerator() |
Cria um enumerador especializado para determinar quais propriedades de dependência têm valores definidos localmente.DependencyObject (Herdado de DependencyObject) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| GetValue(DependencyProperty) |
Retorna o valor efetivo atual de uma propriedade de dependência nesta instância de um DependencyObject. (Herdado de DependencyObject) |
| InvalidateProperty(DependencyProperty) |
Reavalia o valor efetivo da propriedade de dependência especificada. (Herdado de DependencyObject) |
| MemberwiseClone() |
Cria uma cópia superficial do Objectatual. (Herdado de Object) |
| OnChanged() |
Chamado quando o objeto atual Freezable é modificado. (Herdado de Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty) |
Esse membro dá suporte à infraestrutura Windows Presentation Foundation (WPF) e não se destina a ser usado diretamente do seu código. (Herdado de Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Garante que os ponteiros de contexto apropriados sejam estabelecidos para um DependencyObjectType membro de dados que acabou de ser definido. (Herdado de Freezable) |
| OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Substitui a DependencyObject implementação de OnPropertyChanged(DependencyPropertyChangedEventArgs) invocar também os Changed manipuladores em resposta a uma propriedade de dependência de alteração do tipo Freezable. (Herdado de Freezable) |
| PixelShaderConstantCallback(Int32) |
Associa um valor de propriedade de dependência ao registro de constante flutuante de um sombreador de pixel. |
| PixelShaderSamplerCallback(Int32, SamplingMode) |
Associa um valor de propriedade de dependência a um registro de sombreador de pixel e um SamplingMode. |
| PixelShaderSamplerCallback(Int32) |
Associa um valor de propriedade de dependência ao registro do sampler de um sombreador de pixel. |
| ReadLocalValue(DependencyProperty) |
Retorna o valor local de uma propriedade de dependência, se ela existir. (Herdado de DependencyObject) |
| ReadPreamble() |
Garante que ele Freezable esteja sendo acessado de um thread válido. Os herdadores devem Freezable chamar esse método no início de qualquer API que leia os membros de dados que não são propriedades de dependência. (Herdado de Freezable) |
| RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode) |
Associa uma propriedade de dependência a um registro de exemplo de sombreador e um SamplingMode. |
| RegisterPixelShaderSamplerProperty(String, Type, Int32) |
Associa uma propriedade de dependência a um registro de amostrador de sombreador. |
| SetCurrentValue(DependencyProperty, Object) |
Define o valor de uma propriedade de dependência sem alterar sua fonte de valor. (Herdado de DependencyObject) |
| SetValue(DependencyProperty, Object) |
Define o valor local de uma propriedade de dependência, especificada por seu identificador de propriedade de dependência. (Herdado de DependencyObject) |
| SetValue(DependencyPropertyKey, Object) |
Define o valor local de uma propriedade de dependência somente leitura, especificada pelo DependencyPropertyKey identificador da propriedade de dependência. (Herdado de DependencyObject) |
| ShouldSerializeProperty(DependencyProperty) |
Retorna um valor que indica se os processos de serialização devem serializar o valor da propriedade de dependência fornecida. (Herdado de DependencyObject) |
| ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
| UpdateShaderValue(DependencyProperty) |
Notifica o efeito de que a constante de sombreador ou o sampler correspondente à propriedade de dependência especificada deve ser atualizado. |
| VerifyAccess() |
Impõe que o thread de chamada tenha acesso a isso DispatcherObject. (Herdado de DispatcherObject) |
| WritePostscript() |
Aciona o Changed evento para o Freezable método e invoca seu OnChanged() método. Classes das quais derivam Freezable devem chamar esse método no final de qualquer API que modifique os membros da classe que não são armazenados como propriedades de dependência. (Herdado de Freezable) |
| WritePreamble() |
Verifica se o Freezable não está congelado e se ele está sendo acessado de um contexto de threading válido. Freezable os herdadores devem chamar esse método no início de qualquer API que grava em membros de dados que não são propriedades de dependência. (Herdado de Freezable) |
Eventos
| Nome | Description |
|---|---|
| Changed |
Ocorre quando o objeto ou um Freezable objeto que ele contém é modificado. (Herdado de Freezable) |