381 lines
18 KiB
Plaintext
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
|
|
}
|
|
}
|
|
} |