ShaderEffect Clase

Definición

Proporciona un efecto de mapa de bits personalizado mediante un PixelShader.Provides a custom bitmap effect by using a 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
Herencia

Ejemplos

En el ejemplo de código siguiente se muestra cómo derivar de la clase ShaderEffect.The following code example shows how to derive from the ShaderEffect class.

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
    }
}

En el ejemplo de código siguiente se muestra un sombreador que corresponde a la clase de ShaderEffect anterior.The following code example shows a shader that corresponds to the previous ShaderEffect class.

// 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;
}

En el código XAML siguiente se muestra cómo utilizar el efecto del sombreador personalizado.The following XAML shows how to use the custom shader effect.

<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>

Comentarios

Derive de la clase ShaderEffect para implementar un efecto personalizado basado en un sombreador de píxeles único.Derive from the ShaderEffect class to implement a custom effect based on a single pixel shader.

En los pasos siguientes se muestra cómo crear un efecto personalizado.The following steps show how to create a custom effect.

  1. Cargue un PixelShader del código de bytes de lenguaje de sombreado de alto nivel (HLSL) precompilado.Load a PixelShader from precompiled High Level Shading Language (HLSL) bytecode.

  2. Defina las propiedades de dependencia que representan los parámetros del efecto y las entradas de la superficie basadas en Brush.Define dependency properties that represent the parameters of the effect and the Brush-based surface inputs. Use una de las sobrecargas de RegisterPixelShaderSamplerProperty para asociar estas entradas a los números de registro a los que se hace referencia en el código de bytes HLSL.Use one of the RegisterPixelShaderSamplerProperty overloads to associate these inputs with register numbers that are referenced in the HLSL bytecode.

El número de muestras está limitado a 4.The number of samplers is limited to 4.

Cuando se usa un sombreador de PS 3,0, se aplican las siguientes restricciones.The following restrictions apply when using a PS 3.0 shader.

  • Cuando se asigna un sombreador de PS 3,0, el número de muestras aumenta a 8.When a PS 3.0 shader is assigned, the number of samplers increases to 8. Asigne el sombreador de PS 3,0 antes que otros sombreadores para habilitar el registro de 8 muestreadores.Assign the PS 3.0 shader before other shaders to enable registering 8 samplers.

  • Se usa el límite de registro constante del sombreador completo de 224 para los flotantes.The full shader constant register limit of 224 for floats is used. Para obtener más información, vea ps_3_0.For more information, see ps_3_0.

  • Los siguientes tipos de datos solo se admiten en los sombreadores de PS 3,0.The following data types are supported in PS 3.0 shaders only. Se produce una excepción si se usan en versiones de sombreador inferiores.An exception is thrown if these are used in lower shader versions.

    • int y tipos que se pueden convertir en int: uint, byte, sbyte, long, ulong, short, ushort``charint and types convertible to int: uint, byte, sbyte, long, ulong, short, ushort, char

    • bool

  • Si se carga un sombreador de PS 3,0 válido en un equipo que no tiene compatibilidad de hardware con PS 3,0, se omite el sombreador.If a valid PS 3.0 shader is loaded on a computer that does not have hardware support for PS 3.0, the shader is ignored. Si el sombreador no es válido, no se produce ninguna excepción.If the shader is invalid, no exception is thrown.

  • Si un equipo tiene más de una tarjeta de vídeo, el comportamiento se define mediante la tarjeta de vídeo menos compatible.If a computer has more than one video card, the behavior is defined by the least capable video card. Por ejemplo, si el equipo tiene dos tarjetas de vídeo, una de las cuales admite PS 3,0 y otra no, el comportamiento es el mismo que si el equipo no es compatible con PS 3,0.For example, if the computer has two video cards, one of which supports PS 3.0 and one of which does not, the behavior is the same as if the computer does not support PS 3.0.

  • Si un equipo admite la representación de PS 3,0 en hardware, pero se asigna un sombreador PS 3,0 no válido, se genera el evento InvalidPixelShaderEncountered.If a computer supports rendering PS 3.0 in hardware, but an invalid PS 3.0 shader is assigned, the InvalidPixelShaderEncountered event is raised. Un ejemplo de un sombreador de PS 3,0 no válido es uno compilado con la marca ps_3_sw.An example of an invalid PS 3.0 shader is one compiled with the ps_3_sw flag. La clase ShaderEffect solo acepta los sombreadores de PS 3,0 que se compilan con la marca de ps_3_0 pasada a FXC. exe.The ShaderEffect class accepts only PS 3.0 shaders that are compiled with the ps_3_0 flag passed to fxc.exe. Para obtener más información, vea herramienta de compilador de efectos.For more information, see Effect-Compiler Tool.

