ShaderEffect Classe

Definição

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 seguinte exemplo de código mostra como derivar a partir 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 seguinte exemplo de código mostra um shader 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 seguinte XAML mostra como usar o efeito de shader 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>

Observações

Deriva da ShaderEffect classe para implementar um efeito personalizado baseado num único pixel shader.

Os passos seguintes mostram como criar um efeito personalizado.

  1. Carregar a PixelShader a partir do bytecode pré-compilado High Level Shading Language (HLSL).

  2. Defina propriedades de dependência que representem os parâmetros dos efeitos e das Brushentradas de superfície baseadas em . Use uma das RegisterPixelShaderSamplerProperty sobrecargas para associar estas entradas aos números de registos referenciados no bytecode HLSL.

O número de samplers é limitado a 4.

As seguintes restrições aplicam-se ao usar um shader PS 3.0.

  • Quando um shader PS 3.0 é atribuído, o número de samplers aumenta para 8. Atribuir o shader PS 3.0 antes dos outros shaders para permitir o registo de 8 samplers.

  • O limite completo de registo constante do shader de 224 para floats é utilizado. Para mais informações, consulte ps_3_0.

  • Os seguintes tipos de dados são suportados apenas em shaders PS 3.0. É feita uma exceção se estes forem usados em versões de shader inferior.

    • inte tipos convertíveis para int: uint, byte, sbyte, long, ulongshort, ushortchar

    • bool

  • Se um shader PS 3.0 válido for carregado num computador que não tem suporte de hardware para PS 3.0, o shader é ignorado. Se o shader for inválido, não há exceção.

  • Se um computador tiver mais do que uma placa gráfica, o comportamento é definido pela placa gráfica menos capaz. Por exemplo, se o computador tiver duas placas gráficas, uma das quais suporta PS 3.0 e outra não, o comportamento é o mesmo que se o computador não suportar PS 3.0.

  • Se um computador suportar renderização do PS 3.0 em hardware, mas for atribuído um shader PS 3.0 inválido, o InvalidPixelShaderEncountered evento é levantado. Um exemplo de um shader PS 3.0 inválido é um compilado com a ps_3_sw flag. A ShaderEffect classe aceita apenas shaders PS 3.0 compilados com a ps_3_0 flag passada para fxc.exe. Para mais informações, consulte Effect-Compiler Ferramenta.

Note

Os shaders PS 2.0 funcionam ao renderizar em software. No entanto, mesmo que o PS 3.0 seja suportado pelo hardware do sistema, os shaders do PS 3.0 não funcionam durante a renderização por software.

Construtores

Name Description
ShaderEffect()

Inicializa uma nova instância da ShaderEffect classe.

Campos

Name Description
PixelShaderProperty

Identifica a PixelShader propriedade de dependência.

Propriedades

Name 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 registo shader a usar para as derivadas parciais das coordenadas da textura em relação ao espaço do ecrã.

DependencyObjectType

Obtém o DependencyObjectType que envolve o tipo CLR desta instância.

(Herdado de DependencyObject)
Dispatcher

Percebe o Dispatcher que isto DispatcherObject está associado.

(Herdado de DispatcherObject)
EffectMapping

Quando é sobreposto numa classe derivada, transforma a entrada do rato e os sistemas de coordenadas através do efeito.

(Herdado de Effect)
HasAnimatedProperties

Obtém um valor que indica se um ou mais AnimationClock objetos estão associados a alguma das propriedades de dependência deste objeto.

(Herdado de Animatable)
IsFrozen

Recebe um valor que indica se o objeto é atualmente modificável.

(Herdado de Freezable)
IsSealed

Recebe um valor que indica se esta instância está atualmente selada (apenas leitura).

(Herdado de DependencyObject)
PaddingBottom

Recebe ou define um valor indicando que a textura de saída do efeito é maior do que a textura de entrada ao longo da borda inferior.

PaddingLeft

Recebe ou define um valor indicando que a textura de saída do efeito é maior do que a textura de entrada ao longo da borda esquerda.

PaddingRight

Recebe ou define um valor indicando que a textura de saída do efeito é maior do que a textura de entrada ao longo da borda direita.

PaddingTop

Recebe ou define um valor que indica que a textura de saída do efeito é maior do que a textura de entrada ao longo da borda superior.

PixelShader

Obtém ou define o PixelShader para usar no efeito.

Métodos

Name Description
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Aplica-se a AnimationClock um ao especificado DependencyProperty. Se a propriedade já estiver animada, utiliza-se a especificada HandoffBehavior .

(Herdado de Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock)

Aplica-se a AnimationClock um ao especificado DependencyProperty. Se a propriedade já estiver animada, utiliza-se o SnapshotAndReplace comportamento de handoff.

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

Aplica uma animação ao especificado DependencyProperty. A animação é iniciada quando o frame seguinte é renderizado. Se a propriedade especificada já estiver animada, é usada a especificada HandoffBehavior .

