RGB中的xyz分别对应r(红色)g(绿色)b(蓝色)
HSV中的xyz分别对应h(色调、颜色)s(饱和度)v(明度)
RGB转化到HSV的算法:
max=max(R,G,B);
min=min(R,G,B);
V=max(R,G,B);
S=(max-min)/max;
if (R = max) H =(G-B)/(max-min)* 60;
if (G = max) H = 120+(B-R)/(max-min)* 60;
if (B = max) H = 240 +(R-G)/(max-min)* 60;
if (H < 0) H = H+ 360;
HSV转化到RGB的算法:
if (s = 0)
R=G=B=V;
else
H /= 60;
i = INTEGER(H);
f = H - i;
a = V * ( 1 - s );
b = V * ( 1 - s * f );
c = V * ( 1 - s * (1 - f ) );
switch(i)
case 0: R = V; G = c; B = a;
case 1: R = b; G = v; B = a;
case 2: R = a; G = v; B = c;
case 3: R = a; G = b; B = v;
case 4: R = c; G = a; B = v;
case 5: R = v; G = a; B = b;
Unity Shader代码
//RGB转换成HSV
half3 RGBToHSV(half3 RGB)
{
half R = RGB.x, G = RGB.y, B = RGB.z;
half3 hsv;
half Max = max(R, max(G, B));
half Min = min(R, max(G, B));
if (R == Max)
{
hsv.x = (G - B) / (Max - Min);
}
if (G == Max)
{
hsv.x = 2 + (B - R) / (Max - Min);
}
if (B == Max)
{
hsv.x = 4 + (R - G) / (Max - Min);
}
hsv.x = hsv.x * 60.0;
if (hsv.x < 0)
hsv.x = hsv.x + 360;
hsv.z = Max;
hsv.y = (Max - Min) / Max;
return hsv;
}
//HSV转换成RGB
half3 HSVToRGB(half3 HSV)
{
half R, G, B;
if (HSV.y == 0)
{
R = G = B = HSV.z;
}
else
{
HSV.x = HSV.x / 60.0;
int i = (int)HSV.x;
half f = HSV.x - (half)i;
half a = HSV.z * (1 - HSV.y);
half b = HSV.z * (1 - HSV.y * f);
half c = HSV.z * (1 - HSV.y * (1 - f));
switch (i)
{
case 0: R = HSV.z; G = c; B = a;
break;
case 1: R = b; G = HSV.z; B = a;
break;
case 2: R = a; G = HSV.z; B = c;
break;
case 3: R = a; G = b; B = HSV.z;
break;
case 4: R = c; G = a; B = HSV.z;
break;
default: R = HSV.z; G = a; B = b;
break;
}
}
return half3(R, G, B);
}