mmorpg2d/Assets/UI/UIBlur/Materials/UIBlur.cginc
2025-01-06 19:41:29 +05:30

102 lines
2.2 KiB
HLSL

#ifndef UI_BLUR_CGINC
#define UI_BLUR_CGINC
#include "UnityCG.cginc"
// Pixel size.
static const float2 ps = _ScreenParams.zw - 1.0;
// Parameters.
sampler2D _MainTex;
float _Opacity, _Size;
// Functions.
// Creates a linear blur from a projected texture.
// The blur is made centered, so the direction is always absolute.
// sp - Texture sampler.
// uv - Texture coordinates.
// dir - Blur direction vector.
float4 linear_blur(sampler2D sp, float4 uv, float2 dir) {
static const int samples = 9;
float4 color = 0.0;
// Move coordinates in opposite direction to center the sampling.
uv = UNITY_PROJ_COORD(float4(
uv.x - dir.x * samples * 0.5,
uv.y - dir.y * samples * 0.5,
uv.z,
uv.w
));
[unroll]
for (int i = 0; i < samples; ++i) {
uv = UNITY_PROJ_COORD(float4(
uv.x + dir.x,
uv.y + dir.y,
uv.z,
uv.w
));
color += tex2Dproj(sp, uv);
}
return color / samples;
}
// Vertex shaders.
void VS_Quad(
float4 v : POSITION,
out float4 p : SV_POSITION,
inout float2 uv : TEXCOORD
) {
p = UnityObjectToClipPos(v);
}
void VS_QuadProj(
float4 v : POSITION,
out float4 p : SV_POSITION,
inout float2 uv1 : TEXCOORD0,
out float4 uv2 : TEXCOORD1
) {
VS_Quad(v, p, uv1);
uv2 = ComputeGrabScreenPos(p);
}
void VS_QuadProjColor(
float4 v : POSITION,
out float4 p : SV_POSITION,
inout float2 uv1 : TEXCOORD0,
out float4 uv2 : texcoord2,
inout float4 img_color : COLOR
) {
VS_QuadProj(v, p, uv1, uv2);
}
// Pixel shader functions (for changing the grab pass texture).
float4 blur_x(float2 img_uv, float4 grab_uv, sampler2D grab_tex) {
float2 dir = float2(ps.x * _Size, 0.0);
float4 blur = linear_blur(grab_tex, grab_uv, dir);
blur.a = 1.0;
float4 color = tex2D(_MainTex, img_uv);
return blur * color.a;
}
float4 blur_y(float2 img_uv, float4 grab_uv, float4 img_color, sampler2D grab_tex) {
float2 dir = float2(0.0, ps.y * _Size);
float4 blur = linear_blur(grab_tex, grab_uv, dir);
blur.a = 1.0;
float4 color = tex2D(_MainTex, img_uv) * img_color;
color = lerp(blur * color.a, color, _Opacity);
return color;
}
#endif