Why do you need to modify the color values using HSL? Could you try to specify the problem?
If you need something, then I threw the following GLSL shader code together. It's tested and does seemingly work
Code:
vec3 HSL2RGB(vec3 hsl)
{
if(hsl.z == 0)
return vec3(0,0,0);
else
{
if(hsl.y == 0)
return vec3(hsl.z);
else
{
float tmp2 = 0;
if(hsl.z<=0.5)
tmp2 = hsl.z*(1.0+hsl.y);
else
tmp2 = hsl.z+hsl.y-hsl.z*hsl.y;
float tmp1 = 2.0*hsl.z-tmp2;
vec3 t3 = vec3(hsl.x+1.0/3.0, hsl.x, hsl.x-1.0/3.0);
vec3 clr = vec3(0);
for(int i=0; i<3; i++)
{
if(t3[i]<0>1.0)
t3[i]-=1.0;
if(6.0*t3[i] < 1.0)
clr[i] = tmp1+(tmp2-tmp1)*t3[i]*6.0;
else if(2.0*t3[i] < 1.0)
clr[i] = tmp2;
else if(3.0*t3[i] < 2.0)
clr[i] = (tmp1+(tmp2-tmp1)*((2.0/3.0)-t3[i])*6.0);
else
clr[i] = tmp1;
}
return clr;
}
}
}
vec3 RGB2HSL(vec3 rgb)
{
float var_Min = min(min( rgb.x, rgb.y), rgb.z ); //Min. value of RGB
float var_Max = max(max( rgb.x, rgb.y), rgb.z ); //Max. value of RGB
float del_Max = var_Max - var_Min; //Delta RGB value
float H,S,L;
L = ( var_Max + var_Min ) / 2.0;
if ( del_Max == 0.0 ) //This is a gray, no chroma...
{
H = 0.0; //HSL results = 0 ?? 1
S = 0.0;
}
else //Chromatic data...
{
if ( L < 0.5 ) S = del_Max / ( var_Max + var_Min );
else S = del_Max / ( 2.0 - var_Max - var_Min );
float del_R = ( ( ( var_Max - rgb.x ) / 6.0 ) + ( del_Max / 2.0 ) ) / del_Max;
float del_G = ( ( ( var_Max - rgb.y ) / 6.0 ) + ( del_Max / 2.0 ) ) / del_Max;
float del_B = ( ( ( var_Max - rgb.z ) / 6.0 ) + ( del_Max / 2.0 ) ) / del_Max;
if ( rgb.x == var_Max ) H = del_B - del_G;
else if ( rgb.y == var_Max ) H = ( 1.0 / 3.0 ) + del_R - del_B;
else if ( rgb.z == var_Max ) H = ( 2.0 / 3.0 ) + del_G - del_R;
if ( H <0> 1.0 ) H -= 1.0;
}
return vec3(H,S,L);
}
Bookmarks