Compartilhar via


ShaderEffect Classe

Definição

Fornece um efeito de 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

Derive da ShaderEffect classe para implementar um efeito personalizado com base em um sombreador de pixel único.

As etapas a seguir mostram como criar um efeito personalizado.

  1. Carregue um PixelShader do código de bytes da HLSL (Linguagem de Sombreamento de Alto Nível) pré-compilado.

  2. Defina propriedades de dependência que representam os parâmetros do efeito e as Brushentradas de superfície baseadas em . Use uma das RegisterPixelShaderSamplerProperty sobrecargas para associar essas entradas a números de registro referenciados no código de bytes 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 exemplos 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 inferiores.

    • int e tipos conversíveis para int: uint, byte, sbyte, long, , ulong, short, ushort, char

    • bool

  • 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 um vídeo cartão, o comportamento será definido pelo vídeo menos capaz cartão. 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_sw sinalizador . A ShaderEffect classe aceita apenas sombreadores PS 3.0 compilados com o ps_3_0 sinalizador passado para fxc.exe. Para obter mais informações, consulte Effect-Compiler Tool.

Observação

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

ShaderEffect()

Inicializa uma nova instância da classe ShaderEffect.

Campos

PixelShaderProperty

Identifica a propriedade de dependência PixelShader.

Propriedades

CanFreeze

Obtém um valor que indica se o objeto pode se tornar não modificável.

(Herdado de Freezable)
DdxUvDdyUvRegisterIndex

Obtém ou define um valor que indica o registro do sombreador a ser usado para as derivativas parciais das coordenadas de textura em relação ao espaço da tela.

DependencyObjectType

Obtém o DependencyObjectType que encapsula o tipo CLR dessa instância.

(Herdado de DependencyObject)
Dispatcher

Obtém o Dispatcher ao qual este DispatcherObject está associado.

(Herdado de DispatcherObject)
EffectMapping

Quando substituído em uma classe derivada, transforma a entrada do mouse e os sistemas de coordenadas por meio do efeito.

(Herdado de Effect)
HasAnimatedProperties

Obtém um valor que indica se um ou mais objetos AnimationClock está associado a qualquer uma das propriedades de dependência do objeto.

(Herdado de Animatable)
IsFrozen

Obtém um valor que indica se o objeto pode ser modificado no momento.

(Herdado de Freezable)
IsSealed

Obtém um valor que indica se essa instância está validada no momento (somente leitura).

(Herdado de DependencyObject)
PaddingBottom

Obtém ou define um valor que indica se 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 se 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 se 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 se 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 a ser usado para o efeito.

Métodos

ApplyAnimationClock(DependencyProperty, AnimationClock)

Aplica um AnimationClock ao DependencyProperty especificado. Se a propriedade já tiver sido animada, o comportamento de entrega de SnapshotAndReplace será usado.

