RGB to HSL
code:hlsl
float3 HSL;
float Cmax = max(RGB.r, max(RGB.g, RGB.b));
float Cmin = min(RGB.r, min(RGB.g, RGB.b));
float delta = Cmax - Cmin;
// Hue calculation
if (delta == 0.0f)
{
HSL.x = 0.0f;
}
else if (Cmax == RGB.r)
{
HSL.x = (RGB.g - RGB.b) / delta;
if (HSL.x < 0.0f)
HSL.x += 6.0f;
}
else if (Cmax == RGB.g)
{
HSL.x = 2.0f + (RGB.b - RGB.r) / delta;
}
else
{
HSL.x = 4.0f + (RGB.r - RGB.g) / delta;
}
HSL.x /= 6.0f;
// Lightness calculation
HSL.z = (Cmax + Cmin) / 2.0f;
// Saturation calculation
if (delta == 0.0f)
{
HSL.y = 0.0f;
}
else
{
HSL.y = delta / (1.0f - abs(2.0f * HSL.z - 1.0f));
}
return HSL;
code:hlsl
float3 HSL;
float Cmax = max(RGB.r, max(RGB.g, RGB.b));
float Cmin = min(RGB.r, min(RGB.g, RGB.b));
float delta = Cmax - Cmin;
// Hue calculation
float hue_r = (RGB.g - RGB.b) / delta;
float hue_g = 2.0f + (RGB.b - RGB.r) / delta;
float hue_b = 4.0f + (RGB.r - RGB.g) / delta;
float hue_r_weight = (RGB.r == Cmax) * (delta != 0.0f);
float hue_g_weight = (RGB.g == Cmax) * (delta != 0.0f);
float hue_b_weight = (RGB.b == Cmax) * (delta != 0.0f);
HSL.x = (hue_r * hue_r_weight + hue_g * hue_g_weight + hue_b * hue_b_weight) / 6.0f;
HSL.x += (HSL.x < 0.0f);
// Lightness calculation
HSL.z = (Cmax + Cmin) / 2.0f;
// Saturation calculation
float saturation_delta = 1.0f - abs(2.0f * HSL.z - 1.0f);
HSL.y = delta * (delta != 0.0f) / saturation_delta;
return HSL;
code:hlsl
float3 HSL;
float Cmax = max(RGB.r, max(RGB.g, RGB.b));
float Cmin = min(RGB.r, min(RGB.g, RGB.b));
float delta = Cmax - Cmin;
// Hue calculation
float hue_r = (RGB.g - RGB.b) / delta;
float hue_g = 2.0f + (RGB.b - RGB.r) / delta;
float hue_b = 4.0f + (RGB.r - RGB.g) / delta;
float hue_r_weight = step(Cmax, RGB.r) * (1.0f - step(0.0f, delta));
float hue_g_weight = step(Cmax, RGB.g) * (1.0f - step(0.0f, delta));
float hue_b_weight = step(Cmax, RGB.b) * (1.0f - step(0.0f, delta));
HSL.x = (hue_r * hue_r_weight + hue_g * hue_g_weight + hue_b * hue_b_weight) / 6.0f;
HSL.x += step(0.0f, -HSL.x);
// Lightness calculation
HSL.z = (Cmax + Cmin) / 2.0f;
// Saturation calculation
float saturation_delta = 1.0f - abs(2.0f * HSL.z - 1.0f);
HSL.y = delta * (1.0f - step(0.0f, delta)) / saturation_delta;
return HSL;