Freigeben über


ShaderEffect Klasse

Definition

Stellt einen benutzerdefinierten Bitmapeffekt mithilfe einer 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
Vererbung

Beispiele

Das folgende Codebeispiel zeigt, wie sie von der ShaderEffect Klasse abgeleitet werden.

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

Das folgende Codebeispiel zeigt einen Shader, der der vorherigen ShaderEffect Klasse entspricht.

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

Der folgende XAML-Code veranschaulicht die Verwendung des benutzerdefinierten Shadereffekts.

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

Hinweise

Leiten Sie von der ShaderEffect Klasse ab, um einen benutzerdefinierten Effekt basierend auf einem einzelnen Pixel-Shader zu implementieren.

Die folgenden Schritte zeigen, wie sie einen benutzerdefinierten Effekt erstellen.

  1. Laden Sie einen PixelShader bytecode (precompiled High Level Shading Language, HLSL).

  2. Definieren Sie Abhängigkeitseigenschaften, die die Parameter des Effekts und die Brush-basierten Oberflächeneingaben darstellen. Verwenden Sie eine der RegisterPixelShaderSamplerProperty Überladungen, um diese Eingaben registernummern zuzuordnen, auf die im HLSL-Bytecode verwiesen wird.

Die Anzahl der Sampler ist auf 4 beschränkt.

Die folgenden Einschränkungen gelten bei Verwendung eines PS 3.0-Shaders.

  • Wenn ein PS 3.0-Shader zugewiesen wird, erhöht sich die Anzahl der Sampler auf 8. Weisen Sie den PS 3.0-Shader vor anderen Shadern zu, um die Registrierung von 8 Samplern zu ermöglichen.

  • Das Vollständige Shaderkonstantenregisterlimit von 224 für Floats wird verwendet. Weitere Informationen finden Sie unter ps_3_0.

  • Die folgenden Datentypen werden nur in PS 3.0-Shadern unterstützt. Eine Ausnahme wird ausgelöst, wenn diese in niedrigeren Shaderversionen verwendet werden.

    • intund Typen konvertierbar in int: uint, , byte, sbyteulonglong, short, , ushortchar

    • bool

  • Wenn ein gültiger PS 3.0-Shader auf einem Computer geladen wird, der keine Hardwareunterstützung für PS 3.0 hat, wird der Shader ignoriert. Wenn der Shader ungültig ist, wird keine Ausnahme ausgelöst.

  • Wenn ein Computer über mehrere Grafikkarten verfügt, wird das Verhalten durch die am wenigsten fähige Grafikkarte definiert. Wenn der Computer beispielsweise über zwei Grafikkarten verfügt, von denen eine PS 3.0 unterstützt und einer davon nicht, ist das Verhalten identisch mit dem Verhalten, als ob der Computer PS 3.0 nicht unterstützt.

  • Wenn ein Computer das Rendern von PS 3.0 in der Hardware unterstützt, aber ein ungültiger PS 3.0-Shader zugewiesen ist, wird das InvalidPixelShaderEncountered Ereignis ausgelöst. Ein Beispiel für einen ungültigen PS 3.0-Shader ist ein kompilierter Shader mit dem ps_3_sw Flag. Die ShaderEffect Klasse akzeptiert nur PS 3.0-Shader, die mit dem Flag kompiliert werden, das ps_3_0 an fxc.exeübergeben wird. Weitere Informationen finden Sie unter Effect-Compiler Tool.

Note

PS 2.0-Shader werden beim Rendern in der Software ausgeführt. Auch wenn PS 3.0 von der Hardware des Systems unterstützt wird, werden PS 3.0-Shader während des Softwarerenderings nicht ausgeführt.

Konstruktoren

Name Beschreibung
ShaderEffect()

Initialisiert eine neue Instanz der ShaderEffect-Klasse.

Felder

Name Beschreibung
PixelShaderProperty

Identifies the PixelShader dependency property.

Eigenschaften

Name Beschreibung
CanFreeze

Ruft einen Wert ab, der angibt, ob das Objekt unveränderlich gemacht werden kann.

