Files
ichni_Creator_Studio/Assets/Shaders/glitch_analog.shader
TRAfoer 25a458dd8c 我不明白
Signed-off-by: TRAfoer <lhf190@outlook.com>
2025-09-24 14:58:15 +08:00

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