Files
Cielonos/Assets/Plugins/FlexibleUI/FlexibleBlur/Shaders/Blurs.shader
SoulliesOfficial 649b7a5ddc 更新
2026-05-23 08:27:50 -04:00

381 lines
18 KiB
Plaintext

Shader "Hidden/JeffGrawAssets/Blurs" {
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
half4 positionHCS : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
half4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_OUTPUT_STEREO
};
v2f vert(Attributes input)
{
v2f output;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
output.positionCS = float4(input.positionHCS.xyz, 1);
#if UNITY_UV_STARTS_AT_TOP
output.positionCS.y *= -1;
#endif
output.uv = input.uv;
return output;
}
TEXTURE2D_X(_MainTex);
#if UNITY_VERSION < 600000
SAMPLER(sampler_LinearClamp);
#endif
half4 _DestTex_TexelSize;
half _BlurSampleDistance;
half _SampleOffset;
bool _OffsetCenter;
int _BlurIteration;
ENDHLSL
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"}
Cull Off
ZWrite Off
ZTest Always
Pass
{
Name "3-Tap"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const float2 texelIndex = floor(i.positionCS.xy);
const float checker = 1 - 2 * fmod(floor(0.5 * _BlurIteration) + texelIndex.x + texelIndex.y, 2);
const half orientation = fmod(_BlurIteration, 2);
const half invOrientation = 1.0h - orientation;
const half horOffset = _DestTex_TexelSize.x * _BlurSampleDistance;
const half vertOffset = _DestTex_TexelSize.y * _BlurSampleDistance;
const half2 offset1 = half2(
checker * (0.5h * _DestTex_TexelSize.x * invOrientation + horOffset * orientation),
checker * (vertOffset * invOrientation + 0.5h * _DestTex_TexelSize.y * orientation)
);
const half2 offset2 = half2(
lerp(horOffset, -horOffset * checker, orientation),
lerp(-vertOffset * checker, vertOffset, orientation)
);
const half2 offset3 = half2(
lerp(-horOffset, -horOffset * checker, orientation),
lerp(-vertOffset * checker, -vertOffset, orientation)
);
return 0.334h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + offset1)
+ 0.333h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + offset2)
+ 0.333h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + offset3);
}
ENDHLSL
}
Pass
{
Name "4-Tap Corners"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half2 sampleDist = _DestTex_TexelSize.xy * _BlurSampleDistance;
const half4 color = 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, sampleDist.y))
+ 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, sampleDist.y))
+ 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, -sampleDist.y))
+ 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, -sampleDist.y));
return color;
}
ENDHLSL
}
Pass
{
Name "4-Tap Cross"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half2 sampleDist = _DestTex_TexelSize.xy * _BlurSampleDistance;
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
const half4 color = 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, halfTexelOffset.y))
+ 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, halfTexelOffset.y))
+ 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( halfTexelOffset.x, sampleDist.y))
+ 0.25h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( halfTexelOffset.x, -sampleDist.y));
return color;
}
ENDHLSL
}
Pass
{
Name "5-Tap Star"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half2 sampleDist = _DestTex_TexelSize.xy * _BlurSampleDistance;
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
const half4 color = 0.5h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + halfTexelOffset * _OffsetCenter)
+ 0.125h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, sampleDist.y))
+ 0.125h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, sampleDist.y))
+ 0.125h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, -sampleDist.y))
+ 0.125h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, -sampleDist.y));
return color;
}
ENDHLSL
}
Pass
{
Name "7-Tap Hexagonal"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half sampleDistanceX = _DestTex_TexelSize.x * _BlurSampleDistance * 0.57735024648h;
const half sampleDistanceY = _DestTex_TexelSize.y * _BlurSampleDistance;
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
half4 color = 0.28h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + halfTexelOffset * _OffsetCenter)
+ 0.12h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDistanceX * 2, halfTexelOffset.y))
+ 0.12h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDistanceX * 2, halfTexelOffset.y))
+ 0.12h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDistanceX, sampleDistanceY))
+ 0.12h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDistanceX, -sampleDistanceY))
+ 0.12h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDistanceX, sampleDistanceY))
+ 0.12h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDistanceX, -sampleDistanceY));
return color;
}
ENDHLSL
}
Pass
{
Name "8-Tap Corners and Cross"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half2 sampleDist = _DestTex_TexelSize.xy * _BlurSampleDistance;
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
const half4 color = 0.165h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, sampleDist.y))
+ 0.165h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, sampleDist.y))
+ 0.165h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, -sampleDist.y))
+ 0.165h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, -sampleDist.y))
+ 0.085h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( halfTexelOffset.x, sampleDist.y * 2))
+ 0.085h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( halfTexelOffset.x, -sampleDist.y * 2))
+ 0.085h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x * 2, halfTexelOffset.y))
+ 0.085h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x * 2, halfTexelOffset.y));
return color;
}
ENDHLSL
}
Pass
{
Name "9-Tap Octagonal"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half2 sampleDist = _DestTex_TexelSize.xy * _BlurSampleDistance;
const half2 sampleDist2 = sampleDist * 1.414427h;
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
half4 color = 0.2h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + halfTexelOffset * _OffsetCenter)
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist2.x, halfTexelOffset.y))
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist2.x, halfTexelOffset.y))
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( halfTexelOffset.x, sampleDist2.y))
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( halfTexelOffset.x, -sampleDist2.y))
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, sampleDist.y))
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, sampleDist.y))
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDist.x, -sampleDist.y))
+ 0.1h * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDist.x, -sampleDist.y));
return color;
}
ENDHLSL
}
Pass
{
Name "Quadratic Horizontal"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform uint _TapsPerSideHor;
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
const half sampleDistanceX = _DestTex_TexelSize.x * _BlurSampleDistance;
half4 color = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + halfTexelOffset * _OffsetCenter);
half totalWeight = 1.h;
for (uint slot = 1; slot <= _TapsPerSideHor; slot++)
{
const half t = 1 - slot / (_TapsPerSideHor + 1.);
const half weight = t * t;
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDistanceX * slot, halfTexelOffset.y));
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDistanceX * slot, halfTexelOffset.y));
totalWeight += 2 * weight;
}
color /= totalWeight;
return color;
}
ENDHLSL
}
Pass
{
Name "Quadratic Vertical"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform uint _TapsPerSideVert;
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
const half sampleDistanceY = _DestTex_TexelSize.y * _BlurSampleDistance;
half4 color = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + halfTexelOffset * _OffsetCenter);
half totalWeight = 1.h;
for (uint slot = 1; slot <= _TapsPerSideVert; slot++)
{
const half t = 1 - slot / (_TapsPerSideVert + 1.);
const half weight = t * t;
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(halfTexelOffset.x, sampleDistanceY * slot));
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(halfTexelOffset.x, -sampleDistanceY * slot));
totalWeight += 2 * weight;
}
color /= totalWeight;
return color;
}
ENDHLSL
}
Pass
{
Name "Gaussian Horizontal"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform uint _TapsPerSideHor;
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half lowTapAdjust = 0.8h * max(0, 6 - _TapsPerSideHor * 0.2h);
const half sigma = (lowTapAdjust + _TapsPerSideHor) * 2 / 6.;
const half weightExpDivisor = -2 * sigma * sigma;
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
const half sampleDistanceX = _DestTex_TexelSize.x * _BlurSampleDistance;
half4 color = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + halfTexelOffset * _OffsetCenter);
half totalWeight = 1.h;
for (uint slot = 1; slot <= _TapsPerSideHor; slot++)
{
const half weight = exp(slot * slot / weightExpDivisor);
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2( sampleDistanceX * slot, halfTexelOffset.y));
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(-sampleDistanceX * slot, halfTexelOffset.y));
totalWeight += 2 * weight;
}
color /= totalWeight;
return color;
}
ENDHLSL
}
Pass
{
Name "Gaussian Vertical"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform uint _TapsPerSideVert;
half4 frag(v2f i) : SV_Target
{
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
const half lowTapAdjust = 0.8h * max(0, 6 - _TapsPerSideVert * 0.2h);
const half sigma = (lowTapAdjust + _TapsPerSideVert) * 2 / 6.;
const half weightExpDivisor = -2 * sigma * sigma;
const half2 halfTexelOffset = _DestTex_TexelSize.xy * _SampleOffset;
const half sampleDistanceY = _DestTex_TexelSize.y * _BlurSampleDistance;
half4 color = SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + halfTexelOffset * _OffsetCenter);
half totalWeight = 1.h;
for (uint slot = 1; slot <= _TapsPerSideVert; slot++)
{
const half weight = exp(slot * slot / weightExpDivisor);
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(halfTexelOffset.x, sampleDistanceY * slot));
color += weight * SAMPLE_TEXTURE2D_X(_MainTex, sampler_LinearClamp, i.uv + half2(halfTexelOffset.x, -sampleDistanceY * slot));
totalWeight += 2 * weight;
}
color /= totalWeight;
return color;
}
ENDHLSL
}
}
}