ToriaAssets/Sources/Shaders/DepthBlur.shader
2026-05-19 12:20:15 +02:00

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
}