2011-01-18 31 views
1

Silverlight用のピクセルシェーダを作って、スライダを使って色相/彩度/明度を変更するのに役立ちます。 *色相スライダ範囲内の値を有する:[-180、180] *彩度スライダ範囲内の値を有する:[-100、100] *明度のスライダーが範囲内の値を有する:[-100、100]HLSL色相変更アルゴリズム

I彩度と明度の値を操作できるピクセルシェーダを作成することができました。 しかし、私は色相値を変更するためのアルゴリズムを見つけることができます。 誰も私にアルゴリズムを提供できますか?ありがとうございました。ここで

は私の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; 
} 

答えて

1

色空間との間の変換は、色相シフトのSilverlightの実装にnokola.comで、この記事を参照してください、EasyRGBでご利用いただけます。 hereというアプローチを取った場合、色相、彩度、明るさを1つのPS 2.0シェーダーに合わせることは可能ですが、試していません。

1
わずかに異なる入力ドメインと

が、それは容易に適合させることができる。

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