Compartir vía


ShaderEffect Clase

Definición

Proporciona un efecto de mapa de bits personalizado mediante un 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 ShaderEffect clase .

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

En el código XAML siguiente se muestra cómo usar el efecto 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>

Comentarios

Derive de la ShaderEffect clase para implementar un efecto personalizado basado en un único sombreador de píxeles.

En los pasos siguientes se muestra cómo crear un efecto personalizado.

  1. Cargue un PixelShader código de bytes del lenguaje de sombreado de alto nivel precompilado (HLSL).

  2. Defina las propiedades de dependencia que representan los parámetros del efecto y las Brushentradas de superficie basadas en . Use una de las RegisterPixelShaderSamplerProperty sobrecargas para asociar estas entradas con números de registro a los que se hace referencia en el código de bytes de HLSL.

El número de muestras está limitado a 4.

Se aplican las restricciones siguientes al usar un sombreador PS 3.0.

  • Cuando se asigna un sombreador PS 3.0, el número de muestreadores aumenta a 8. Asigne el sombreador PS 3.0 antes que otros sombreadores para habilitar el registro de 8 muestras.

  • Se usa el límite de registro constante de sombreador completo de 224 para floats. Para obtener más información, vea ps_3_0.

  • Los siguientes tipos de datos solo se admiten en sombreadores PS 3.0. Se produce una excepción si se usan en versiones inferiores del sombreador.

    • inty tipos convertibles a int: uint, byte, sbyte, ulonglong, short, , , ushortchar

    • bool

  • Si se carga un sombreador PS 3.0 válido en un equipo que no tiene compatibilidad de hardware con PS 3.0, se omite el sombreador. Si el sombreador no es válido, no se produce ninguna excepción.

  • Si un equipo tiene más de una tarjeta de vídeo, el comportamiento se define mediante la tarjeta de vídeo menos compatible. Por ejemplo, si el equipo tiene dos tarjetas de vídeo, una de las cuales admite PS 3.0 y otra de las cuales no, el comportamiento es el mismo que si el equipo no admite 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 InvalidPixelShaderEncountered evento. Un ejemplo de un sombreador PS 3.0 no válido es uno compilado con la ps_3_sw marca . La ShaderEffect clase solo acepta sombreadores PS 3.0 que se compilan con la ps_3_0 marca pasada a fxc.exe. Para obtener más información, vea Effect-Compiler Tool.

Nota

Los sombreadores de PS 2.0 se ejecutan al representar en 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.

Constructores

ShaderEffect()

Inicializa una nueva instancia de la clase ShaderEffect.

Campos

PixelShaderProperty

Identifica la propiedad de dependencia PixelShader.

Propiedades

CanFreeze

Obtiene un valor que indica si el objeto se puede convertir en no modificable.

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

DependencyObjectType

Obtiene el DependencyObjectType objeto que encapsula el tipo CLR de esta instancia.

(Heredado de DependencyObject)
Dispatcher

Obtiene el objeto Dispatcher al que está asociado DispatcherObject.

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

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

(Heredado de Animatable)
IsFrozen

Obtiene un valor que indica si el objeto se puede modificar actualmente.

(Heredado de Freezable)
IsSealed

Obtiene un valor que indica si esta instancia está actualmente sellada (es de solo lectura).

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

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.

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.

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.

PixelShader

Obtiene o establece el objeto PixelShader que se usará para el efecto.

Métodos

ApplyAnimationClock(DependencyProperty, AnimationClock)

Se aplica AnimationClock al valor de DependencyProperty especificado. Si la propiedad ya está animada, se usa el comportamiento de entrega SnapshotAndReplace.

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

Se aplica AnimationClock al valor de DependencyProperty especificado. Si la propiedad ya está animada, se usa el objeto HandoffBehavior especificado.