(Geerbt von Freezable)
DdxUvDdyUvRegisterIndex

Dient zum Abrufen oder Festlegen eines Werts, der das Shaderregister angibt, das für die teilweisen Ableitungen der Texturkoordinaten im Hinblick auf den Bildschirmbereich verwendet werden soll.

DependencyObjectType

Ruft den DependencyObjectType CLR-Typ dieser Instanz ab.

(Geerbt von DependencyObject)
Dispatcher

Ruft dies Dispatcher ab, dem dies DispatcherObject zugeordnet ist.

(Geerbt von DispatcherObject)
EffectMapping

Wenn sie in einer abgeleiteten Klasse überschrieben werden, werden Mauseingabe- und Koordinatensysteme durch den Effekt transformiert.

(Geerbt von Effect)
HasAnimatedProperties

Ruft einen Wert ab, der angibt, ob ein oder AnimationClock mehrere Objekte einer der Abhängigkeitseigenschaften dieses Objekts zugeordnet sind.

(Geerbt von Animatable)
IsFrozen

Ruft einen Wert ab, der angibt, ob das Objekt derzeit geändert werden kann.

(Geerbt von Freezable)
IsSealed

Ruft einen Wert ab, der angibt, ob diese Instanz aktuell versiegelt ist (schreibgeschützt).

(Geerbt von DependencyObject)
PaddingBottom

Dient zum Abrufen oder Festlegen eines Werts, der angibt, dass die Ausgabetextur des Effekts größer als seine Eingabetextur am unteren Rand ist.

PaddingLeft

Dient zum Abrufen oder Festlegen eines Werts, der angibt, dass die Ausgabetextur des Effekts größer als seine Eingabetextur am linken Rand ist.

PaddingRight

Dient zum Abrufen oder Festlegen eines Werts, der angibt, dass die Ausgabetextur des Effekts größer als seine Eingabetextur am rechten Rand ist.

PaddingTop

Dient zum Abrufen oder Festlegen eines Werts, der angibt, dass die Ausgabetextur des Effekts größer als seine Eingabetextur am oberen Rand ist.

PixelShader

Ruft die PixelShader für den Effekt zu verwendende Eigenschaft ab oder legt sie fest.

Methoden

Name Beschreibung
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Wendet eine AnimationClock auf die angegebene DependencyProperty. Wenn die Eigenschaft bereits animiert ist, wird die angegebene HandoffBehavior Eigenschaft verwendet.

(Geerbt von Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock)

Wendet eine AnimationClock auf die angegebene DependencyProperty. Wenn die Eigenschaft bereits animiert ist, wird das SnapshotAndReplace Übergabeverhalten verwendet.

(Geerbt von Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Wendet eine Animation auf die angegebene DependencyPropertyAnimation an. Die Animation wird gestartet, wenn der nächste Frame gerendert wird. Wenn die angegebene Eigenschaft bereits animiert ist, wird die angegebene HandoffBehavior Eigenschaft verwendet.

(Geerbt von Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Wendet eine Animation auf die angegebene DependencyPropertyAnimation an. Die Animation wird gestartet, wenn der nächste Frame gerendert wird. Wenn die angegebene Eigenschaft bereits animiert ist, wird das SnapshotAndReplace Übergabeverhalten verwendet.

(Geerbt von Animatable)
CheckAccess()

Bestimmt, ob der aufrufende Thread Zugriff auf diesen DispatcherObjectThread hat.

(Geerbt von DispatcherObject)
ClearValue(DependencyProperty)

Löscht den lokalen Wert einer Eigenschaft. Die zu löschende Eigenschaft wird durch einen DependencyProperty Bezeichner angegeben.

(Geerbt von DependencyObject)
ClearValue(DependencyPropertyKey)

Löscht den lokalen Wert einer schreibgeschützten Eigenschaft. Die zu löschende Eigenschaft wird durch eine DependencyPropertyKey.

(Geerbt von DependencyObject)
Clone()

Erstellt einen modifizierbaren Klon dieses ShaderEffect Objekts und erstellt tiefe Kopien der Werte dieses Objekts. Beim Kopieren der Abhängigkeitseigenschaften dieses Objekts kopiert diese Methode Ressourcenverweise und Datenbindungen (die möglicherweise nicht mehr aufgelöst werden können), jedoch keine Animationen oder ihre aktuellen Werte.

CloneCore(Freezable)

Macht die Instanz zu einem Klon (deep copy) der angegebenen Freezable Basiseigenschaftswerte (nicht animiert).

CloneCurrentValue()

Erstellt einen modifizierbaren Klon dieses ShaderEffect Objekts, wodurch tiefe Kopien der aktuellen Werte dieses Objekts erstellt werden. Ressourcenverweise, Datenbindungen und Animationen werden nicht kopiert, aber ihre aktuellen Werte werden kopiert.

CloneCurrentValueCore(Freezable)

Macht die Instanz zu einem modifizierbaren Klon (deep copy) des angegebenen Freezable Werts mit aktuellen Eigenschaftswerten.

CoerceValue(DependencyProperty)

Wandelt den Wert der angegebenen Abhängigkeitseigenschaft um. Dies wird erreicht, indem alle CoerceValueCallback in Eigenschaftsmetadaten für die Abhängigkeitseigenschaft angegebenen Funktionen aufgerufen werden, wie sie für den Aufruf DependencyObjectvorhanden sind.

(Geerbt von DependencyObject)
CreateInstance()

Initialisiert eine neue Instanz der Freezable-Klasse.

(Geerbt von Freezable)
CreateInstanceCore()

Erstellt eine neue Instanz der Freezable abgeleiteten Klasse.

Equals(Object)

Bestimmt, ob ein bereitgestelltes DependencyObject Element dem aktuellen DependencyObjectentspricht.

(Geerbt von DependencyObject)
Freeze()

Macht das aktuelle Objekt unveränderlich und legt seine IsFrozen Eigenschaft auf true.

(Geerbt von Freezable)
FreezeCore(Boolean)

Macht dieses Animatable Objekt unveränderlich oder bestimmt, ob es unveränderlich gemacht werden kann.

(Geerbt von Animatable)
GetAnimationBaseValue(DependencyProperty)

Gibt den nicht animierten Wert des angegebenen DependencyPropertyWerts zurück.

(Geerbt von Animatable)
GetAsFrozen()

Erstellt eine fixierte Kopie der Freezablebasisbasierten (nicht animierten) Eigenschaftswerte. Da die Kopie fixiert ist, werden alle fixierten Unterobjekte per Verweis kopiert.

(Geerbt von Freezable)
GetAsFrozenCore(Freezable)

Macht die Instanz zu einem fixierten Klon der angegebenen Freezable Basiseigenschaft (nicht animierte) Eigenschaftswerte.

GetCurrentValueAsFrozen()

Erstellt eine fixierte Kopie der Freezable aktuellen Eigenschaftswerte. Da die Kopie fixiert ist, werden alle fixierten Unterobjekte per Verweis kopiert.

(Geerbt von Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Macht die aktuelle Instanz zu einem fixierten Klon des angegebenen Freezable. Wenn das Objekt animierte Abhängigkeitseigenschaften aufweist, werden die aktuellen animierten Werte kopiert.

GetHashCode()

Ruft einen Hashcode für diese DependencyObjectab.

(Geerbt von DependencyObject)
GetLocalValueEnumerator()

Erstellt einen speziellen Enumerator, um zu bestimmen, welche Abhängigkeitseigenschaften lokal festgelegte Werte für diese DependencyObjectEigenschaft haben.

(Geerbt von DependencyObject)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
GetValue(DependencyProperty)

Gibt den aktuellen effektiven Wert einer Abhängigkeitseigenschaft für diese Instanz einer .DependencyObject

(Geerbt von DependencyObject)
InvalidateProperty(DependencyProperty)

Wertet den effektiven Wert für die angegebene Abhängigkeitseigenschaft erneut aus.

(Geerbt von DependencyObject)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
OnChanged()

Wird aufgerufen, wenn das aktuelle Freezable Objekt geändert wird.

(Geerbt von Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Dieses Mitglied unterstützt die Windows Presentation Foundation-Infrastruktur (WPF) und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Stellt sicher, dass geeignete Kontextzeiger für ein DependencyObjectType soeben festgelegtes Datenelement eingerichtet werden.

(Geerbt von Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Setzt die DependencyObject Implementierung OnPropertyChanged(DependencyPropertyChangedEventArgs) außer Kraft, um auch alle Changed Handler als Reaktion auf eine sich ändernde Abhängigkeitseigenschaft vom Typ Freezableaufzurufen.

(Geerbt von Freezable)
PixelShaderConstantCallback(Int32)

Ordnet einen Abhängigkeitseigenschaftswert dem Float-Konstantenregister eines Pixelshaders zu.

PixelShaderSamplerCallback(Int32, SamplingMode)

Ordnet einen Abhängigkeitseigenschaftswert dem Samplerregister eines Pixelshaders und einer .SamplingMode

PixelShaderSamplerCallback(Int32)

Ordnet einen Abhängigkeitseigenschaftswert dem Samplerregister eines Pixelshaders zu.

ReadLocalValue(DependencyProperty)

Gibt den lokalen Wert einer Abhängigkeitseigenschaft zurück, sofern vorhanden.

(Geerbt von DependencyObject)
ReadPreamble()

Stellt sicher, dass der Freezable Zugriff über einen gültigen Thread erfolgt. Erber von Freezable müssen diese Methode am Anfang einer API aufrufen, die Datenmmber liest, die keine Abhängigkeitseigenschaften sind.

(Geerbt von Freezable)
RegisterPixelShaderSamplerProperty(String, Type, Int32, SamplingMode)

Ordnet eine Abhängigkeitseigenschaft einem Shader-Samplerregister und einem SamplingMode.

RegisterPixelShaderSamplerProperty(String, Type, Int32)

Ordnet eine Abhängigkeitseigenschaft einem Shader-Samplerregister zu.

SetCurrentValue(DependencyProperty, Object)

Legt den Wert einer Abhängigkeitseigenschaft fest, ohne die Wertquelle zu ändern.

(Geerbt von DependencyObject)
SetValue(DependencyProperty, Object)

Legt den lokalen Wert einer Abhängigkeitseigenschaft fest, die durch den Bezeichner der Abhängigkeitseigenschaft angegeben wird.

(Geerbt von DependencyObject)
SetValue(DependencyPropertyKey, Object)

Legt den lokalen Wert einer schreibgeschützten Abhängigkeitseigenschaft fest, die durch den DependencyPropertyKey Bezeichner der Abhängigkeitseigenschaft angegeben wird.

(Geerbt von DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Gibt einen Wert zurück, der angibt, ob Serialisierungsprozesse den Wert für die bereitgestellte Abhängigkeitseigenschaft serialisieren sollen.

(Geerbt von DependencyObject)
ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)
UpdateShaderValue(DependencyProperty)

Benachrichtigt den Effekt, dass die Shaderkonstante oder der Sampler entsprechend der angegebenen Abhängigkeitseigenschaft aktualisiert werden soll.

VerifyAccess()

Erzwingt, dass der aufrufende Thread Zugriff auf diesen DispatcherObjectThread hat.

(Geerbt von DispatcherObject)
WritePostscript()

Löst das Changed Ereignis für die Freezable Methode aus und ruft es OnChanged() auf. Klassen, die von Freezable dieser Methode abgeleitet werden, sollten am Ende einer API aufgerufen werden, die Klassenmmber ändert, die nicht als Abhängigkeitseigenschaften gespeichert sind.

(Geerbt von Freezable)
WritePreamble()

Überprüft, ob der Freezable Zugriff nicht fixiert ist und über einen gültigen Threadingkontext darauf zugegriffen wird. Freezable Vererbungen sollten diese Methode am Anfang einer API aufrufen, die in Datenmmber schreibt, die keine Abhängigkeitseigenschaften sind.

(Geerbt von Freezable)

Ereignisse

Name Beschreibung
Changed

Tritt auf, wenn das Freezable darin enthaltene Objekt geändert wird.

(Geerbt von Freezable)

Gilt für:

Weitere Informationen