前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity中的Shader(HSV,RGB转换)

Unity中的Shader(HSV,RGB转换)

作者头像
bering
发布2019-12-02 13:51:32
1.8K0
发布2019-12-02 13:51:32
举报
文章被收录于专栏:游戏开发之旅

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/CJB_King/article/details/79275461

代码语言:javascript
复制
//RGB转换:http://www.easyrgb.com/en/math.php#text22
Shader "HSVShader/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/255,G = rgb.y/255,B = rgb.z/255;
            float3 hsv;
            float max1=max(R,max(G,B));
            float min1=min(R,min(G,B));
			float del_max = max1 - min1;
			hsv.z = max1;
			if (del_max == 0)
			{
				hsv.x = 0;
				hsv.y = 0;
			}
			else
			{
				hsv.y = del_max / max1;
				float del_R = (((max1 - R) / 6) + (del_max / 2)) / del_max;
				float del_G = (((max1 - G) / 6) + (del_max / 2)) / del_max;
				float del_B = (((max1 - B) / 6) + (del_max / 2)) / del_max;
				if (R == max1)hsv.x = del_B - del_G;
				else if (G == max1)hsv.x = (1 / 3) + del_R - del_B;
				else if (B == max1)hsv.x = (2 / 3) + del_G - del_R;
				if (hsv.x < 0)hsv.x += 1;
				if (hsv.x > 1)hsv.x -= 1;
			}
            /*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;*/
				R = hsv.z * 255;
				G = hsv.z * 255;
				B = hsv.z * 255;
            }
			else
			{
				float var_r, var_g, var_b;
				float var_h = hsv.x * 6;
				if (var_h == 6)var_h = 0;
				int var_i = (int)var_h;//把var_h转化为整数var_i;
				float var_1 = hsv.z*(1 - hsv.y);
				float var_2 = hsv.z*(1 - hsv.y*(var_h - var_i));
				float var_3 = hsv.z*(1 - hsv.y*(1 - (var_h - var_i)));
				if (var_i == 0) { var_r = hsv.z; var_g = var_3; var_b = var_1; }
				else if (var_i == 1) { var_r = var_2; var_g = hsv.z; var_b = var_1; }
				else if (var_i == 2) { var_r = var_1; var_g = hsv.z; var_b = var_3; }
				else if (var_i == 3) { var_r = var_1; var_g = var_2; var_b = hsv.z; }
				else if (var_i == 4) { var_r = var_3; var_g = var_1; var_b = hsv.z; }
				else { var_r = hsv.z; var_g = var_1; var_b = var_2; }

				R = var_r * 255;
				G = var_g * 255;
				B = var_b * 255;
			}
            /*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"
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/02/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档