2014-01-10 1 views
1

Я использую this code example, чтобы настроить яркость и контрастность на BitmapImage для моего приложения WPF. Соответствующий бит HLSL кода заключается в следующем:Создание черного фильтра для пользовательского ShaderEffect

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

То, что я хотел бы сделать, это добавить что-то, чтобы отфильтровать низкой интенсивности pixels- идея заключается в том, что я хочу сказать, что какая-либо часть изображения (я просто угадать, что я должен сделать это на пиксель) ниже определенного порога, сделать его черным. Я пытаюсь отфильтровать серые предметы с низкой интенсивностью, чтобы более светлые части выходили больше (это изображение в оттенках серого). Затем я использовал ползунок, чтобы настроить этот порог.

Я просто понятия не имею, является ли это фильтром или что, было надеялся, что это всего лишь простой мод для кода выше. Всего n00b - HLSL.

ответ

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; 
} 
+0

Не должно ли имя функции быть основным(), а не пороговым()? –

+0

@WaltRitscher: Да, моя ошибка. –

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

+0

+1 нравится мне лучше, чем у меня –