HLSL алгоритм изменения оттенка - PullRequest
1 голос
/ 18 января 2011

Я хочу сделать пиксельный шейдер для Silverlight, который поможет мне изменить оттенок / насыщенность / яркость с помощью ползунка.* Ползунок оттенка имеет значения в диапазоне: [-180, 180] * Ползунок насыщенности имеет значения в диапазоне: [-100, 100] * Ползунок яркости имеет значения в диапазоне: [-100, 100]

Мне удалосьсоздать пиксельный шейдер, который может манипулировать значениями насыщенности и яркости.Но я могу найти любой алгоритм для изменения значения оттенка.Кто-нибудь может предоставить мне алгоритм?Спасибо.

Вот мой код HLSL:

/// <summary>The brightness offset.</summary>
/// <minValue>-180</minValue>
/// <maxValue>180</maxValue>
/// <defaultValue>0</defaultValue>
float Hue : register(C0);

/// <summary>The saturation offset.</summary>
/// <minValue>-100</minValue>
/// <maxValue>100</maxValue>
/// <defaultValue>0</defaultValue>
float Saturation : register(C1);

/// <summary>The lightness offset.</summary>
/// <minValue>-100</minValue>
/// <maxValue>100</maxValue>
/// <defaultValue>0</defaultValue>
float Lightness : register(C2);

sampler2D input : register(S0);

//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------

float4 main(float2 uv : TEXCOORD) : COLOR
{
 // some vars
 float saturation = Saturation / 100 + 1;
 float lightness = Lightness / 100;
 float3  luminanceWeights = float3(0.299,0.587,0.114);

    // input raw pixel
    float4 srcPixel = tex2D(input, uv);

    // Apply saturation
    float luminance = dot(srcPixel, luminanceWeights);
    float4 dstPixel = lerp(luminance, srcPixel, saturation);

    // Apply lightness
    dstPixel.rgb += lightness;

    //retain the incoming alpha
    dstPixel.a = srcPixel.a;

    return dstPixel;
}

Ответы [ 3 ]

1 голос
/ 25 мая 2014

С немного другой областью ввода, но ее можно легко адаптировать:

float Hue : register(C0); // 0..360, default 0
float Saturation : register(C1); // 0..2, default 1
float Luminosity : register(C2); // -1..1, default 0

sampler2D input1 : register(S0);

static float3x3 matrixH =
{
  0.8164966f,  0,           0.5352037f,
 -0.4082483f,  0.70710677f, 1.0548190f,
 -0.4082483f, -0.70710677f, 0.1420281f
};

static float3x3 matrixH2 =
{
  0.84630f, -0.37844f, -0.37844f,
 -0.37265f,  0.33446f, -1.07975f,
  0.57735f,  0.57735f,  0.57735f
};

float4 main(float2 uv : TEXCOORD) : COLOR
{
  float4 c = tex2D(input1, uv);

  float3x3 rotateZ =
  {
    cos(radians(Hue)), sin(radians(Hue)), 0,
   -sin(radians(Hue)), cos(radians(Hue)), 0,
    0,                 0,                 1
  };
  matrixH = mul(matrixH, rotateZ);
  matrixH = mul(matrixH, matrixH2);

  float i = 1 - Saturation;
  float3x3 matrixS =
  {
    i*0.3086f+Saturation, i*0.3086f,            i*0.3086f,
    i*0.6094f,            i*0.6094f+Saturation, i*0.6094f,
    i*0.0820f,            i*0.0820f,            i*0.0820f+Saturation
  };
  matrixH = mul(matrixH, matrixS);

  float3 c1 = mul(c, matrixH);
  c1 += Luminosity;
  return float4(c1, c.a);
}
1 голос
/ 18 января 2011

Преобразования между цветовыми пространствами доступны на EasyRGB , см. Этот пост на nokola.com для реализации Silverlight реализации сдвига оттенка. Может быть возможно установить оттенок, насыщенность и яркость в одном шейдере PS 2.0, если вы воспользуетесь упомянутым подходом здесь , но я не пробовал.

0 голосов
/ 18 июля 2013

Вот отличный пример, как работать с оттенком.

http://www.silverlightshow.net/news/Hue-Shift-in-Pixel-Shader-2.0-EasyPainter-Silverlight.aspx

...