设置像素着色器统一变量
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
来初始传递值也很重要。
我猜是虚拟问题。我有一个看起来像这样的自定义着色器:
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
来初始传递值也很重要。