(Herdado de Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Aplica um AnimationClock ao DependencyProperty especificado. Se a propriedade já for animada, o HandoffBehavior especificado será usado.

(Herdado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Aplica uma animação ao DependencyProperty especificado. A animação é iniciada quando o próximo quadro for renderizado. Se a propriedade especificada já tiver sido animada, o comportamento de entrega de SnapshotAndReplace será usado.

(Herdado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Aplica uma animação ao DependencyProperty especificado. A animação é iniciada quando o próximo quadro for renderizado. Se a propriedade especifica já for animada, o HandoffBehavior especificado será usado.

(Herdado de Animatable)
CheckAccess()

Determina se o thread de chamada tem acesso a este DispatcherObject.

(Herdado de DispatcherObject)
ClearValue(DependencyProperty)

Limpa o valor local de uma propriedade. A propriedade a ser limpa é especificada por um identificador DependencyProperty.

(Herdado de DependencyObject)
ClearValue(DependencyPropertyKey)

Limpa o valor local de uma propriedade somente leitura. A propriedade a ser limpa é especificada por um DependencyPropertyKey.

(Herdado de DependencyObject)
Clone()

Cria um clone modificável deste objeto ShaderEffect, fazendo cópias em profundidade dos valores do objeto. Ao copiar as propriedades de dependência desse objeto, esse método copia associações de dados e referências de recurso (que não podem mais resolver), mas não animações ou seus valores atuais.

CloneCore(Freezable)

Faz com que a instância seja um clone (cópia em profundidade) do Freezable especificado usando valores de propriedade base (não animados).

CloneCurrentValue()

Cria um clone modificável desse objeto ShaderEffect, fazendo cópias em profundidade dos valores do objeto atual. Referências de recursos, associações de dados e animações não são copiadas, mas seus valores atuais são.

CloneCurrentValueCore(Freezable)

Torna a instância um clone modificável (cópia em profundidade) do Freezable especificado usando os valores de propriedade atuais.

CoerceValue(DependencyProperty)

Converte o valor da propriedade de dependência especificada. Isso é feito invocando qualquer função CoerceValueCallback especificada nos metadados de propriedade para a propriedade de dependência, visto que ela existe na chamada a DependencyObject.

(Herdado de DependencyObject)
CreateInstance()

Inicializa uma nova instância da classe Freezable.

(Herdado de Freezable)
CreateInstanceCore()

Cria uma nova instância da classe derivada Freezable.

Equals(Object)

Determina se um DependencyObject fornecido é equivalente ao DependencyObject atual.

(Herdado de DependencyObject)
Freeze()

Torna o objeto atual não modificável e define sua propriedade IsFrozen para true.

(Herdado de Freezable)
FreezeCore(Boolean)

Faz com que este objeto Animatable não seja modificável ou determina se ele pode se tornar não modificável.

(Herdado de Animatable)
GetAnimationBaseValue(DependencyProperty)

Retorna o valor não animado do DependencyProperty especificado.

(Herdado de Animatable)
GetAsFrozen()

Cria uma cópia congelada o Freezable usando valores de propriedade base (não animadas). Já que a cópia está congelada, quaisquer subobjetos congelados são copiados por referência.

(Herdado de Freezable)
GetAsFrozenCore(Freezable)

Torna a instância um clone congelado do Freezable especificado usando valores de propriedade base (não animados).

GetCurrentValueAsFrozen()

Cria uma cópia congelada do Freezable usando valores de propriedade atuais. Já que a cópia está congelada, quaisquer subobjetos congelados são copiados por referência.

(Herdado de Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Torna a instância atual um clone congelado do Freezable especificado. Se o objeto tiver propriedades de dependência animadas, seus valores animados atuais serão copiados.

GetHashCode()

Obtém o código hash para esse DependencyObject.

(Herdado de DependencyObject)
GetLocalValueEnumerator()

Cria um enumerador especializado para determinar quais propriedades de dependência têm valores definidos localmente nessa 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 nessa instância de um DependencyObject.

(Herdado de DependencyObject)
InvalidateProperty(DependencyProperty)

Reavalia o valor efetivo para a propriedade de dependência especificada.

(Herdado de DependencyObject)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
OnChanged()

Chamado quando o objeto Freezable atual é modificado.

(Herdado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Garante que os ponteiros de contexto apropriados sejam estabelecidos para um membro de dados DependencyObjectType que foi recém-definido.

(Herdado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Esse membro dá suporte à infraestrutura de Windows Presentation Foundation (WPF) e não se destina a ser usado diretamente do seu código.

(Herdado de Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Substitui a implementação DependencyObject de OnPropertyChanged(DependencyPropertyChangedEventArgs) para também invocar quaisquer manipuladores Changed em resposta à alteração de uma propriedade de dependência do tipo Freezable.

(Herdado de Freezable)
PixelShaderConstantCallback(Int32)

Associa um valor da propriedade de dependência a um registro constante de float de um sombreador de pixel.

PixelShaderSamplerCallback(Int32)

Associa um valor da propriedade de dependência a um registro de amostra de sombreador de pixel.

PixelShaderSamplerCallback(Int32, SamplingMode)

Associa um valor da propriedade de dependência a um registro de amostra de um sombreador de pixel e a um SamplingMode.

ReadLocalValue(DependencyProperty)

Retorna o valor local de uma propriedade de dependência, local, se houver.

(Herdado de DependencyObject)
ReadPreamble()

Garante que o Freezable esteja sendo acessado de um thread válido. Herdeiros do Freezable devem chamar esse método no início de qualquer API que lê membros de dados que não são propriedades de dependência.

(Herdado de Freezable)
RegisterPixelShaderSamplerProperty(String, Type, Int32)

Associa uma propriedade de dependência a um registro de amostra de sombreador.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Associa uma propriedade de dependência um registro de amostra do sombreador e um SamplingMode.

SetCurrentValue(DependencyProperty, Object)

Define o valor da propriedade de dependência sem alterar a origem do valor.

(Herdado de DependencyObject)
SetValue(DependencyProperty, Object)

Define o valor local de uma propriedade de dependência, especificada pelo identificador da propriedade de dependência.

(Herdado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Define o valor de uma propriedade de dependência somente leitura, especificada pelo identificador DependencyPropertyKey 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 ou a amostra de sombreador correspondente à propriedade de dependência especificada deve ser atualizada.

VerifyAccess()

Impõe que o thread de chamada tenha acesso a este DispatcherObject.

(Herdado de DispatcherObject)
WritePostscript()

Aciona o evento Changed para o Freezable e invoca o respectivo método OnChanged(). Classes que derivam de Freezable devem chamar este método no final de qualquer API que modifica os membros de 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 está sendo acessado de um contexto de threading válido. Herdeiros do Freezable 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

Changed

Ocorre quando o Freezable ou um objeto nele contido é modificado.

(Herdado de Freezable)

Aplica-se a

Confira também