zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    西门子SCL读写DB数据
    LeetCode8.字符串转换整数(atoi) JavaScript
    LeetCode8.字符串转换整数(atoi) JavaScript
    WebRequestSugar
    iosblock用法
    datasci
    UINavigationController学习笔记
    iOSTab bar
    自定义tab bar控件 学习资料
    Ios tab Bar 使用方法
  • 原文地址:https://www.cnblogs.com/lilei9110/p/4682613.html
Copyright © 2011-2022 走看看