亮度&对比度&饱和度

作者:追风剑情 发布于:2022-1-7 17:45 分类:Shader

Shader "Custom/Unlit/Texture" {
    Properties{
        _MainTex("Base (RGB)", 2D) = "white" {}
        //亮度值
        _Brightness("Brightness", float) = 20
        //对比度
        _Contrast("Contrast", float) = 1.18
        //饱和度
        _Saturation("Saturation", float) = 1
    }

    SubShader{
        Tags { "RenderType" = "Opaque" }
        LOD 100

        Pass {
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma target 2.0
                #pragma multi_compile_fog

                #include "UnityCG.cginc"

                struct appdata_t {
                    float4 vertex : POSITION;
                    float2 texcoord : TEXCOORD0;
                    UNITY_VERTEX_INPUT_INSTANCE_ID
                };

                struct v2f {
                    float4 vertex : SV_POSITION;
                    float2 texcoord : TEXCOORD0;
                    UNITY_FOG_COORDS(1)
                    UNITY_VERTEX_OUTPUT_STEREO
                };

                sampler2D _MainTex;
                float4 _MainTex_ST;
                float _Brightness;
                float _Contrast;
                float _Saturation;

                //计算像素亮度值
                float Luminance(float3 color)
                {
                    return dot(color, float3(0.2125, 0.7154, 0.0721));
                }

                //提亮暗部区域
                float3 Brightness(float3 col)
                {
                    //此公式: 使图像暗部变化强,亮部变化弱
                    //col.r = log(col.r * _Brightness);
                    //col.g = log(col.g * _Brightness);
                    //col.b = log(col.b * _Brightness);

                    //此公式: 使图像两端变化弱,中间变化强
                    col.r = log(col.r * (_Brightness - 1) + 1) / log(_Brightness);
                    col.g = log(col.g * (_Brightness - 1) + 1) / log(_Brightness);
                    col.b = log(col.b * (_Brightness - 1) + 1) / log(_Brightness);
                    return col;
                }

                v2f vert(appdata_t v)
                {
                    v2f o;
                    UNITY_SETUP_INSTANCE_ID(v);
                    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                    UNITY_TRANSFER_FOG(o,o.vertex);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                    fixed4 col = tex2D(_MainTex, i.texcoord);
                    UNITY_APPLY_FOG(i.fogCoord, col);
                    UNITY_OPAQUE_ALPHA(col.a);

                    fixed3 rgb = col.rgb;
                    //该像素对应的亮度值
                    fixed luminance = Luminance(rgb);
                    //使用该亮度值创建一个饱和度为0的颜色
                    fixed3 luminanceColor = fixed3(luminance, luminance, luminance);
                    //创建一个对比度度为0的颜色
                    fixed3 avgColor = fixed3(0.5, 0.5, 0.5);

                    //调整饱和度
                    rgb = lerp(luminanceColor, rgb, _Saturation);
                    //调整对比度
                    rgb = lerp(avgColor, rgb, _Contrast);
                    //调整亮度
                    rgb = Brightness(rgb);

                    return fixed4(rgb, col.a);
                }
            ENDCG
        }
    }
	FallBack "Diffuse"
}

标签: Shader

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号