效果如下:
代码如下:
1 float3 RGBToHSV(float3 rgb) 2 { 3 float R = rgb.x; 4 float G = rgb.y; 5 float B = rgb.z; 6 float3 hsv; 7 float max1 = max(R, max(G, B)); 8 float min1 = min(R, min(G, B)); 9 10 if (R == max1) 11 { 12 hsv.x = (G - B) / (max1 - min1); 13 } 14 if (G == max1) 15 { 16 hsv.x = 2.0 + (B - R) / (max1 - min1); 17 } 18 if (B == max1) 19 { 20 hsv.x = 4.0 + (R - G) / (max1 - min1); 21 } 22 23 hsv.x = hsv.x * 60.0; 24 if (hsv.x < 0.0) 25 { 26 hsv.x = hsv.x + 360.0; 27 } 28 hsv.z = max1; 29 hsv.y = (max1 - min1) / max1; 30 return hsv; 31 } 32 33 float3 HSVToRGB(float3 hsv) 34 { 35 float R; 36 float G; 37 float B; 38 if (hsv.y == 0.0) 39 { 40 R = G = B = hsv.z; 41 return float3(R, G, B); 42 } 43 44 hsv.x = hsv.x / 60.0; 45 int i = int(hsv.x); 46 float f = hsv.x - float(i); 47 float a = hsv.z * (1.0 - hsv.y); 48 float b = hsv.z * (1.0 - hsv.y * f); 49 float c = hsv.z * (1.0 - hsv.y * (1.0 - f)); 50 if (i == 0) 51 { 52 R = hsv.z; 53 G = c; 54 B = a; 55 } 56 else if (i == 1) 57 { 58 R = b; 59 G = hsv.z; 60 B = a; 61 } 62 else if (i == 2) 63 { 64 R = a; 65 G = hsv.z; 66 B = c; 67 } 68 else if (i == 3) 69 { 70 R = a; 71 G = b; 72 B = hsv.z; 73 } 74 else if (i == 4) 75 { 76 R = c; 77 G = a; 78 B = hsv.z; 79 } 80 else 81 { 82 R = hsv.z; 83 G = a; 84 B = b; 85 } 86 return float3(R, G, B); 87 } 88 89 // 根据色相,饱和度,明度,计算染色颜色 90 half3 ComputeDyeColor(half4 c, half4 dyeValue) 91 { 92 float3 hsv = RGBToHSV(c.rgb); 93 hsv.x += dyeValue.x; 94 hsv.x = hsv.x % 360; 95 hsv.y *= dyeValue.y; 96 hsv.z *= dyeValue.z; 97 return HSVToRGB(hsv); 98 }
转载请注明出处:https://www.cnblogs.com/jietian331/p/14379175.html
参考地址:http://imgtec.eetrend.com/d6-imgtec/blog/2016-05/7968.html