195 lines
5.2 KiB
Plaintext
195 lines
5.2 KiB
Plaintext
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
|
|
}
|
|
}
|
|
} |