ShaderEffect Classe

Définition

Fournit un effet bitmap personnalisé en utilisant 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
Héritage

Exemples

L’exemple de code suivant montre comment dériver de la 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
    }
}

L’exemple de code suivant montre un nuanceur qui correspond à la classe précédente 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;
}

Le code XAML suivant montre comment utiliser l’effet de nuanceur personnalisé.

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

Remarques

Dérivez de la ShaderEffect classe pour implémenter un effet personnalisé basé sur un nuanceur de pixels unique.

Les étapes suivantes montrent comment créer un effet personnalisé.

  1. Chargez un PixelShader à partir du bytecode HLSL (High Level Shading Language) précompilé.

  2. Définissez les propriétés de dépendance qui représentent les paramètres de l’effet et les Brushentrées de surface basées sur. Utilisez l’une RegisterPixelShaderSamplerProperty des surcharges pour associer ces entrées à des numéros de registre référencés dans le bytecode HLSL.

Le nombre d’échantillonneurs est limité à 4.

Les restrictions suivantes s’appliquent lors de l’utilisation d’un nuanceur PS 3.0.

  • Lorsqu’un nuanceur PS 3.0 est affecté, le nombre d’échantillonneurs passe à 8. Affectez le nuanceur PS 3.0 avant les autres nuanceurs pour permettre l’inscription de 8 échantillonneurs.

  • La limite de registre de constante de nuanceur complète de 224 pour les valeurs flottantes est utilisée. Pour plus d’informations, consultez ps_3_0.

  • Les types de données suivants sont pris en charge uniquement dans les nuanceurs PS 3.0. Une exception est levée si celles-ci sont utilisées dans les versions de nuanceur inférieur.

    • intet types convertibles en int: uint, byte, sbyte, long, ulong, short, , ushortchar

    • bool

  • Si un nuanceur PS 3.0 valide est chargé sur un ordinateur qui n’a pas de prise en charge matérielle pour PS 3.0, le nuanceur est ignoré. Si le nuanceur n’est pas valide, aucune exception n’est levée.

  • Si un ordinateur a plusieurs carte vidéo, le comportement est défini par les carte vidéo les moins compatibles. Par exemple, si l’ordinateur a deux cartes vidéo, dont l’une prend en charge PS 3.0 et l’autre non, le comportement est le même que si l’ordinateur ne prend pas en charge PS 3.0.

  • Si un ordinateur prend en charge le rendu de PS 3.0 dans le matériel, mais qu’un nuanceur PS 3.0 non valide est affecté, l’événement InvalidPixelShaderEncountered est déclenché. Un exemple de nuanceur PS 3.0 non valide est un nuanceur compilé avec l’indicateur ps_3_sw . La ShaderEffect classe accepte uniquement les nuanceurs PS 3.0 compilés avec l’indicateur ps_3_0 passé à fxc.exe. Pour plus d’informations, consultez Effect-Compiler Tool.

Notes

Les nuanceurs PS 2.0 s’exécutent lors du rendu dans les logiciels. Toutefois, même si PS 3.0 est pris en charge par le matériel du système, les nuanceurs PS 3.0 ne s’exécutent pas pendant le rendu logiciel.

Constructeurs

ShaderEffect()

Initialise une nouvelle instance de la classe ShaderEffect.

Champs

PixelShaderProperty

Identifie la propriété de dépendance PixelShader.

Propriétés

CanFreeze

Obtient une valeur qui indique si l’objet peut être rendu non modifiable.

(Hérité de Freezable)
DdxUvDdyUvRegisterIndex

Obtient ou définit une valeur qui indique le registre de nuanceur à utiliser pour les dérivées partielles des coordonnées de texture par rapport à l'espace écran.

DependencyObjectType

Obtient le DependencyObjectType qui encapsule le type CLR de ce instance.

(Hérité de DependencyObject)
Dispatcher

Obtient le Dispatcher associé à DispatcherObject.

(Hérité de DispatcherObject)
EffectMapping

En cas de substitution dans une classe dérivée, transforme l'entrée de la souris et les systèmes de coordonnées en appliquant l'effet.

(Hérité de Effect)
HasAnimatedProperties

Obtient une valeur qui indique si un ou plusieurs objets AnimationClock sont associés à l'une ou l'autre des propriétés de dépendance de cet objet.

(Hérité de Animatable)
IsFrozen

Obtient une valeur qui indique si l’objet est actuellement modifiable.

(Hérité de Freezable)
IsSealed

Récupère une valeur qui indique si cette instance est actuellement sealed (en lecture seule).

