tôi cần phải vượt qua từ không gian màu RGB để HSV .. Tôi đã tìm kiếm trên internet và tìm thấy hai hiện thực khác nhau, nhưng những người cho tôi kết quả khác nhau:Từ RGB để HSV trong OpenGL GLSL
A:
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);
}
Bạn có biết triển khai chính xác không?
tôi đã thử điều này trên trang web shadertoy và nó cho biết không tìm thấy chức năng quá tải phù hợp, không thể chuyển đổi từ mediump sang Vector3 –
Nice! Bạn có đã có cùng một loại chức năng cho không gian màu HSL? – wil
[Tôi vừa triển khai 'hsv2rgb()' với phần cứng trộn] (http://stackoverflow.com/a/28897272/1888983). Hoàn toàn ngu ngốc nhưng tôi vẫn tự hào về bản thân mình. – jozxyqk