2011-01-18 3 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

자료 전환 EasyRGB에서 사용할 수 있으며, 색조 변화의 실버 구현 nokola.com에서이 포스트를 참조하십시오. here을 언급 한 접근 방식을 취하면 하나의 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); 
}