2016-07-19 12 views
1

Dummy-Frage, schätze ich. Ich habe einen benutzerdefinierten Shader, der wie folgt aussieht:Einstellen der Pixel-Shader-Uniform-Variable

 
sampler2D InputTexture; 

float parameter1, parameter2 etc 

float4 main(float2 uv : TEXCOORD) : COLOR 
{ 
    float4 result = blah-blah-blah some calculations using parameter1, parameter2 etc. 

    return result; 
} 

Ich versuche, es zu benutzen über Wrapper, der wie folgt aussieht:

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

Also, meine Frage ist: Wie kann ich jene Shader Parameter aus dem C# -Programm?

Antwort

0

Es ist genau dort in der documentation der ShaderEffect Klasse. Sie müssen Abhängigkeitseigenschaften für jeden Parameter erstellen. Zum Beispiel:

class MyShaderEffect 
{ 
    public MyShaderEffect() 
    { 
     PixelShader = _pixelShader; 

     UpdateShaderValue(InputProperty); 
     UpdateShaderValue(ThresholdProperty); 
    } 

    public double Threshold 
    { 
     get { return (double)GetValue(ThresholdProperty); } 
     set { SetValue(ThresholdProperty, value); } 
    } 

    public static readonly DependencyProperty ThresholdProperty = 
     DependencyProperty.Register("Threshold", typeof(double), typeof(MyShaderEffect), 
       new UIPropertyMetadata(0.5, PixelShaderConstantCallback(0))); 
} 

Die 0 in PixelShaderConstantCallback bezieht sich auf den registrieren Sie in HLSL verwenden:

float threshold : register(c0); 

Auf diese Weise WPF kennt den Shader, wenn die Eigenschaftsänderungen zu aktualisieren. Es ist auch wichtig, im Konstruktor UpdateShaderValue aufzurufen, um den Wert zunächst zu übergeben.