后处理+FEEL完全改进
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
using Echovoid.Runtime.Behavior.Rendering;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.Rendering.Universal;
|
||||
|
||||
namespace SLSFramework.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));
|
||||
|
||||
protected 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user