From f55cd31f6fafc57becf6b55af850cc0f5950bf8f Mon Sep 17 00:00:00 2001 From: bottlefish <781230111@qq.com> Date: Thu, 23 Jul 2026 18:54:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(effects):=20=E4=B8=BA=E5=99=AA=E7=82=B9Gli?= =?UTF-8?q?tch=E5=A2=9E=E5=8A=A0=E9=80=8F=E6=98=8E=E5=8F=A0=E5=8A=A0?= =?UTF-8?q?=E5=90=88=E6=88=90=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- Assets/Materials/M_noiseScreen.mat | 1 + .../Art/诊所外/SpriteNoiseGlitch.shader | 19 ++++++++----- .../Effects/SpriteNoiseGlitchController.cs | 27 +++++++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Assets/Materials/M_noiseScreen.mat b/Assets/Materials/M_noiseScreen.mat index ef2f3d8f6..10645f8a2 100644 --- a/Assets/Materials/M_noiseScreen.mat +++ b/Assets/Materials/M_noiseScreen.mat @@ -31,6 +31,7 @@ Material: m_Floats: - _BlockSize: 28.8 - _ChromaticShift: 0.04 + - _CompositeMode: 0 - _DisplaceStrength: 0.15 - _DropoutSize: 0.058 - _FlickerStrength: 0.839 diff --git a/Assets/RawResources/Art/诊所外/SpriteNoiseGlitch.shader b/Assets/RawResources/Art/诊所外/SpriteNoiseGlitch.shader index 861a4499b..8abb21480 100644 --- a/Assets/RawResources/Art/诊所外/SpriteNoiseGlitch.shader +++ b/Assets/RawResources/Art/诊所外/SpriteNoiseGlitch.shader @@ -8,6 +8,7 @@ Shader "AibisDream/SpriteNoiseGlitch" [Header(Glitch Control)] _GlitchIntensity("Glitch Intensity", Range(0, 1)) = 0 _Speed("Animation Speed", Float) = 5.0 + [Enum(Opaque Background,0,Transparent Overlay,1)] _CompositeMode("Composite Mode", Float) = 0 [Header(Noise)] _NoiseScale("Noise Scale (lower = bigger pixel dots)", Range(40, 500)) = 80 @@ -87,6 +88,7 @@ Shader "AibisDream/SpriteNoiseGlitch" float4 _Color; float _GlitchIntensity; float _Speed; + float _CompositeMode; float _NoiseScale; float _NoiseDensity; float _NoiseBrightness; @@ -299,9 +301,11 @@ Shader "AibisDream/SpriteNoiseGlitch" half4 result; result.rgb = baseColor; - result.a = spriteAlpha; - result *= input.color; - result.a = spriteAlpha; + float overlayEnergy = max(baseColor.r, max(baseColor.g, baseColor.b)); + float overlayVisible = step(0.0001, _GlitchIntensity); + float overlayAlpha = spriteAlpha * saturate(overlayEnergy * 1.35 + intensity * 0.18) * overlayVisible; + result.a = lerp(spriteAlpha, overlayAlpha, saturate(_CompositeMode)); + result.rgb *= input.color.rgb; return result; } @@ -342,6 +346,7 @@ Shader "AibisDream/SpriteNoiseGlitch" float4 _Color; float _GlitchIntensity; float _Speed; + float _CompositeMode; float _NoiseScale; float _NoiseDensity; float _NoiseBrightness; @@ -530,9 +535,11 @@ Shader "AibisDream/SpriteNoiseGlitch" half4 result; result.rgb = baseColor; - result.a = spriteAlpha; - result *= input.color; - result.a = spriteAlpha; + float overlayEnergy = max(baseColor.r, max(baseColor.g, baseColor.b)); + float overlayVisible = step(0.0001, _GlitchIntensity); + float overlayAlpha = spriteAlpha * saturate(overlayEnergy * 1.35 + intensity * 0.18) * overlayVisible; + result.a = lerp(spriteAlpha, overlayAlpha, saturate(_CompositeMode)); + result.rgb *= input.color.rgb; return result; } diff --git a/Assets/Scripts/Effects/SpriteNoiseGlitchController.cs b/Assets/Scripts/Effects/SpriteNoiseGlitchController.cs index 7eeb9762a..52e2f4e4b 100644 --- a/Assets/Scripts/Effects/SpriteNoiseGlitchController.cs +++ b/Assets/Scripts/Effects/SpriteNoiseGlitchController.cs @@ -5,11 +5,13 @@ using System.Collections; public class SpriteNoiseGlitchController : MonoBehaviour { public enum GlitchStage { None, Light, Medium, Heavy } + public enum CompositeMode { OpaqueBackground, TransparentOverlay } [Header("Runtime")] [SerializeField] private GlitchStage _currentStage = GlitchStage.None; [SerializeField, Range(0f, 1f)] private float _intensity; [SerializeField] private float _transitionDuration = 0.5f; + [SerializeField] private CompositeMode _compositeMode = CompositeMode.OpaqueBackground; [Header("Audio (Optional)")] [Tooltip("由 Tools > Generate Glitch Noise Audio 生成")] @@ -41,6 +43,7 @@ public class SpriteNoiseGlitchController : MonoBehaviour private bool _calmFieldRequested; private static readonly int PropGlitchIntensity = Shader.PropertyToID("_GlitchIntensity"); + private static readonly int PropCompositeMode = Shader.PropertyToID("_CompositeMode"); private static readonly int PropBaseNoiseDensity = Shader.PropertyToID("_BaseNoiseDensity"); private static readonly int PropBaseNoiseScale = Shader.PropertyToID("_BaseNoiseScale"); private static readonly int PropBaseNoiseBrightness = Shader.PropertyToID("_BaseNoiseBrightness"); @@ -69,6 +72,8 @@ public class SpriteNoiseGlitchController : MonoBehaviour set => SetStage(value); } + public CompositeMode CurrentCompositeMode => _compositeMode; + private void Awake() { _renderer = GetComponent(); @@ -78,10 +83,21 @@ public class SpriteNoiseGlitchController : MonoBehaviour private void OnEnable() { ApplyIntensity(); + ApplyCompositeMode(); ApplyCalmField(); ApplyAmbientNoise(); } + /// + /// 小游戏阶段使用不透明黑底;记忆阶段使用透明叠加。透明模式下强度为 0 时 + /// Shader 不写入任何可见像素,避免黑底遮挡记忆图。 + /// + public void SetCompositeMode(CompositeMode mode) + { + _compositeMode = mode; + ApplyCompositeMode(); + } + /// /// 设置常驻细密噪点(与 glitch 强度无关,一直显示)。density 为 0 时关闭。 /// @@ -312,6 +328,16 @@ public class SpriteNoiseGlitchController : MonoBehaviour _renderer.SetPropertyBlock(_mpb); } + private void ApplyCompositeMode() + { + EnsureRuntimeObjects(); + if (_renderer == null) return; + + _renderer.GetPropertyBlock(_mpb); + _mpb.SetFloat(PropCompositeMode, (float)_compositeMode); + _renderer.SetPropertyBlock(_mpb); + } + private void ApplyCalmField() { EnsureRuntimeObjects(); @@ -374,6 +400,7 @@ public class SpriteNoiseGlitchController : MonoBehaviour EnsureRuntimeObjects(); ApplyIntensity(); + ApplyCompositeMode(); ApplyCalmField(); ApplyAmbientNoise(); }