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" }