Files
aibis-dream/Assets/Render/FrostedGlassEffect.shader
2026-03-06 16:45:02 +08:00

136 lines
4.1 KiB
Plaintext

Shader "Custom/FrostedGlass"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
[Header(Blur)]
_BlurRadius ("Blur Radius", Range(0, 20)) = 4.0
_BlurSamples ("Blur Quality", Range(4, 32)) = 16
[Header(Frost Noise)]
_FrostIntensity ("Frost Distortion", Range(0, 0.03)) = 0.005
_FrostScale ("Frost Scale", Range(10, 300)) = 100
[Header(Glass Tint)]
_GlassTint ("Glass Tint Color", Color) = (0.9, 0.95, 1.0, 1.0)
_TintStrength ("Tint Strength", Range(0, 1)) = 0.15
[Header(Adjust)]
_Brightness ("Brightness", Range(0.5, 1.5)) = 1.0
_Saturation ("Saturation", Range(0, 2)) = 0.85
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Cull Off
Lighting Off
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _MainTex_TexelSize;
fixed4 _Color;
float _BlurRadius;
float _BlurSamples;
float _FrostIntensity;
float _FrostScale;
fixed4 _GlassTint;
float _TintStrength;
float _Brightness;
float _Saturation;
float2 hash22(float2 p)
{
float3 p3 = frac(float3(p.xyx) * float3(0.1031, 0.1030, 0.0973));
p3 += dot(p3, p3.yzx + 33.33);
return frac((p3.xx + p3.yz) * p3.zy) * 2.0 - 1.0;
}
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.color = v.color * _Color;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
float2 texelSize = _MainTex_TexelSize.xy;
float2 frostNoise = hash22(i.uv * _FrostScale + _Time.y * 0.3);
float2 frostOffset = frostNoise * _FrostIntensity;
float samples = max(4.0, _BlurSamples);
float3 blurColor = float3(0, 0, 0);
float blurAlpha = 0;
float totalWeight = 0.0;
float goldenAngle = 2.39996323;
for (float s = 0; s < samples; s++)
{
float radius = sqrt((s + 0.5) / samples) * _BlurRadius;
float angle = s * goldenAngle;
float2 offset = float2(cos(angle), sin(angle)) * radius * texelSize + frostOffset;
float weight = 1.0 - (s / samples) * 0.3;
fixed4 sample = tex2D(_MainTex, i.uv + offset);
blurColor += sample.rgb * weight;
blurAlpha += sample.a * weight;
totalWeight += weight;
}
blurColor /= totalWeight;
blurAlpha /= totalWeight;
blurColor *= _Brightness;
float gray = dot(blurColor, float3(0.299, 0.587, 0.114));
blurColor = lerp(float3(gray, gray, gray), blurColor, _Saturation);
blurColor = lerp(blurColor, blurColor * _GlassTint.rgb, _TintStrength);
return fixed4(blurColor * i.color.rgb, blurAlpha * i.color.a);
}
ENDCG
}
}
Fallback "Sprites/Default"
}