Fast HSV to RGB Conversion
vagrearg.org
vagrearg.org
CIELAB is worth looking into for the color space which best defines how humans see (https://en.wikipedia.org/wiki/CIELAB_color_space#RGB_and_CMY...).
Here's some of the relevant code, copied from the private repo I have for this (legally).
https://gist.github.com/SephReed/8c762f3434d683c66339f63342e...
I've also used it for LED projects, and it helps a lot with that obnoxious brighter/darker wave that you get when rotating through hues.
The reason I brought it up in this thread in particular is because it's about HSV. Anytime I've dealt with HSV, it's because there's some hue rotation going on. I think HS Lum creates a more intuitive color rotation aesthetic for things with less saturation. It maintains shading rather than colorfulness.
vec3 coolhue(float h){
if (h == 1.f) return vec3(1.f,0,0);
h *= 6.0f;
if(h<1.f) { return vec3(0, 1.f, h); } // +blue
if(h<2.f) { h -= 1.f; return vec3(0, 1.f - h, 1.f); } // -green
if(h<3.f) { h -= 2.f; return vec3(h, 0, 1.f); } // +red
if(h<4.f) { h -= 3.f; return vec3(1.f, 0, 1.f - h); } // -blue
if(h<5.f) { h -= 4.f; return vec3(1.f, h, 0); } // +green
if(h<6.f) { h -= 5.f; return vec3(1.f - h, 1.f, 0); } // -red
return vec3(1,1,1);
}
This is for GLSL shaders, since shaders don't allow switch() #define saturate(x) clamp(x,0,1)
rgb = saturate(vec3(abs(hue-180)/60 - 1, 2 - abs(hue-120)/60, 2 - abs(hue-240)/60))
Since it avoids the if/then. Although I'm not too sure if it will work well in GLSL as HLSL has better support for the saturate function (it can usually be merged with some other operator).Starting on green and mapped to [0, 1] like op's:
vec3 coolhue2(float h){
float h6 = 6.*h;
return saturate(
vec3(
2. - abs(h6 - 4.),
abs(h6 - 3.) - 1.,
2. - abs(h6 - 2.)
));
}