设置像素着色器统一变量

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

我正在尝试通过如下所示的包装器使用它:

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

所以,我的问题是:如何从 C# 程序设置这些着色器参数?

它就在 ShaderEffect class 的 documentation 中。您需要为每个参数创建依赖属性。例如:

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

PixelShaderConstantCallback中的0是指您在HLSL中使用的寄存器:

float threshold : register(c0);

这样 WPF 就知道在 属性 更改时更新着色器。在构造函数中调用 UpdateShaderValue 来初始传递值也很重要。