UnityShader "FairyGUI/Image" 增加 饱和度、对比度、亮度 设置

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "FairyGUI/Image"

{

    Properties

    {

        _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {}

        _StencilComp ("Stencil Comparison", Float) = 8

        _Stencil ("Stencil ID", Float) = 0

        _StencilOp ("Stencil Operation", Float) = 0

        _StencilWriteMask ("Stencil Write Mask", Float) = 255

        _StencilReadMask ("Stencil Read Mask", Float) = 255

        _Saturation("Saturation", Float) = 1    //调整饱和度

        _Brightness("Brightness", Float) = 1    //调整亮度

        _Contrast("Contrast", Float) = 1        //调整对比度

        _ColorMask ("Color Mask", Float) = 15

        _BlendSrcFactor ("Blend SrcFactor", Float) = 5

        _BlendDstFactor ("Blend DstFactor", Float) = 10

    }


    SubShader

    {

        LOD 100

        Tags

        {

            "Queue" = "Transparent"

            "IgnoreProjector" = "True"

            "RenderType" = "Transparent"

        }


        Stencil

        {

            Ref [_Stencil]

            Comp [_StencilComp]

            Pass [_StencilOp] 

            ReadMask [_StencilReadMask]

            WriteMask [_StencilWriteMask]

        }

        Cull Off

        Lighting Off

        ZWrite Off

        Fog { Mode Off }

        Blend [_BlendSrcFactor] [_BlendDstFactor], One One

        ColorMask [_ColorMask]

        Pass

        {

            CGPROGRAM

                #pragma multi_compile NOT_COMBINED COMBINED

                #pragma multi_compile NOT_GRAYED GRAYED COLOR_FILTER

                #pragma multi_compile NOT_CLIPPED CLIPPED SOFT_CLIPPED ALPHA_MASK

                #pragma vertex vert

                #pragma fragment frag


                #include "UnityCG.cginc"


                struct appdata_t

                {

                    float4 vertex : POSITION;

                    fixed4 color : COLOR;

                    float4 texcoord : TEXCOORD0;

                };


                struct v2f

                {

                    float4 vertex : SV_POSITION;

                    fixed4 color : COLOR;

                    float4 texcoord : TEXCOORD0;

                    #ifdef CLIPPED

                    float2 clipPos : TEXCOORD1;

                    #endif

                    #ifdef SOFT_CLIPPED

                    float2 clipPos : TEXCOORD1;

                    #endif

                };


                sampler2D _MainTex;


                #ifdef COMBINED

                sampler2D _AlphaTex;

                #endif

                #ifdef CLIPPED

                float4 _ClipBox = float4(-2, -2, 0, 0);

                #endif

                #ifdef SOFT_CLIPPED

                float4 _ClipBox = float4(-2, -2, 0, 0);

                float4 _ClipSoftness = float4(0, 0, 0, 0);

                #endif

                #ifdef COLOR_FILTER

                float4x4 _ColorMatrix;

                float4 _ColorOffset;

                float _ColorOption = 0;

                #endif

                half _Saturation;

                half _Brightness;

                half _Contrast;

                v2f vert (appdata_t v)

                {

                    v2f o;

                    o.vertex = UnityObjectToClipPos(v.vertex);

                    o.texcoord = v.texcoord;

                    #if !defined(UNITY_COLORSPACE_GAMMA) && (UNITY_VERSION >= 550)

                    o.color.rgb = GammaToLinearSpace(v.color.rgb);

                    o.color.a = v.color.a;

                    #else

                    o.color = v.color;

                    #endif

                    #ifdef CLIPPED

                    o.clipPos = mul(unity_ObjectToWorld, v.vertex).xy * _ClipBox.zw + _ClipBox.xy;

                    #endif

                    #ifdef SOFT_CLIPPED

                    o.clipPos = mul(unity_ObjectToWorld, v.vertex).xy * _ClipBox.zw + _ClipBox.xy;

                    #endif

                    return o;

                }


                fixed4 frag (v2f i) : SV_Target

                {

                    fixed4 col = tex2D(_MainTex, i.texcoord.xy / i.texcoord.w) * i.color;

                    #ifdef COMBINED

                    col.a *= tex2D(_AlphaTex, i.texcoord.xy / i.texcoord.w).g;

                    #endif

                    #ifdef GRAYED

                    fixed grey = dot(col.rgb, fixed3(0.299, 0.587, 0.114));

                    col.rgb = fixed3(grey, grey, grey);

                    #endif

                    #ifdef SOFT_CLIPPED

                    float2 factor = float2(0,0);

                    if(i.clipPos.x<0)

                        factor.x = (1.0-abs(i.clipPos.x)) * _ClipSoftness.x;

                    else

                        factor.x = (1.0-i.clipPos.x) * _ClipSoftness.z;

                    if(i.clipPos.y<0)

                        factor.y = (1.0-abs(i.clipPos.y)) * _ClipSoftness.w;

                    else

                        factor.y = (1.0-i.clipPos.y) * _ClipSoftness.y;

                    col.a *= clamp(min(factor.x, factor.y), 0.0, 1.0);

                    #endif

                    #ifdef CLIPPED

                    float2 factor = abs(i.clipPos);

                    col.a *= step(max(factor.x, factor.y), 1);

                    #endif

                    #ifdef COLOR_FILTER

                    if (_ColorOption == 0)

                    {

                        fixed4 col2 = col;

                        col2.r = dot(col, _ColorMatrix[0]) + _ColorOffset.x;

                        col2.g = dot(col, _ColorMatrix[1]) + _ColorOffset.y;

                        col2.b = dot(col, _ColorMatrix[2]) + _ColorOffset.z;

                        col2.a = dot(col, _ColorMatrix[3]) + _ColorOffset.w;

                        col = col2;

                    }

                    else //premultiply alpha

                        col.rgb *= col.a;

                    #endif

                    #ifdef ALPHA_MASK

                    clip(col.a - 0.001);

                    #endif

                    //brigtness亮度直接乘以一个系数,也就是RGB整体缩放,调整亮度

                    fixed3 finalColor = col * _Brightness;

                    //saturation饱和度:首先根据公式计算同等亮度情况下饱和度最低的值:

                    fixed gray = 0.2125 * col.r + 0.7154 * col.g + 0.0721 * col.b;

                    fixed3 grayColor = fixed3(gray, gray, gray);

                    finalColor = lerp(grayColor, finalColor, _Saturation);

                    //contrast对比度:首先计算对比度最低的值

                    fixed3 avgColor = fixed3(0.5, 0.5, 0.5);

                    //根据Contrast在对比度最低的图像和原图之间差值

                    finalColor = lerp(avgColor, finalColor, _Contrast);

                    return fixed4(finalColor, col.a);

                }

            ENDCG

        }

    }

}

你可能感兴趣的:(UnityShader "FairyGUI/Image" 增加 饱和度、对比度、亮度 设置)