90 lines
3.0 KiB
Plaintext
90 lines
3.0 KiB
Plaintext
Shader "Custom/GlitchAnalog"
|
|
{
|
|
Properties
|
|
{
|
|
_MainTex ("Texture", 2D) = "white" {}
|
|
_GlitchIntensity ("Glitch Intensity", Range(0,1)) = 0.5
|
|
}
|
|
SubShader
|
|
{
|
|
Tags { "Queue"="Overlay" "RenderType"="Transparent" }
|
|
ZTest Always
|
|
ZWrite Off
|
|
Cull Off
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
Pass
|
|
{
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
#include "UnityCG.cginc"
|
|
|
|
sampler2D _MainTex;
|
|
float4 _MainTex_ST;
|
|
float _GlitchIntensity;
|
|
|
|
struct appdata {
|
|
float4 vertex : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
struct v2f {
|
|
float2 uv : TEXCOORD0;
|
|
float4 vertex : SV_POSITION;
|
|
};
|
|
v2f vert (appdata v)
|
|
{
|
|
v2f o;
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.uv = v.uv;
|
|
return o;
|
|
}
|
|
|
|
float nrand(float x, float y)
|
|
{
|
|
float2 p = float2(x, y);
|
|
float n = sin(dot(p, float2(12.9898, 78.233))) * 43758.5453;
|
|
n = frac(n);
|
|
n += frac(sin(dot(p * 2.0, float2(39.3468, 11.1351)) + _Time.y * 1.7) * 23421.631);
|
|
n += frac(sin(dot(p * 4.0, float2(73.1567, 52.2351)) - _Time.y * 2.3) * 12345.678);
|
|
return frac(n);
|
|
}
|
|
|
|
fixed4 frag (v2f i) : SV_Target
|
|
{
|
|
float2 uv = i.uv;
|
|
float4 rgba = tex2D(_MainTex, uv);
|
|
|
|
// 统一强度控制
|
|
float intensity = _GlitchIntensity;
|
|
|
|
// 色彩分离和撕裂
|
|
float chromaAmount = (0.01 + abs(sin(_Time.y * 1.3)) * 0.02) * intensity;
|
|
float tearStrength = (nrand(uv.y * 20.0 + _Time.y * 2.0, _Time.y * 1.3) - 0.5) * 0.15 * intensity;
|
|
|
|
float2 uvR = uv + float2(chromaAmount, 0) + float2(tearStrength, 0);
|
|
float2 uvG = uv + float2(0, 0) + float2(tearStrength * 0.5, 0);
|
|
float2 uvB = uv - float2(chromaAmount, 0) + float2(tearStrength, 0);
|
|
float r = tex2D(_MainTex, frac(uvR)).r;
|
|
float g = tex2D(_MainTex, frac(uvG)).g;
|
|
float b = tex2D(_MainTex, frac(uvB)).b;
|
|
float3 chromaColor = float3(r, g, b);
|
|
|
|
// 扫描线扰动
|
|
float scanJitter = (nrand(uv.y * 60.0, _Time.y * 0.5) - 0.5) * 0.2 * intensity;
|
|
float2 scanUV = uv + float2(scanJitter, 0);
|
|
float3 scanColor = tex2D(_MainTex, frac(scanUV)).rgb;
|
|
|
|
// 明暗扫描线效果
|
|
float scanLine = 0.85 + 0.15 * sin(uv.y * 800.0 + _Time.y * 10.0);
|
|
scanColor *= scanLine;
|
|
|
|
// 合成最终颜色
|
|
float3 finalColor = lerp(chromaColor, scanColor, 0.7 * intensity);
|
|
|
|
return float4(finalColor, rgba.a);
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
}
|