源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

140 lines
4.7 KiB

Shader "Unlit/DualBlur"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Offset("BlurOffset", float) = 1
}
SubShader
{
CGINCLUDE
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform half _Offset;
float4 _MainTex_TexelSize;
struct a2f_default
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
// 降采样 顶-片结构体
struct v2f_downSample
{
float4 vertex : SV_POSITION;
float2 texcoord: TEXCOORD0;
float2 uv: TEXCOORD1;
float4 uv01: TEXCOORD2;
float4 uv23: TEXCOORD3;
};
// 升采样 顶-片结构体
struct v2f_upSample
{
float4 vertex: SV_POSITION;
float2 texcoord: TEXCOORD0;
float4 uv01: TEXCOORD1;
float4 uv23: TEXCOORD2;
float4 uv45: TEXCOORD3;
float4 uv67: TEXCOORD4;
};
v2f_downSample VertDownSample(a2f_default v)
{
v2f_downSample o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = v.uv;
#if UNITY_UV_STARTS_AT_TOP
o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
#endif
float2 uv = TRANSFORM_TEX(o.texcoord, _MainTex);
_MainTex_TexelSize *= 0.5;
o.uv = uv;
o.uv01.xy = uv - _MainTex_TexelSize * float2(1 + _Offset, 1 + _Offset);//top right
o.uv01.zw = uv + _MainTex_TexelSize * float2(1 + _Offset, 1 + _Offset);//bottom left
o.uv23.xy = uv - float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * float2(1 + _Offset, 1 + _Offset);//top left
o.uv23.zw = uv + float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * float2(1 + _Offset, 1 + _Offset);//bottom right
return o;
}
half4 FragDownSample(v2f_downSample i): SV_Target
{
half4 sum = tex2D(_MainTex, i.uv) * 4;
sum += tex2D(_MainTex, i.uv01.xy);
sum += tex2D(_MainTex, i.uv01.zw);
sum += tex2D(_MainTex, i.uv23.xy);
sum += tex2D(_MainTex, i.uv23.zw);
return half4(sum.rgb * 0.125, 1.0);
}
v2f_upSample VertUpSample(a2f_default v)
{
v2f_upSample o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = v.uv;
#if UNITY_UV_STARTS_AT_TOP
o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
#endif
float2 uv = TRANSFORM_TEX(o.texcoord, _MainTex);
_MainTex_TexelSize *= 0.5;
_Offset = float2(1 + _Offset, 1 + _Offset);
o.uv01.xy = uv + float2(-_MainTex_TexelSize.x * 2, 0) * _Offset;
o.uv01.zw = uv + float2(-_MainTex_TexelSize.x, _MainTex_TexelSize.y) * _Offset;
o.uv23.xy = uv + float2(0, _MainTex_TexelSize.y * 2) * _Offset;
o.uv23.zw = uv + _MainTex_TexelSize * _Offset;
o.uv45.xy = uv + float2(_MainTex_TexelSize.x * 2, 0) * _Offset;
o.uv45.zw = uv + float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _Offset;
o.uv67.xy = uv + float2(0, -_MainTex_TexelSize.y * 2) * _Offset;
o.uv67.zw = uv - _MainTex_TexelSize * _Offset;
return o;
}
half4 FragUpSample(v2f_upSample i): SV_Target
{
half4 sum = 0;
sum += tex2D(_MainTex, i.uv01.xy);
sum += tex2D(_MainTex, i.uv01.zw) * 2;
sum += tex2D(_MainTex, i.uv23.xy);
sum += tex2D(_MainTex, i.uv23.zw) * 2;
sum += tex2D(_MainTex, i.uv45.xy);
sum += tex2D(_MainTex, i.uv45.zw) * 2;
sum += tex2D(_MainTex, i.uv67.xy);
sum += tex2D(_MainTex, i.uv67.zw) * 2;
return half4(sum.rgb * 0.0833, 1.0);
}
ENDCG
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex VertDownSample
#pragma fragment FragDownSample
// #pragma enable_d3d11_debug_symbols
ENDCG
}
Pass
{
CGPROGRAM
#pragma vertex VertUpSample
#pragma fragment FragUpSample
// #pragma enable_d3d11_debug_symbols
ENDCG
}
}
}