76 lines
3.3 KiB
C#
76 lines
3.3 KiB
C#
using Echovoid.Runtime.Behavior.Rendering;
|
||
using UnityEngine;
|
||
using UnityEngine.Rendering;
|
||
using UnityEngine.Rendering.Universal;
|
||
|
||
namespace SLSUtilities.Rendering.PostProcessing
|
||
{
|
||
[System.Serializable, VolumeComponentMenu("SLS/Postprocessing/Strobe Flash")]
|
||
public class StrobeFlash : ScriptablePostProcessorVolume
|
||
{
|
||
public override CustomPostProcessInjectionPoint InjectionPoint => CustomPostProcessInjectionPoint.BeforePostProcess;
|
||
public override int OrderInInjectionPoint => 5;
|
||
|
||
[Header("Master Switch")]
|
||
public BoolParameter enableEffect = new(false);
|
||
|
||
[Header("Binary Colors")]
|
||
public ColorParameter colorHigh = new(Color.white);
|
||
public ColorParameter colorLow = new(Color.black);
|
||
|
||
[Header("Threshold & Flash")]
|
||
public ClampedFloatParameter grading = new(0.5f, 0f, 1f);
|
||
public BoolParameter autoFlash = new(false);
|
||
public FloatParameter frequency = new(15f);
|
||
public BoolParameter manualInvert = new(false);
|
||
|
||
[Header("Optimizations (Art Style)")]
|
||
[Tooltip("预模糊:消除地面的细碎噪点。")]
|
||
public ClampedFloatParameter noiseReduction = new(1.5f, 0f, 5f);
|
||
|
||
[Tooltip("柔化边缘:让黑白交界处不那么生硬。")]
|
||
public ClampedFloatParameter softness = new(0.05f, 0f, 0.5f);
|
||
|
||
[Header("Outline Settings")]
|
||
[Tooltip("描边粗细:建议值 1.0 - 2.0。如果太小可能看不见。")]
|
||
public ClampedFloatParameter outlineThickness = new(1f, 0f, 5f);
|
||
|
||
[Tooltip("描边敏感度阈值 (米):深度差超过此值才画线。\n解决地面全黑的关键参数!\n建议值:0.5 - 2.0。")]
|
||
public MinFloatParameter outlineThreshold = new(1.0f, 0f); // 默认设为 1米
|
||
|
||
[Tooltip("感光权重")]
|
||
public Vector3Parameter luminanceWeights = new(new Vector3(0.2126f, 0.7152f, 0.0722f));
|
||
|
||
public override string GetShaderName() => "SLS/Postprocessing/StrobeFlash";
|
||
|
||
public override void Render(CommandBuffer cmd, ref RenderingData renderingData, RTHandle source, RTHandle destination)
|
||
{
|
||
if (material == null) return;
|
||
|
||
material.SetColor(InternalShaderHelpers.ID._StrobeColorHigh, colorHigh.value);
|
||
material.SetColor(InternalShaderHelpers.ID._StrobeColorLow, colorLow.value);
|
||
material.SetVector(InternalShaderHelpers.ID._LuminanceWeights, new Vector4(luminanceWeights.value.x, luminanceWeights.value.y, luminanceWeights.value.z, 0));
|
||
|
||
Vector4 paramsVec = new Vector4(
|
||
frequency.value,
|
||
grading.value,
|
||
autoFlash.value ? 1f : 0f,
|
||
manualInvert.value ? 1f : 0f
|
||
);
|
||
material.SetVector(InternalShaderHelpers.ID._StrobeParams, paramsVec);
|
||
|
||
// 更新:传入 outlineThreshold (w分量)
|
||
Vector4 advParamsVec = new Vector4(
|
||
noiseReduction.value,
|
||
softness.value,
|
||
outlineThickness.value,
|
||
outlineThreshold.value
|
||
);
|
||
material.SetVector(InternalShaderHelpers.ID._StrobeAdvParams, advParamsVec);
|
||
|
||
Blitter.BlitCameraTexture(cmd, source, destination, material, 0);
|
||
}
|
||
|
||
public override bool IsActive() => enableEffect.value;
|
||
}
|
||
} |