UnityShader:HSV(色相,饱和度,亮度)转换


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就成了黑白图了

参考 
http://blog.csdn.net/idfaya/article/details/6770414

版权声明:本文为博主原创文章,未经博主允许不得转载。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM