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" }