Shader中RGB和HSV的相互转换

    技术2022-07-13  68

    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);     }

    Processed: 0.010, SQL: 9