Files
2026-05-26 16:15:54 +08:00

75 lines
2.5 KiB
Plaintext

Shader "zzwater/FSBlur"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DepthThreshold ("Depth Threshold", Range(0, 200)) = 50
//_BlurRadius ("Blur Radius", Range(1, 10)) = 3
}
SubShader
{
Tags { "RenderType"="Opaque" "RenderPipeline" = "UniversalPipeline"}
LOD 100
ZWrite Off Cull Off
Pass
{
Name "FSBlur"
HLSLPROGRAM
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// The Blit.hlsl file provides the vertex shader (Vert),
// the input structure (Attributes) and the output structure (Varyings)
#include "Packages/com.unity.render-pipelines.core/Runtime/Utilities/Blit.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl"
#pragma vertex Vert
#pragma fragment frag
float _DepthThreshold;
SAMPLER(sampler_BlitTexture);
float4 _BlitTexture_TexelSize;
half4 frag (Varyings input) : SV_Target
{
// Sample depth
float deviceDepth = SampleSceneDepth(input.texcoord);
float linearDepth = LinearEyeDepth(deviceDepth, _ZBufferParams);
float _BlurRadius = 5;
// Original color
half4 originalColor = SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, input.texcoord);
// If depth is less than threshold, return original color
if (linearDepth < _DepthThreshold)
return originalColor;
// Simple box blur (much faster than Gaussian)
half4 blurredColor = half4(0, 0, 0, 0);
int samples = 0;
// Use fixed radius for simplicity
for (int x = -_BlurRadius; x <= _BlurRadius; x++)
{
for (int y = -_BlurRadius; y <= _BlurRadius; y++)
{
float2 offset = float2(x, y) * _BlitTexture_TexelSize;
blurredColor += SAMPLE_TEXTURE2D(_BlitTexture, sampler_BlitTexture, input.texcoord + offset);
samples++;
}
}
// Average the samples
return blurredColor / samples;
}
ENDHLSL
}
}
}