using Echovoid.Runtime.Behavior.Rendering; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; namespace SLSUtilities.Rendering.PostProcessing { [System.Serializable, VolumeComponentMenu("SLS/Postprocessing/Sharpen")] public class Sharpen : ScriptablePostProcessorVolume { // 放在所有后处理之后,对最终画面进行锐化 public override CustomPostProcessInjectionPoint InjectionPoint => CustomPostProcessInjectionPoint.AfterPostProcess; // 排序靠后,确保是最后几步操作之一 public override int OrderInInjectionPoint => 10; [Header("General Settings")] [Tooltip("锐化强度。值越大画面越锋利。建议范围 0.5 - 2.0。过大会导致失真。")] public ClampedFloatParameter sharpness = new(0f, 0f, 5f); [Header("Optimizations (Visual Quality)")] [Tooltip("对比度阈值(降噪)。\n只有当像素差异大于此值时才锐化。\n增加此值可避免平坦区域(如天空、皮肤)出现噪点。\n建议值:0.01 - 0.05。")] public ClampedFloatParameter threshold = new(0.01f, 0f, 0.2f); [Tooltip("最大亮度钳制(防光晕)。\n限制像素亮度的最大变化幅度,防止边缘出现刺眼的白边或黑边。\n减小此值可让锐化更自然。\n建议值:0.1 - 0.3。")] public ClampedFloatParameter clamp = new(0.2f, 0f, 1f); public override string GetShaderName() => "SLS/Postprocessing/Sharpen"; public override void Render(CommandBuffer cmd, ref RenderingData renderingData, RTHandle source, RTHandle destination) { if (material == null) return; Vector4 paramsVec = new Vector4( sharpness.value, threshold.value, clamp.value, 0 // unused ); material.SetVector(InternalShaderHelpers.ID._SharpnessParams, paramsVec); Blitter.BlitCameraTexture(cmd, source, destination, material, 0); } // 只有强度大于 0 时才激活 public override bool IsActive() => sharpness.value > 0f; } }