Files
ichni_Official/Assets/Shaders/ScriptablePostProcessor/Volumes/Sharpen.cs

48 lines
2.2 KiB
C#
Raw Normal View History

2026-03-14 03:13:10 -04:00
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;
}
}