Shader "BF/PostEffect/MonkeyPost" { Properties { [HideInInspector] _MainTex ("Texture", 2D) = "white" {} } CGINCLUDE #include "UnityCG.cginc" uniform sampler2D _MainTex; uniform sampler2D _Bloom; uniform float _Intensity; uniform float _Threshold; uniform float _Brightness; uniform float _Saturation; uniform float _Contrast; uniform float4 _Gamma; uniform fixed4 _ColOffset; uniform float _OffsetX; uniform float _OffsetY; //ACESToneMapping // float3 ACESToneMapping(float3 color, float adapted_lum) // { // const float A = 2.51f; // const float B = 0.03f; // const float C = 2.43f; // const float D = 0.59f; // const float E = 0.14f; // color *= adapted_lum; // return (color * (A * color + B)) / (color * (C * color + D) + E); // } struct appdata { float2 uv : TEXCOORD0; float4 vertex : POSITION; }; struct v2fDown { float2 uv : TEXCOORD0; float4 uv1 : TEXCOORD1; float4 uv2 : TEXCOORD2; float4 vertex : SV_POSITION; }; struct v2fUp { float2 uv : TEXCOORD0; float4 uv1 : TEXCOORD1; float4 uv2 : TEXCOORD2; float4 uv3 : TEXCOORD3; float4 uv4 : TEXCOORD4; float4 vertex : SV_POSITION; }; struct v2fMix { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; //确定发光范围------------------------------------------------------------------- appdata vertRange(appdata v) { appdata o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 fragRange(v2fMix i) : SV_Target { fixed4 col; col = tex2D(_MainTex, i.uv); return saturate(col - _Threshold); } //缩小采样范围,_ScreenParams------------------------------------------------------------------- v2fDown vertDown(appdata v) { v2fDown o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; o.uv1.xy = v.uv + float2(-_OffsetX, -_OffsetY); o.uv1.zw = v.uv + float2(_OffsetX, _OffsetY); o.uv2.xy = v.uv + float2(_OffsetX, -_OffsetY); o.uv2.zw = v.uv + float2(-_OffsetX, _OffsetY); return o; } fixed4 fragDown(v2fDown i) : SV_Target { fixed4 col; col = tex2D(_MainTex, i.uv) * 4; col += tex2D(_MainTex, i.uv1.xy); col += tex2D(_MainTex, i.uv1.zw); col += tex2D(_MainTex, i.uv2.xy); col += tex2D(_MainTex, i.uv2.zw); return col * 0.125; } //放大采样范围------------------------------------------------------------------- v2fUp vertUp(appdata v) { v2fUp o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; o.uv1.xy = v.uv + float2(-_OffsetX * 2, 0); o.uv1.zw = v.uv + float2(-_OffsetX, _OffsetY); o.uv2.xy = v.uv + float2(0, _OffsetY * 2); o.uv2.zw = v.uv + float2(_OffsetX, _OffsetY); o.uv3.xy = v.uv + float2(_OffsetX * 2, 0); o.uv3.zw = v.uv + float2(_OffsetX, -_OffsetY); o.uv4.xy = v.uv + float2(0, -_OffsetY * 2); o.uv4.zw = v.uv + float2(-_OffsetX, -_OffsetY); return o; } fixed4 fragUp(v2fUp i) : SV_Target { fixed4 col = 0; col += tex2D(_MainTex, i.uv1.xy); col += tex2D(_MainTex, i.uv1.zw) * 2; col += tex2D(_MainTex, i.uv2.xy); col += tex2D(_MainTex, i.uv2.zw) * 2; col += tex2D(_MainTex, i.uv3.xy); col += tex2D(_MainTex, i.uv3.zw) * 2; col += tex2D(_MainTex, i.uv4.xy); col += tex2D(_MainTex, i.uv4.zw) * 2; return col * 0.0833; } //混合------------------------------------------------------------------- v2fMix vertMix(appdata v) { v2fMix o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 fragMix(v2fMix i) : SV_Target { fixed3 col; //bloom fixed3 bloom = tex2D(_Bloom, i.uv);//采样模糊贴图 bloom *= _Intensity; col = tex2D(_MainTex, i.uv).xyz + saturate(bloom); col = lerp(fixed3(0.33, 0.33, 0.33), col, _Contrast);//对比度 col *= _Brightness;//亮度 //饱和度 fixed saturation = 0.2125 * col.r + 0.7154 * col.g + 0.0721 * col.b; col = lerp(saturation.xxx, col, _Saturation); col = pow(saturate(col), 1 / _Gamma);//Gamma return fixed4(col, 1); } ENDCG SubShader { Cull Back ZWrite Off ZTest Always Pass { CGPROGRAM #pragma vertex vertDown #pragma fragment fragDown ENDCG } Pass { CGPROGRAM #pragma vertex vertUp #pragma fragment fragUp ENDCG } Pass { CGPROGRAM #pragma vertex vertMix #pragma fragment fragMix ENDCG } Pass { CGPROGRAM #pragma vertex vertRange #pragma fragment fragRange ENDCG } } }