C# 为自定义着色器效果创建黑色过滤器

C# 为自定义着色器效果创建黑色过滤器,c#,wpf,hlsl,C#,Wpf,Hlsl,我正在为我的WPF应用程序调整位图图像的亮度和对比度。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;

我正在为我的WPF应用程序调整位图图像的亮度和对比度。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;
}
我想做的是添加一些滤除低强度像素的东西——我想说的是,图像的任何部分(我只是猜测我必须每像素做一次)都低于某个阈值,将其设置为黑色。我试着过滤掉灰色,一种低强度的东西,使较轻的部分更突出(这是一张灰度图像)。然后,我将使用滑块来调整该阈值

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

尝试以下方法:

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;
}
2d输入:寄存器(s0);
浮动阈值:寄存器(c0);
浮动4空白颜色:寄存器(c1);
浮动4主(浮动2 uv:TEXCOORD):颜色
{
float4 color=tex2D(输入,uv);
浮动强度=(color.r+color.g+color.b)/3;
4结果;
如果(强度<阈值)
{
结果=空白颜色;
}
其他的
{
结果=颜色;
}
返回结果;
}
试试这个:

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;
}
2d输入:寄存器(s0);
浮动阈值:寄存器(c0);
浮动4空白颜色:寄存器(c1);
浮动4主(浮动2 uv:TEXCOORD):颜色
{
float4 color=tex2D(输入,uv);
浮动强度=(color.r+color.g+color.b)/3;
4结果;
如果(强度<阈值)
{
结果=空白颜色;
}
其他的
{
结果=颜色;
}
返回结果;
}

这里有一种@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;
}
///AdjustToBlack
///使特定颜色的像素变黑的效果。
采样器2D输入采样器:寄存器(S0);
///变成黑色的颜色。
///绿色的
float4颜色键:寄存器(C0);
///色差的容忍度。
/// 0
/// 1
/// 0.3
浮动公差:寄存器(C1);
浮动4主(浮动2 uv:TEXCOORD):颜色
{
float4 color=tex2D(输入采样器,uv);
if(全部(abs(color.rgb-ColorKey.rgb)<公差)){
color.rgb=0;
}
返回颜色;
}

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

中使用。这里有一种@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;
}
///AdjustToBlack
///使特定颜色的像素变黑的效果。
采样器2D输入采样器:寄存器(S0);
///变成黑色的颜色。
///绿色的
float4颜色键:寄存器(C0);
///色差的容忍度。
/// 0
/// 1
/// 0.3
浮动公差:寄存器(C1);
浮动4主(浮动2 uv:TEXCOORD):颜色
{
float4 color=tex2D(输入采样器,uv);
if(全部(abs(color.rgb-ColorKey.rgb)<公差)){
color.rgb=0;
}
返回颜色;
}

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

中使用。函数名不应该是main(),而应该是threshold()?@WaltRitscher:yes,我的错误。函数名不应该是main(),而应该是threshold()?@WaltRitscher:yes,我的错误。