136 lines
4.1 KiB
Plaintext
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"
|
|
}
|