c1_unity/Assets/arts/shaders/post_effect/monkey_post.shader
2023-04-03 11:04:31 +08:00

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