(Hérité de DependencyObject)
PaddingBottom

Obtient ou définit une valeur indiquant que la texture de sortie de l'effet est plus importante que sa texture d'entrée le long du bord inférieur.

PaddingLeft

Obtient ou définit une valeur indiquant que la texture de sortie de l'effet est plus importante que sa texture d'entrée le long du bord gauche.

PaddingRight

Obtient ou définit une valeur indiquant que la texture de sortie de l'effet est plus importante que sa texture d'entrée le long du bord droit.

PaddingTop

Obtient ou définit une valeur indiquant que la texture de sortie de l'effet est plus importante que sa texture d'entrée le long du bord supérieur.

PixelShader

Obtient ou définit le PixelShader à utiliser pour l'effet.

Méthodes

ApplyAnimationClock(DependencyProperty, AnimationClock)

Applique AnimationClock au DependencyProperty spécifié. Si la propriété est déjà animée, le comportement de transfert SnapshotAndReplace est utilisé.

(Hérité de Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Applique AnimationClock au DependencyProperty spécifié. Si la propriété spécifiée est déjà animée, le comportement HandoffBehavior spécifié est utilisé.

(Hérité de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Applique une animation au DependencyProperty spécifié. L’animation est démarrée lors de la restitution de l’image suivante. Si la propriété spécifiée est déjà animée, le comportement de transfert SnapshotAndReplace est utilisé.

(Hérité de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Applique une animation au DependencyProperty spécifié. L’animation est démarrée lors de la restitution de l’image suivante. Si la propriété spécifiée est déjà animée, le comportement HandoffBehavior spécifié est utilisé.

(Hérité de Animatable)
CheckAccess()

Détermine si le thread appelant a accès à ce DispatcherObject.

(Hérité de DispatcherObject)
ClearValue(DependencyProperty)

Efface la valeur locale d’une propriété. La propriété à effacer est spécifiée par un identificateur DependencyProperty.

(Hérité de DependencyObject)
ClearValue(DependencyPropertyKey)

Efface la valeur locale d’une propriété en lecture seule. La propriété à effacer est spécifiée par DependencyPropertyKey.

(Hérité de DependencyObject)
Clone()

Crée un clone modifiable de cet objet ShaderEffect, en créant des copies intégrales des valeurs de l'objet. Pendant la copie des propriétés de dépendance de cet objet, cette méthode copie les références de ressources et les liaisons de données (qui risquent de ne plus pouvoir se résoudre), mais pas les animations ni leurs valeurs actuelles.

CloneCore(Freezable)

Fait de l’instance un clone (copie complète) du Freezable spécifié utilisant des valeurs de propriété (non animée) de base.

CloneCurrentValue()

Crée un clone modifiable de cet objet ShaderEffect, en effectuant une copie complète des valeurs actuelles de cet objet. Contrairement à leurs valeurs actuelles, les références de ressources, les liaisons de données et les animations ne sont pas copiées.

CloneCurrentValueCore(Freezable)

Fait de l’instance un clone (copie complète) modifiable du Freezable spécifié à l’aide des valeurs de propriété actuelles.

CoerceValue(DependencyProperty)

Convertit la valeur de la propriété de dépendance spécifiée. Pour cela, on appelle toute fonction CoerceValueCallback spécifiée dans les métadonnées de propriété pour la propriété de dépendance telle qu’elle existe sur le DependencyObject appelant.

(Hérité de DependencyObject)
CreateInstance()

Initialise une nouvelle instance de la classe Freezable.

(Hérité de Freezable)
CreateInstanceCore()

Crée une nouvelle instance de la classe dérivée de Freezable.

Equals(Object)

Détermine si un DependencyObject fourni est équivalent au DependencyObject réel.

(Hérité de DependencyObject)
Freeze()

Rend l’objet actif non modifiable et attribue à sa propriété IsFrozen la valeur true.

(Hérité de Freezable)
FreezeCore(Boolean)

Rend cet objet Animatable non modifiable ou détermine s'il peut être rendu non modifiable.

(Hérité de Animatable)
GetAnimationBaseValue(DependencyProperty)

Retourne la valeur non animée de la propriété DependencyProperty spécifiée.

(Hérité de Animatable)
GetAsFrozen()

Crée une copie figée de Freezable, à l'aide des valeurs de propriété (non-animées) de base. Étant donné que la copie est figée, tous les sous-objets figés sont copiés par référence.

(Hérité de Freezable)
GetAsFrozenCore(Freezable)

Transforme l’instance en clone figé du Freezable spécifié utilisant des valeurs de propriété (non animée) de base.

GetCurrentValueAsFrozen()

Crée une copie figée de Freezable à l'aide des valeurs de propriété actuelles. Étant donné que la copie est figée, tous les sous-objets figés sont copiés par référence.

(Hérité de Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Convertit l’instance actuelle en un clone figé du Freezable spécifié. Si l’objet a des propriétés de dépendance animées, leurs valeurs animées actuelles sont copiées.

GetHashCode()

Obtient un code de hachage pour ce DependencyObject.

(Hérité de DependencyObject)
GetLocalValueEnumerator()

Crée un énumérateur spécialisé pour déterminer quelles propriétés de dépendance ont des valeurs définies localement sur ce DependencyObject.

(Hérité de DependencyObject)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
GetValue(DependencyProperty)

Retourne la valeur effective actuelle d’une propriété de dépendance sur cette instance d’un DependencyObject.

(Hérité de DependencyObject)
InvalidateProperty(DependencyProperty)

Réévalue la valeur effective de la propriété de dépendance spécifiée.

(Hérité de DependencyObject)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
OnChanged()

Appelé lorsque l’objet Freezable actuel est modifié.

(Hérité de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Garantit que les pointeurs de contexte appropriés sont établis pour un membre de données de type DependencyObjectType qui vient juste d'être défini.

(Hérité de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Ce membre prend en charge l’infrastructure Windows Presentation Foundation (WPF) et n’est pas destiné à être utilisé directement à partir de votre code.

(Hérité de Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Substitue l’implémentation DependencyObject de OnPropertyChanged(DependencyPropertyChangedEventArgs) pour appeler également tous les gestionnaires Changed en réponse à une propriété de dépendance variable de type Freezable.

(Hérité de Freezable)
PixelShaderConstantCallback(Int32)

Associe une valeur de propriété de dépendance au registre de constante flottante d'un nuanceur de pixels.

PixelShaderSamplerCallback(Int32)

Associe une valeur de propriété de dépendance au registre d'échantillonneur du nuanceur de pixels.

PixelShaderSamplerCallback(Int32, SamplingMode)

Associe une valeur de propriété de dépendance au registre d'échantillonneur du nuanceur de pixels et SamplingMode.

ReadLocalValue(DependencyProperty)

Retourne la valeur locale d’une propriété de dépendance, si elle existe.

(Hérité de DependencyObject)
ReadPreamble()

Garantit que Freezable est accessible à partir d'un thread valide. Les héritiers de Freezable doivent appeler cette méthode au début de toute API lisant les membres de données qui ne sont pas des propriétés de dépendance.

(Hérité de Freezable)
RegisterPixelShaderSamplerProperty(String, Type, Int32)

Associe une propriété de dépendance à un registre d'échantillonneur de nuanceur.

RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Associe une propriété de dépendance à un registre d'échantillonneur de nuanceur et un SamplingMode.

SetCurrentValue(DependencyProperty, Object)

Définit la valeur d’une propriété de dépendance sans modifier sa valeur source.

(Hérité de DependencyObject)
SetValue(DependencyProperty, Object)

Définit la valeur locale d’une propriété de dépendance, spécifiée par son identificateur de propriété de dépendance.

(Hérité de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Définit la valeur locale d’une propriété de dépendance en lecture seule, spécifiée par l’identificateur DependencyPropertyKey de la propriété de dépendance.

(Hérité de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Retourne une valeur qui indique si les processus de sérialisation doivent sérialiser la valeur de la propriété de dépendance fournie.

(Hérité de DependencyObject)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)
UpdateShaderValue(DependencyProperty)

Avertit l'effet que la constante ou l'échantillonneur de nuanceur correspondant à la propriété de dépendance spécifié doit être mis à jour.

VerifyAccess()

Garantit que le thread appelant a accès à DispatcherObject.

(Hérité de DispatcherObject)
WritePostscript()

Déclenche l’événement Changed pour le Freezable et appelle sa méthode OnChanged(). Les classes qui dérivent de Freezable doivent appeler cette méthode à la fin de toute API qui modifie des membres de classe qui ne sont pas stockés en tant que propriétés de dépendance.

(Hérité de Freezable)
WritePreamble()

Vérifie que le Freezable n'est pas figé et que son accès s'effectue à partir d'un contexte de thread valide. Les héritiers de Freezable doivent appeler cette méthode au début de toute API écrivant dans les membres de données qui ne sont pas des propriétés de dépendance.

(Hérité de Freezable)

Événements

Changed

Se produit lorsque Freezable ou un objet qu'il contient est modifié.

(Hérité de Freezable)

S’applique à

Voir aussi