(Herdado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Aplica uma animação ao especificado DependencyProperty. A animação é iniciada quando o frame seguinte é renderizado. Se a propriedade especificada já estiver animada, utiliza-se o SnapshotAndReplace comportamento de handoff.

(Herdado de Animatable)
CheckAccess()

Determina se o thread que chama 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 DependencyProperty identificador.

(Herdado de DependencyObject)
ClearValue(DependencyPropertyKey)

Limpa o valor local de uma propriedade de apenas leitura. O imóvel a ser limpo é especificado por um DependencyPropertyKey.

(Herdado de DependencyObject)
Clone()

Cria um clone modificável deste ShaderEffect objeto, fazendo cópias profundas dos valores desse objeto. Ao copiar as propriedades de dependência deste objeto, este método copia referências de recursos e ligações de dados (que podem já não se resolver), mas não as animações nem os seus valores atuais.

CloneCore(Freezable)

Torna a instância um clone (cópia profunda) dos valores especificados Freezable usando valores base (não animados).

CloneCurrentValue()

Cria um clone modificável deste ShaderEffect objeto, fazendo cópias profundas dos valores atuais desse objeto. Referências de recursos, ligações de dados e animações não são copiadas, mas os seus valores atuais são copiados.

CloneCurrentValueCore(Freezable)

Torna a instância um clone modificável (cópia profunda) do especificado Freezable usando valores atuais de propriedades.

CoerceValue(DependencyProperty)

Coage o valor da propriedade de dependência especificada. Isto é conseguido invocando qualquer CoerceValueCallback função especificada nos metadados da propriedade para a propriedade de dependência tal como existe na chamada DependencyObject.

(Herdado de DependencyObject)
CreateInstance()

Inicializa uma nova instância da Freezable classe.

(Herdado de Freezable)
CreateInstanceCore()

Cria uma nova instância da Freezable classe derivada.

Equals(Object)

Determina se um fornecido DependencyObject é equivalente à corrente DependencyObject.

(Herdado de DependencyObject)
Freeze()

Torna o objeto atual immodificável e define a sua IsFrozen propriedade como true.

(Herdado de Freezable)
FreezeCore(Boolean)

Torna este Animatable objeto immodificável ou determina se pode ser tornado inmodificável.

(Herdado de Animatable)
GetAnimationBaseValue(DependencyProperty)

Devolve o valor não animado do especificado DependencyProperty.

(Herdado de Animatable)
GetAsFrozen()

Cria uma cópia congelada do Freezable, usando valores base (não animados) da propriedade. Como 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 especificado Freezable usando valores base (não animados).

GetCurrentValueAsFrozen()

Cria uma cópia congelada do Freezable usando os valores atuais das propriedades. Como 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 especificado Freezable. Se o objeto tiver propriedades de dependência animadas, os seus valores animados atuais são copiados.

GetHashCode()

Obtém um código de hash para isto DependencyObject.

(Herdado de DependencyObject)
GetLocalValueEnumerator()

Cria um enumerador especializado para determinar quais as propriedades de dependência que têm valores localmente definidos neste DependencyObject.

(Herdado de DependencyObject)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
GetValue(DependencyProperty)

Devolve 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 atual Object.

(Herdado de Object)
OnChanged()

Chamada quando o objeto atual Freezable é modificado.

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

Este membro suporta a infraestrutura Windows Presentation Foundation (WPF) e não foi concebido para ser usado diretamente a partir do seu código.

(Herdado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Assegura que os apontadores de contexto apropriados são estabelecidos para um DependencyObjectType membro de dados que acabou de ser definido.

(Herdado de Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

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

(Herdado de Freezable)
PixelShaderConstantCallback(Int32)

Associa um valor de propriedade de dependência ao registo de constante flutuante do pixel shader.

PixelShaderSamplerCallback(Int32, SamplingMode)

Associa um valor de propriedade de dependência ao registo sampler de um pixel shader e a um SamplingMode.

PixelShaderSamplerCallback(Int32)

Associa um valor de propriedade de dependência ao registo sampler de um shader de pixel.

ReadLocalValue(DependencyProperty)

Devolve o valor local de uma propriedade de dependência, se esta existir.

(Herdado de DependencyObject)
ReadPreamble()

Garante que está a ser acedido Freezable a partir de um thread válido. Os herdeiros de Freezable devem chamar este método no início de qualquer API que leia 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 registo sampler de shaders e a um SamplingMode.

RegisterPixelShaderSamplerProperty(String, Type, Int32)

Associa uma propriedade de dependência a um registo sampler shader.

SetCurrentValue(DependencyProperty, Object)

Define o valor de uma propriedade de dependência sem alterar a sua fonte de valor.

(Herdado de DependencyObject)
SetValue(DependencyProperty, Object)

Define o valor local de uma propriedade de dependência, especificado pelo seu identificador de propriedade de dependência.

(Herdado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Define o valor local de uma propriedade de dependência somente de leitura, especificado pelo DependencyPropertyKey identificador da propriedade de dependência.

(Herdado de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Devolve um valor que indica se os processos de serialização devem serializar o valor da propriedade de dependência fornecida.

(Herdado de DependencyObject)
ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
UpdateShaderValue(DependencyProperty)

Notifica o efeito de que a constante do shader ou o sampler correspondente à propriedade de dependência especificada deve ser atualizado.

VerifyAccess()

Faz cumprir que o thread que chama tem acesso a este DispatcherObject.

(Herdado de DispatcherObject)
WritePostscript()

Eleva o Changed evento para o Freezable e invoca o seu OnChanged() método. As classes que derivam de Freezable devem chamar este método no final de qualquer API que modifique membros de classe que não estejam armazenados como propriedades de dependência.

(Herdado de Freezable)
WritePreamble()

Verifica se o Freezable não está congelado e que está a ser acedido a partir de um contexto de threading válido. Freezable os herdeiros devem chamar este método no início de qualquer API que escreva para membros de dados que não sejam propriedades de dependência.

(Herdado de Freezable)

evento

Name Description
Changed

Ocorre quando o Freezable ou um objeto que contém é modificado.

(Herdado de Freezable)

Aplica-se a

Ver também