89
Assets/Shaders/glitch_analog.shader
Normal file
89
Assets/Shaders/glitch_analog.shader
Normal file
@@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user