将ColorMatrix转换为WPF着色器

时间:2014-02-11 17:38:47

标签: wpf shader colormatrix

我目前正在将一个复杂的工具从Winforms转换为WPF,这个图像在我的移植版本中无法正常显示:它只显示图像的一个小区域。通过注释掉ColorMatrix的创建,我能够重现原始(Winforms)版本中的错误。我读了Colormatrices,我想我已经弄清楚了原始矩阵在做什么,所以我可以在shaderEffect中重现它。 不幸的是,我制作的ShaderEffect不起作用,我想知道是否有一些关于ColorMatrices的东西,我不明白这会挫败我转换它的尝试。

这是原始的ColorMatrix:

        return new ColorMatrix(new[]
                    {
                        new [] {   r , 0.0f, 0.0f, 0.0f, 0.0f },
                        new [] { 0.0f,   g , 0.0f, 0.0f, 0.0f },
                        new [] { 0.0f, 0.0f,   b , 0.0f, 0.0f },
                        new [] { 0.0f, 0.0f, 0.0f,   a , 0.0f },
                        new [] { 0.0f, 0.0f, 0.0f, 1-a , 1.0f }
                    });

我已经检查了,当它到达此图像的这行代码时,r,g和&的值。 b总是1.0f。 'a'的值为0。

这是我的等效PixelShader:

float red : register(C0);
float green : register(C1);
float blue : register(C2);
float alpha : register(C3);

sampler2D implicitInputSampler : register(S0);

float4 main(float2 uv : TEXCOORD) : COLOR
{
   // Get the source color
   float4 color = tex2D(implicitInputSampler, uv);


   color.r *= red;
   color.g *= green;
   color.b *= blue;
   color.a = alpha;


   // Return new color
   return color;
}

我为红色,绿色和蓝色设置的值alpha是:(1,1,1,1)。我将alpha设置为1与将alpha缩放为0然后将其翻译为1相同。

我知道我的着色器正在应用,因为它已经在处理其他图像时取消了alpha图层并用黑色像素替换它(这就是我想要的)。它在此图像中具有相同的效果,但它仍然只显示一个小区域。

我没有正确转换此矩阵吗?

编辑:以下是xaml中应用效果的方式:

   <Canvas Width="64" Height="64" Margin="5,-15,0,0">
         <!--Draw a checkered rectangle underneath the image. If the image fails to load, all we'll see is a texture pattern. If the image
        has transparency, we'll see part of the texture pattern -->
        <Rectangle Fill="{Binding Path=CheckerBrush, ElementName=This}" Stretch="Fill" Margin="0,0" Width="64" Height="64"/>
        <Image Stretch="Fill" Name="imgPreview" Margin="0,0" Width="64" Height="64" 
               Effect="{Binding Path=Tint, ElementName=This, Converter={StaticResource tintToEffectConverter}}"/>


    </Canvas>

这是转换器:

  public class TintToEffectConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Color tint = (Color)value;

        ColorScaleEffect effect = new ColorScaleEffect();

        effect.RedScale = (float)tint.R / 255.0f;
        effect.GreenScale = (float)tint.G / 255.0f;
        effect.BlueScale = (float)tint.B / 255.0f;
        effect.Alpha = 1;

        return effect;
    }
    ....

0 个答案:

没有答案