Nota

Los sombreadores de PS 2,0 se ejecutan cuando se representan en el software.PS 2.0 shaders run when rendering in software. Sin embargo, incluso si PS 3,0 es compatible con el hardware del sistema, los sombreadores de PS 3,0 no se ejecutan durante la representación de software.However, even if PS 3.0 is supported by the system's hardware, PS 3.0 shaders do not run during software rendering.

Constructores

ShaderEffect()

Inicializa una nueva instancia de la clase ShaderEffect.Initializes a new instance of the ShaderEffect class.

Campos

PixelShaderProperty

Identifica la propiedad de dependencia PixelShader.Identifies the PixelShader dependency property.

Propiedades

CanFreeze

Obtiene un valor que indica si el objeto se puede convertir en no modificable.Gets a value that indicates whether the object can be made unmodifiable.

(Heredado de Freezable)
DdxUvDdyUvRegisterIndex

Obtiene o establece un valor que indica el registro de sombreador que se va a usar para los derivados parciales de las coordenadas de textura con respecto al espacio de pantalla.Gets or sets a value that indicates the shader register to use for the partial derivatives of the texture coordinates with respect to screen space.

DependencyObjectType

Obtiene el objeto DependencyObjectType que ajusta el tipo CLRCLR de esta instancia.Gets the DependencyObjectType that wraps the CLRCLR type of this instance.

(Heredado de DependencyObject)
Dispatcher

Obtiene el objeto Dispatcher al que está asociado DispatcherObject.Gets the Dispatcher this DispatcherObject is associated with.

(Heredado de DispatcherObject)
EffectMapping

Cuando se invalida en una clase derivada, transforma la entrada del mouse y los sistemas de coordenadas a través del efecto.When overridden in a derived class, transforms mouse input and coordinate systems through the effect.

(Heredado de Effect)
HasAnimatedProperties

Obtiene un valor que indica si uno o más objetos AnimationClock se asocian a cualquiera de las propiedades de dependencia de este objeto.Gets a value that indicates whether one or more AnimationClock objects is associated with any of this object's dependency properties.

(Heredado de Animatable)
IsFrozen

Obtiene un valor que indica si el objeto se puede modificar actualmente.Gets a value that indicates whether the object is currently modifiable.

(Heredado de Freezable)
IsSealed

Obtiene un valor que indica si esta instancia está actualmente sellada (es de solo lectura).Gets a value that indicates whether this instance is currently sealed (read-only).

(Heredado de DependencyObject)
PaddingBottom

Obtiene o establece un valor que indica que la textura de salida del efecto es mayor que su textura de entrada a lo largo del borde inferior.Gets or sets a value indicating that the effect's output texture is larger than its input texture along the bottom edge.

PaddingLeft

Obtiene o establece un valor que indica que la textura de salida del efecto es mayor que su textura de entrada a lo largo del borde izquierdo.Gets or sets a value indicating that the effect's output texture is larger than its input texture along the left edge.

PaddingRight

Obtiene o establece un valor que indica que la textura de salida del efecto es mayor que su textura de entrada a lo largo del borde derecho.Gets or sets a value indicating that the effect's output texture is larger than its input texture along the right edge.

PaddingTop

Obtiene o establece un valor que indica que la textura de salida del efecto es mayor que su textura de entrada a lo largo del borde superior.Gets or sets a value indicating that the effect's output texture is larger than its input texture along the top edge.

PixelShader

Obtiene o establece el objeto PixelShader que se usará para el efecto.Gets or sets the PixelShader to use for the effect.

