为自定义ShaderEffect创建黑色过滤器

时间:2014-01-10 02:00:32

标签: c# wpf hlsl

我正在使用this code example为我的WPF应用调整BitmapImage的亮度和对比度。 HLSL代码的相关部分是:

sampler2D input : register(s0);
float brightness : register(c0);
float contrast : register(c1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(input, uv); 
    float4 result = color;
    result = color + brightness;
    result = result * (1.0+contrast)/1.0;

    return result;
}

我想要做的是添加一些东西来过滤掉低强度像素 - 这个想法是我想说的是图像的任何部分(我只是猜测我必须按每个像素执行此操作)低于某个阈值,使其变黑。我正在尝试过滤灰度低强度的东西,以使更轻的部分弹出更多(这是一个灰度图像)。然后我会使用滑块调整该阈值。

我只是不知道这是一个过滤器还是什么,希望它只是上面代码的简单mod。总计n00b到HLSL。

2 个答案:

答案 0 :(得分:3)

这是@Ed版本的另一种方法。

这会输入任何颜色,并用黑色替换原始颜色。

/// <class>AdjustToBlack</class>
/// <description>An effect that makes pixels of a particular color black.</description>

sampler2D inputSampler : register(S0);


/// <summary>The color that becomes black.</summary>
/// <defaultValue>Green</defaultValue>
float4 ColorKey : register(C0);

/// <summary>The tolerance in color differences.</summary>
/// <minValue>0</minValue>
/// <maxValue>1</maxValue>
/// <defaultValue>0.3</defaultValue>
float Tolerance : register(C1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
   float4 color = tex2D( inputSampler, uv );

   if (all(abs(color.rgb - ColorKey.rgb) < Tolerance)) {
      color.rgb = 0;
   }

   return color;
}

示例来自Shazzam中包含的一个示例着色器。请注意,///注释是自定义标记,在Shazzam Shader Editor

中使用

答案 1 :(得分:1)

试试这个:

sampler2D input : register(s0);
float threshold : register(c0);
float4 blankColor : register(c1);

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float4 color = tex2D(input, uv);
    float intensity = (color.r + color.g + color.b) / 3;

    float4 result;
    if (intensity < threshold)
    {
        result = blankColor;
    }
    else
    {
        result = color;
    }

    return result;
}