(Heredado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Aplica una animación a la DependencyProperty especificada. La animación se inicia al representar el siguiente fotograma. Si la propiedad especificada ya está animada, se usa el comportamiento de entrega SnapshotAndReplace.

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

Aplica una animación a la DependencyProperty especificada. La animación se inicia al representar el siguiente fotograma. Si la propiedad especificada ya está animada, se usa el objeto HandoffBehavior especificado.

(Heredado de Animatable)
CheckAccess()

Determina si el subproceso de la llamada tiene acceso a DispatcherObject.

(Heredado de DispatcherObject)
ClearValue(DependencyProperty)

Borra el valor local de una propiedad. La propiedad que se va a borrar se especifica mediante un identificador DependencyProperty.

(Heredado de DependencyObject)
ClearValue(DependencyPropertyKey)

Borra el valor local de una propiedad de solo lectura. La propiedad que se va a borrar se especifica mediante un DependencyPropertyKey.

(Heredado de DependencyObject)
Clone()

Crea un clon modificable de este objeto ShaderEffect y hace copias en profundidad de sus valores. 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.

CloneCore(Freezable)

Convierte la instancia en un clon (copia en profundidad) de la clase Freezable especificada con valores de propiedad base (no animadas).

CloneCurrentValue()

Crea un clon modificable de este objeto ShaderEffect y hace copias en profundidad de sus valores actuales. Las referencias de recursos, los enlaces de datos y las animaciones no se copian, pero sí sus valores actuales.

CloneCurrentValueCore(Freezable)

Convierte esta instancia en un clon modificable (copia en profundidad) del Freezable especificado mediante los valores de propiedad actuales.

CoerceValue(DependencyProperty)

Convierte el valor de la propiedad de dependencia especificada. 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.

(Heredado de DependencyObject)
CreateInstance()

Inicializa una nueva instancia de la clase Freezable.

(Heredado de Freezable)
CreateInstanceCore()

Crea una nueva instancia de la clase derivada de Freezable.

Equals(Object)

Determina si un objeto DependencyObject proporcionado es equivalente al objeto DependencyObject actual.

(Heredado de DependencyObject)
Freeze()

Convierte el objeto actual en no modificable y establece su propiedad IsFrozen en true.

(Heredado de Freezable)
FreezeCore(Boolean)

Convierte este objeto Animatable en no modificable o determina si se puede convertir en no modificable.

(Heredado de Animatable)
GetAnimationBaseValue(DependencyProperty)

Devuelve el valor no animado del objeto DependencyProperty especificado.

(Heredado de Animatable)
GetAsFrozen()

Crea una copia inmovilizada de Freezable, con los valores de propiedades base (no animadas). Puesto que se inmoviliza la copia, se copia cualquier subobjeto inmovilizado por referencia.

(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).

GetCurrentValueAsFrozen()

Crea una copia inmovilizada de Freezable con los valores de propiedad actuales. Puesto que se inmoviliza la copia, se copia cualquier subobjeto inmovilizado por referencia.

(Heredado de Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Convierte la instancia actual en un clon inmovilizado del valor de Freezable especificado. Si el objeto tiene propiedades de dependencia animadas, se copian sus valores animados actuales.

GetHashCode()

Obtiene un código hash de este objeto DependencyObject.

(Heredado de DependencyObject)
GetLocalValueEnumerator()

Crea un enumerador especializado para determinar qué propiedades de dependencia han establecido localmente los valores en DependencyObject.

(Heredado de DependencyObject)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
GetValue(DependencyProperty)

Devuelve el valor efectivo actual de una propiedad de dependencia en esta instancia de un DependencyObject.

(Heredado de DependencyObject)
InvalidateProperty(DependencyProperty)

Vuelve a evaluar el valor efectivo para la propiedad de dependencia especificada.

(Heredado de DependencyObject)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
OnChanged()

Se le llama cuando el objeto Freezable actual se modifica.

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

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

Este miembro admite la infraestructura de Windows Presentation Foundation (WPF) y no está pensada para usarse directamente desde el código.

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

(Heredado de Freezable)
PixelShaderConstantCallback(Int32)

Asocia un valor de propiedad de dependencia a un registro de constante float de un sombreador de píxeles.

PixelShaderSamplerCallback(Int32)

Asocia un valor de propiedad de dependencia al registro de muestra de un sombreador de píxeles.

PixelShaderSamplerCallback(Int32, SamplingMode)

Asocia un valor de propiedad de dependencia al registro de muestra de un sombreador de píxeles y un SamplingMode.

ReadLocalValue(DependencyProperty)

Devuelve el valor local de una propiedad de dependencia, si existe.

(Heredado de DependencyObject)
ReadPreamble()

Se asegura de que se tiene acceso a Freezable desde un subproceso válido. 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.

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

Asocia una propiedad de dependencia a un registro de muestra de sombreador.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Asocia una propiedad de dependencia a un registro de muestra de sombreador y un SamplingMode.

SetCurrentValue(DependencyProperty, Object)

Establece el valor de una propiedad de dependencia sin cambiar el origen del valor.

(Heredado de DependencyObject)
SetValue(DependencyProperty, Object)

Establece el valor local de una propiedad de dependencia, especificado mediante el identificador de la propiedad de dependencia.

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

(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 especificada.

(Heredado de DependencyObject)
ToString()

Devuelve una cadena que representa el objeto actual.

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

VerifyAccess()

Exige que el subproceso de la llamada tenga acceso a DispatcherObject.

(Heredado de DispatcherObject)
WritePostscript()

Genera el evento Changed para Freezable e invoca su método OnChanged(). 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.

(Heredado de Freezable)
WritePreamble()

Comprueba que no se inmovilice Freezable y que se tiene acceso desde un contexto de subproceso válido. 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.

(Heredado de Freezable)

Eventos

Changed

Se produce cuando se modifican la clase Freezable o un objeto que la contiene.

(Heredado de Freezable)

Se aplica a

Consulte también