Métodos

ApplyAnimationClock(DependencyProperty, AnimationClock)

Se aplica AnimationClock al valor de DependencyProperty especificado.Applies an AnimationClock to the specified DependencyProperty. Si la propiedad ya está animada, se usa el comportamiento de entrega SnapshotAndReplace.If the property is already animated, the SnapshotAndReplace handoff behavior is used.

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

Se aplica AnimationClock al valor de DependencyProperty especificado.Applies an AnimationClock to the specified DependencyProperty. Si la propiedad ya está animada, se usa el objeto HandoffBehavior especificado.If the property is already animated, the specified HandoffBehavior is used.

(Heredado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Aplica una animación a la DependencyProperty especificada.Applies an animation to the specified DependencyProperty. La animación se inicia al representar el siguiente fotograma.The animation is started when the next frame is rendered. Si la propiedad especificada ya está animada, se usa el comportamiento de entrega SnapshotAndReplace.If the specified property is already animated, the SnapshotAndReplace handoff behavior is used.

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

Aplica una animación a la DependencyProperty especificada.Applies an animation to the specified DependencyProperty. La animación se inicia al representar el siguiente fotograma.The animation is started when the next frame is rendered. Si la propiedad especificada ya está animada, se usa el objeto HandoffBehavior especificado.If the specified property is already animated, the specified HandoffBehavior is used.

(Heredado de Animatable)
CheckAccess()

Determina si el subproceso de la llamada tiene acceso a DispatcherObject.Determines whether the calling thread has access to this DispatcherObject.

(Heredado de DispatcherObject)
ClearValue(DependencyProperty)

Borra el valor local de una propiedad.Clears the local value of a property. La propiedad que se va a borrar se especifica mediante un identificador DependencyProperty.The property to be cleared is specified by a DependencyProperty identifier.

(Heredado de DependencyObject)
ClearValue(DependencyPropertyKey)

Borra el valor local de una propiedad de solo lectura.Clears the local value of a read-only property. La propiedad que se va a borrar se especifica mediante un DependencyPropertyKey.The property to be cleared is specified by a DependencyPropertyKey.

(Heredado de DependencyObject)
Clone()

Crea un clon modificable de este objeto ShaderEffect y hace copias en profundidad de sus valores.Creates a modifiable clone of this ShaderEffect object, making deep copies of this object's values. Cuando se copian las propiedades de dependencia de este objeto, este método copia las referencias de recursos y los enlaces de datos (que podrían no resolverse), pero no copia las animaciones ni sus valores actuales.When copying this object's dependency properties, this method copies resource references and data bindings (which may no longer resolve), but not animations or their current values.

CloneCore(Freezable)

Convierte la instancia en un clon (copia en profundidad) de la clase Freezable especificada con valores de propiedad base (no animadas).Makes the instance a clone (deep copy) of the specified Freezable using base (non-animated) property values.

CloneCurrentValue()

Crea un clon modificable de este objeto ShaderEffect y hace copias en profundidad de sus valores actuales.Creates a modifiable clone of this ShaderEffect object, making deep copies of this object's current values. Las referencias de recursos, los enlaces de datos y las animaciones no se copian, pero sí sus valores actuales.Resource references, data bindings, and animations are not copied, but their current values are copied.

CloneCurrentValueCore(Freezable)

Convierte esta instancia en un clon modificable (copia en profundidad) del Freezable especificado mediante los valores de propiedad actuales.Makes the instance a modifiable clone (deep copy) of the specified Freezable using current property values.

CoerceValue(DependencyProperty)

Convierte el valor de la propiedad de dependencia especificada.Coerces the value of the specified dependency property. Esto se logra invocando cualquier función CoerceValueCallback especificada en los metadatos de la propiedad de dependencia tal como existe en la clase DependencyObject que llama.This is accomplished by invoking any CoerceValueCallback function specified in property metadata for the dependency property as it exists on the calling DependencyObject.

(Heredado de DependencyObject)
CreateInstance()

Inicializa una nueva instancia de la clase Freezable.Initializes a new instance of the Freezable class.

(Heredado de Freezable)
CreateInstanceCore()

Crea una nueva instancia de la clase derivada de Freezable.Creates a new instance of the Freezable derived class.

Equals(Object)

Determina si un objeto DependencyObject proporcionado es equivalente al objeto DependencyObject actual.Determines whether a provided DependencyObject is equivalent to the current DependencyObject.

(Heredado de DependencyObject)
Freeze()

Convierte el objeto actual en no modificable y establece su propiedad IsFrozen en true.Makes the current object unmodifiable and sets its IsFrozen property to true.

(Heredado de Freezable)
FreezeCore(Boolean)

Convierte este objeto Animatable en no modificable o determina si se puede convertir en no modificable.Makes this Animatable object unmodifiable or determines whether it can be made unmodifiable.

(Heredado de Animatable)
GetAnimationBaseValue(DependencyProperty)

Devuelve el valor no animado del objeto DependencyProperty especificado.Returns the non-animated value of the specified DependencyProperty.

(Heredado de Animatable)
GetAsFrozen()

Crea una copia inmovilizada de Freezable, con los valores de propiedades base (no animadas).Creates a frozen copy of the Freezable, using base (non-animated) property values. Puesto que se inmoviliza la copia, se copia cualquier subobjeto inmovilizado por referencia.Because the copy is frozen, any frozen sub-objects are copied by reference.

(Heredado de Freezable)
GetAsFrozenCore(Freezable)

Convierte la instancia en un clon inmovilizado de la clase Freezable especificada con los valores de propiedades base (no animadas).Makes the instance a frozen clone of the specified Freezable using base (non-animated) property values.

GetCurrentValueAsFrozen()

Crea una copia inmovilizada de Freezable con los valores de propiedad actuales.Creates a frozen copy of the Freezable using current property values. Puesto que se inmoviliza la copia, se copia cualquier subobjeto inmovilizado por referencia.Because the copy is frozen, any frozen sub-objects are copied by reference.

(Heredado de Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Convierte la instancia actual en un clon inmovilizado de la clase Freezable especificada.Makes the current instance a frozen clone of the specified Freezable. Si el objeto tiene propiedades de dependencia animadas, se copian sus valores animados actuales.If the object has animated dependency properties, their current animated values are copied.

GetHashCode()

Obtiene el código hash de DependencyObject.Gets a hash code for this DependencyObject.

(Heredado de DependencyObject)
GetLocalValueEnumerator()

Crea un enumerador especializado para determinar qué propiedades de dependencia han establecido localmente los valores en DependencyObject.Creates a specialized enumerator for determining which dependency properties have locally set values on this DependencyObject.

(Heredado de DependencyObject)
GetType()

Obtiene el Type de la instancia actual.Gets the Type of the current instance.

(Heredado de Object)
GetValue(DependencyProperty)

Devuelve el valor efectivo actual de una propiedad de dependencia en esta instancia de un DependencyObject.Returns the current effective value of a dependency property on this instance of a DependencyObject.

(Heredado de DependencyObject)
InvalidateProperty(DependencyProperty)

Vuelve a evaluar el valor efectivo para la propiedad de dependencia especificada.Re-evaluates the effective value for the specified dependency property.

(Heredado de DependencyObject)
MemberwiseClone()

Crea una copia superficial del Object actual.Creates a shallow copy of the current Object.

(Heredado de Object)
OnChanged()

Se le llama cuando el objeto Freezable actual se modifica.Called when the current Freezable object is modified.

(Heredado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Se asegura de que se establecen los punteros contextuales adecuados para un miembro de datos DependencyObjectType que se acaba de establecer.Ensures that appropriate context pointers are established for a DependencyObjectType data member that has just been set.

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

Este miembro es compatible con la infraestructura de Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) y no está diseñado para utilizarse directamente desde el código.This member supports the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) infrastructure and is not intended to be used directly from your code.

(Heredado de Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Reemplaza la implementación DependencyObject de OnPropertyChanged(DependencyPropertyChangedEventArgs) para invocar también cualquier controlador Changed en respuesta a una propiedad de dependencia cambiante de tipo Freezable.Overrides the DependencyObject implementation of OnPropertyChanged(DependencyPropertyChangedEventArgs) to also invoke any Changed handlers in response to a changing dependency property of type Freezable.

(Heredado de Freezable)
PixelShaderConstantCallback(Int32)

Asocia un valor de propiedad de dependencia a un registro de constante float de un sombreador de píxeles.Associates a dependency property value with a pixel shader's float constant register.

PixelShaderSamplerCallback(Int32)

Asocia un valor de propiedad de dependencia al registro de muestra de un sombreador de píxeles.Associates a dependency property value with a pixel shader's sampler register.

PixelShaderSamplerCallback(Int32, SamplingMode)

Asocia un valor de propiedad de dependencia al registro de muestra de un sombreador de píxeles y un SamplingMode.Associates a dependency property value with a pixel shader's sampler register and a SamplingMode.

ReadLocalValue(DependencyProperty)

Devuelve el valor local de una propiedad de dependencia, si existe.Returns the local value of a dependency property, if it exists.

(Heredado de DependencyObject)
ReadPreamble()

Se asegura de que se tiene acceso a Freezable desde un subproceso válido.Ensures that the Freezable is being accessed from a valid thread. Los herederos de Freezable deben llamar a este método al inicio de las API que leen miembros de datos que no son propiedades de dependencia.Inheritors of Freezable must call this method at the beginning of any API that reads data members that are not dependency properties.

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

Asocia una propiedad de dependencia a un registro de muestra de sombreador.Associates a dependency property with a shader sampler register.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Asocia una propiedad de dependencia a un registro de muestra de sombreador y un SamplingMode.Associates a dependency property with a shader sampler register and a SamplingMode.

SetCurrentValue(DependencyProperty, Object)

Establece el valor de una propiedad de dependencia sin cambiar el origen de su valor.Sets the value of a dependency property without changing its value source.

(Heredado de DependencyObject)
SetValue(DependencyProperty, Object)

Establece el valor local de una propiedad de dependencia, especificado por su identificador de propiedad de dependencia.Sets the local value of a dependency property, specified by its dependency property identifier.

(Heredado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Establece el valor local de una propiedad de dependencia de solo lectura, especificado por el identificador DependencyPropertyKey de la propiedad de dependencia.Sets the local value of a read-only dependency property, specified by the DependencyPropertyKey identifier of the dependency property.

(Heredado de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Devuelve un valor que indica si los procesos de serialización deben serializar el valor de la propiedad de dependencia suministrada.Returns a value that indicates whether serialization processes should serialize the value for the provided dependency property.

(Heredado de DependencyObject)
ToString()

Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object.

(Heredado de Object)
UpdateShaderValue(DependencyProperty)

Notifica el efecto que se debería actualizar en la constante o la muestra de sombreador correspondiente a la propiedad de dependencia especificada.Notifies the effect that the shader constant or sampler corresponding to the specified dependency property should be updated.

VerifyAccess()

Exige que el subproceso de la llamada tenga acceso a DispatcherObject.Enforces that the calling thread has access to this DispatcherObject.

(Heredado de DispatcherObject)
WritePostscript()

Genera el evento Changed para Freezable e invoca su método OnChanged().Raises the Changed event for the Freezable and invokes its OnChanged() method. Las clases que derivan de Freezable deben llamar a este método al final de cualquier API que modifique miembros de clase que no estén almacenados como propiedades de dependencia.Classes that derive from Freezable should call this method at the end of any API that modifies class members that are not stored as dependency properties.

(Heredado de Freezable)
WritePreamble()

Comprueba que no se inmovilice Freezable y que se tiene acceso desde un contexto de subproceso válido.Verifies that the Freezable is not frozen and that it is being accessed from a valid threading context. Los herederos de Freezable deben llamar a este método al inicio de las API que escriben en miembros de datos que no son propiedades de dependencia.Freezable inheritors should call this method at the beginning of any API that writes to data members that are not dependency properties.

(Heredado de Freezable)

Eventos

Changed

Se produce cuando se modifican la clase Freezable o un objeto que la contiene.Occurs when the Freezable or an object it contains is modified.

(Heredado de Freezable)

Se aplica a

Consulte también: