2016-07-20 8 views
1

Ich habe benutzerdefinierten Shader-Effekt erzeugt, der wie folgt aussieht:Wie erstellt man mehrere Shader-Effekt-Instanzen?


class MyShaderEffect : ShaderEffect 
{ 
    private PixelShader _pixelShader = new PixelShader(); 
    public readonly DependencyProperty InputProperty = 
     ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(MyShaderEffect), 0); 

    public MyShaderEffect() 
    { 
     _pixelShader.UriSource = new Uri("MyShader.ps", UriKind.Relative); 
     this.PixelShader = _pixelShader; 
     this.UpdateShaderValue(InputProperty); 
    } 

    public Brush Input 
    { 
     get { return (Brush)this.GetValue(InputProperty); } 
     set { this.SetValue(InputProperty, value); } 
    } 
} 

Ich brauche eine etwas andere Variationen dieses Shader-Effekt anzuwenden (es einige Parameter haben) auf ein anderen Bilder, aber wenn ich versuche zu erstellen ein zweites MyShaderEffect-Objekt, ich bekomme "'Eingabe' Eigenschaft wurde bereits registriert" Ausnahme.

Gibt es eine Möglichkeit, um mehrere ShaderEffect-Instanzen von einem einzelnen Shader zu erstellen?

Antwort

2

Abhängigkeitseigenschaften sollten mit static Felder registriert sein, so Registrierung geschieht nur einmal pro Typ:

public static readonly DependencyProperty InputProperty = 
    ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(MyShaderEffect), 0); 
+0

Gut bemerkt +1, ich denke, das ist das Problem ... –

+0

Aber was ist mit den anderen Eigenschaften? Ich verwende sie, um Shader-Parameter einzustellen. Wenn ich sie statisch mache, kann ich für verschiedene Instanzen kein unterschiedliches Shader-Verhalten haben. – yadda

+1

Dieses Feld ist nur die Kennung der Eigenschaft. Es ist ein Schlüssel, der verwendet wird, um mit 'GetValue' und 'SetValue' auf die Eigenschaftswerte zuzugreifen. Die'Eingabe'-Eigenschaft selbst ist nicht statisch. –

Verwandte Themen