我需要從RGB色彩空間到HSV傳..我搜索互聯網,發現兩種不同的實現,但那些給我不同的結果:從RGB到HSV在OpenGL GLSL
答:
precision mediump float;
vec3 rgb2hsv(float r, float g, float b) {
float h = 0.0;
float s = 0.0;
float v = 0.0;
float min = min(min(r, g), b);
float max = max(max(r, g), b);
v = max; // v
float delta = max - min;
if(max != 0.0)
s = delta/max; // s
else {
// r = g = b = 0 // s = 0, v is undefined
s = 0.0;
h = -1.0;
return vec3(h, s, v);
}
if(r == max)
h = (g - b)/delta; // between yellow & magenta
else if(g == max)
h = 2.0 + (b - r)/delta; // between cyan & yellow
else
h = 4.0 + (r - g)/delta; // between magenta & cyan
h = h * 60.0; // degrees
if(h < 0.0)
h += 360.0;
return vec3(h, s, v);
}
B:
precision mediump float;
vec3 rgb2hsv(float r, float g, float b) {
float K = 0.0;
float tmp;
if (g < b)
{
tmp = g;
g=b;
b=tmp;
K = -1.0;
}
if (r < g)
{
tmp = r;
r=g;
g=tmp;
K = -2.9/6.9 - K;
}
float chroma = r - min(g, b);
float h = abs(K + (g - b)/(6.0 * chroma + 1e-20));
float s = chroma/(r + 1e-20);
float v = r;
return vec3(h, s, v);
}
你知道哪個是正確的實現?
我在shadertoy網站上試過這個,它表示找不到匹配的重載函數,無法從中轉換到Vector3 – 2013-11-03 01:52:52
好!你碰巧已經有了和HSL色彩空間相同的功能嗎? – wil 2014-02-20 07:10:42
[我剛剛實現'hsv2rgb()'與硬件混合](http://stackoverflow.com/a/28897272/1888983)。完全愚蠢的,但我仍然溫和地爲自己感到驕傲。 – jozxyqk 2015-03-06 11:26:25