100 lines
2.5 KiB
Plaintext
100 lines
2.5 KiB
Plaintext
|
|
Shader "GlobalSnow/DepthBlur" {
|
||
|
|
Properties {
|
||
|
|
_MainTex("Buffer (RGBA)", 2D) = "white" {}
|
||
|
|
}
|
||
|
|
|
||
|
|
SubShader {
|
||
|
|
|
||
|
|
CGINCLUDE
|
||
|
|
#include "UnityCG.cginc"
|
||
|
|
|
||
|
|
struct appdata {
|
||
|
|
float4 vertex : POSITION;
|
||
|
|
float2 texcoord : TEXCOORD0;
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
struct v2fCross {
|
||
|
|
float4 pos : SV_POSITION;
|
||
|
|
float4 uv: TEXCOORD0;
|
||
|
|
float4 uv1: TEXCOORD1;
|
||
|
|
float4 uv2: TEXCOORD2;
|
||
|
|
float4 uv3: TEXCOORD3;
|
||
|
|
float4 uv4: TEXCOORD4;
|
||
|
|
};
|
||
|
|
|
||
|
|
sampler2D _MainTex;
|
||
|
|
float4 _MainTex_TexelSize;
|
||
|
|
|
||
|
|
v2fCross vertBlurH(appdata v) {
|
||
|
|
v2fCross o;
|
||
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
||
|
|
#if UNITY_UV_STARTS_AT_TOP
|
||
|
|
if (_MainTex_TexelSize.y < 0) {
|
||
|
|
// Texture is inverted WRT the main texture
|
||
|
|
v.texcoord.y = 1.0 - v.texcoord.y;
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
o.uv = float4(v.texcoord, 0, 0);
|
||
|
|
float4 inc = float4(_MainTex_TexelSize.x * 1.3846153846, 0, 0, 0);
|
||
|
|
o.uv1 = float4(v.texcoord - inc, 0, 0);
|
||
|
|
o.uv2 = float4(v.texcoord + inc, 0, 0);
|
||
|
|
float4 inc2 = float4(_MainTex_TexelSize.x * 3.2307692308, 0, 0, 0);
|
||
|
|
o.uv3 = float4(v.texcoord - inc2, 0, 0);
|
||
|
|
o.uv4 = float4(v.texcoord + inc2, 0, 0);
|
||
|
|
return o;
|
||
|
|
}
|
||
|
|
|
||
|
|
v2fCross vertBlurV(appdata v) {
|
||
|
|
v2fCross o;
|
||
|
|
o.pos = UnityObjectToClipPos(v.vertex);
|
||
|
|
#if UNITY_UV_STARTS_AT_TOP
|
||
|
|
if (_MainTex_TexelSize.y < 0) {
|
||
|
|
// Texture is inverted WRT the main texture
|
||
|
|
v.texcoord.y = 1.0 - v.texcoord.y;
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
o.uv = float4(v.texcoord, 0, 0);
|
||
|
|
float4 inc = float4(0, _MainTex_TexelSize.y * 1.3846153846, 0, 0);
|
||
|
|
o.uv1 = float4(v.texcoord - inc, 0, 0);
|
||
|
|
o.uv2 = float4(v.texcoord + inc, 0, 0);
|
||
|
|
float4 inc2 = float4(0, _MainTex_TexelSize.y * 3.2307692308, 0, 0);
|
||
|
|
o.uv3 = float4(v.texcoord - inc2, 0, 0);
|
||
|
|
o.uv4 = float4(v.texcoord + inc2, 0, 0);
|
||
|
|
return o;
|
||
|
|
}
|
||
|
|
|
||
|
|
#define DDEPTH(uv) tex2Dlod(_MainTex,uv).r
|
||
|
|
float4 fragBlur (v2fCross i): SV_Target {
|
||
|
|
if (i.uv.x<=0.01 || i.uv.x>=0.99 || i.uv.y<=0.01 || i.uv.y>=0.99) return float4(1.0, 0.0, 0.0, 0.0);
|
||
|
|
float4 pixel0 = tex2Dlod(_MainTex, i.uv);
|
||
|
|
float4 pixel = pixel0.r * 0.2270270270
|
||
|
|
+ (DDEPTH(i.uv1) + DDEPTH(i.uv2)) * 0.3162162162
|
||
|
|
+ (DDEPTH(i.uv3) + DDEPTH(i.uv4)) * 0.0702702703;
|
||
|
|
return float4(pixel.r, pixel0.g, 0, 0);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
ENDCG
|
||
|
|
|
||
|
|
Pass { // Blur horizontally
|
||
|
|
CGPROGRAM
|
||
|
|
#pragma vertex vertBlurH
|
||
|
|
#pragma fragment fragBlur
|
||
|
|
#pragma target 3.0
|
||
|
|
ENDCG
|
||
|
|
}
|
||
|
|
|
||
|
|
Pass { // Blur vertically
|
||
|
|
CGPROGRAM
|
||
|
|
#pragma vertex vertBlurV
|
||
|
|
#pragma fragment fragBlur
|
||
|
|
#pragma target 3.0
|
||
|
|
ENDCG
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
Fallback Off
|
||
|
|
}
|