http://blog.csdn.net/costfine/article/details/46930473
發現其實美術調整顏色的時候大部分都是調整的HSV,因為可以方便的分別調整色相(hue)、飽和度(saturation)和色調(value)。例如人們要將顏色調整的偏紅一點,那么只需要修改色相, 如果使用RGB的話,就需要同時調整3個值,僅僅只是增加R值的話,理論上講,只是把紅色值加重了而已。就算是平時使用的調色板,大部分也是按照HSV來的,例如U3D的調色板: 
顏色空間有很多中,RGB、HSL、HSV、CMYK...等等好多,如果有興趣的話可以去搜搜。但我們這里只用HSV 。
比如一張貼圖是紅色系的,我們要改成綠色系,只需要將hue值偏移到綠色值就好了。
各種顏色空間轉換的公式:
http://www.easyrgb.com/index.php?X=MATH&H=22#text22
方法我們知道了,公式也有了,下面直接寫代碼。
Shader "Tornado/ColorGradation_HSV" { Properties { //貼圖 _MainTex ("MainTex (RGB)", 2D) = "white" {} //Hue的值范圍為0-359. 其他兩個為0-1 ,這里我們設置到3,因為乘以3后 都不一定能到超過. _Hue ("Hue", Range(0,359)) = 0 _Saturation ("Saturation", Range(0,3.0)) = 1.0 _Value ("Value", Range(0,3.0)) = 1.0 } SubShader { Pass { Tags { "RenderType"="Opaque" } LOD 200 Lighting Off CGPROGRAM #pragma vertex vert_img #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; half _Hue; half _Saturation; half _Value; struct Input { float2 uv_MainTex; }; //RGB to HSV float3 RGBConvertToHSV(float3 rgb) { float R = rgb.x,G = rgb.y,B = rgb.z; float3 hsv; float max1=max(R,max(G,B)); float min1=min(R,min(G,B)); if (R == max1) { hsv.x = (G-B)/(max1-min1); } if (G == max1) { hsv.x = 2 + (B-R)/(max1-min1); } if (B == max1) { hsv.x = 4 + (R-G)/(max1-min1); } hsv.x = hsv.x * 60.0; if (hsv.x < 0) hsv.x = hsv.x + 360; hsv.z=max1; hsv.y=(max1-min1)/max1; return hsv; } //HSV to RGB float3 HSVConvertToRGB(float3 hsv) { float R,G,B; //float3 rgb; if( hsv.y == 0 ) { R=G=B=hsv.z; } else { hsv.x = hsv.x/60.0; int i = (int)hsv.x; float f = hsv.x - (float)i; float a = hsv.z * ( 1 - hsv.y ); float b = hsv.z * ( 1 - hsv.y * f ); float 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 float3(R,G,B); } fixed4 frag (v2f_img i) : SV_Target { fixed4 original = tex2D(_MainTex, i.uv); //獲取貼圖原始顏色 float3 colorHSV; colorHSV.xyz = RGBConvertToHSV(original.xyz); //轉換為HSV colorHSV.x += _Hue; //調整偏移Hue值 colorHSV.x = colorHSV.x%360; //超過360的值從0開始 colorHSV.y *= _Saturation; //調整飽和度 colorHSV.z *= _Value; original.xyz = HSVConvertToRGB(colorHSV.xyz); //將調整后的HSV,轉換為RGB顏色 return original; } ENDCG } } FallBack "Diffuse" }原圖和調整Hue后的對比,像不像以前玩格斗游戲,兩個玩家選同一個角色,然后2P變色的效果…

同樣的也可以應用到攝像機特效上….瞬間改變場景的氛圍 
當然還可以調整飽和度和亮度。。。飽和度調整到0就成了黑白圖了
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
