Files
Cielonos/Assets/Shaders/ScriptablePostProcessor/Base/ScriptablePostProcessorFeature.cs

94 lines
3.9 KiB
C#
Raw Normal View History

2025-11-25 08:19:33 -05:00
using System.Collections.Generic;
using System.Linq;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
2026-02-13 09:22:11 -05:00
namespace SLSUtilities.Rendering.PostProcessing
2025-11-25 08:19:33 -05:00
{
public class ScriptablePostProcessorFeature : ScriptableRendererFeature
{
private List<ScriptablePostProcessorVolume> postProcessorVolumes;
private ScriptablePostProcessorPass afterTransparentPass;
private ScriptablePostProcessorPass beforePostProcessPass;
private ScriptablePostProcessorPass afterPostProcessPass;
public override void Create()
{
var stack = VolumeManager.instance.stack;
postProcessorVolumes = VolumeManager.instance.baseComponentTypeArray
2025-12-22 18:36:29 -05:00
.Where(t => t.IsSubclassOf(typeof(ScriptablePostProcessorVolume)))
.Select(t => stack.GetComponent(t) as ScriptablePostProcessorVolume)
.ToList();
2025-11-25 08:19:33 -05:00
var afterTransparentPostProcessors = postProcessorVolumes
.Where(c => c.InjectionPoint == CustomPostProcessInjectionPoint.AfterTransparent)
.OrderBy(c => c.OrderInInjectionPoint)
.ToList();
2025-12-23 19:47:06 -05:00
afterTransparentPass = new ScriptablePostProcessorPass("Custom PostProcessor - after Transparent", afterTransparentPostProcessors)
{
renderPassEvent = RenderPassEvent.AfterRenderingTransparents
};
2025-11-25 08:19:33 -05:00
var beforePostProcessPostProcessors = postProcessorVolumes
.Where(c => c.InjectionPoint == CustomPostProcessInjectionPoint.BeforePostProcess)
.OrderBy(c => c.OrderInInjectionPoint)
.ToList();
2025-12-23 19:47:06 -05:00
beforePostProcessPass = new ScriptablePostProcessorPass("Custom PostProcessor - before PostProcessing", beforePostProcessPostProcessors)
{
renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing
};
2025-11-25 08:19:33 -05:00
var afterPostProcessPostProcessors = postProcessorVolumes
.Where(c => c.InjectionPoint == CustomPostProcessInjectionPoint.AfterPostProcess)
.OrderBy(c => c.OrderInInjectionPoint)
.ToList();
2025-12-23 19:47:06 -05:00
afterPostProcessPass = new ScriptablePostProcessorPass("Custom PostProcessor - after PostProcessing", afterPostProcessPostProcessors)
{
renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing
};
2025-11-25 08:19:33 -05:00
}
2025-12-22 18:36:29 -05:00
2025-11-25 08:19:33 -05:00
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (renderingData.cameraData.postProcessEnabled)
{
2025-12-22 18:36:29 -05:00
if (afterTransparentPass.Setup(ref renderingData))
2025-11-25 08:19:33 -05:00
{
afterTransparentPass.ConfigureInput(ScriptableRenderPassInput.Color);
renderer.EnqueuePass(afterTransparentPass);
}
2025-12-22 18:36:29 -05:00
if (beforePostProcessPass.Setup(ref renderingData))
2025-11-25 08:19:33 -05:00
{
beforePostProcessPass.ConfigureInput(ScriptableRenderPassInput.Color);
renderer.EnqueuePass(beforePostProcessPass);
}
2025-12-22 18:36:29 -05:00
if (afterPostProcessPass.Setup(ref renderingData))
2025-11-25 08:19:33 -05:00
{
afterPostProcessPass.ConfigureInput(ScriptableRenderPassInput.Color);
renderer.EnqueuePass(afterPostProcessPass);
}
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
2025-12-23 19:47:06 -05:00
// 关键点:调用 Pass 的清理函数,销毁缓存池中的材质
afterTransparentPass?.Cleanup();
beforePostProcessPass?.Cleanup();
afterPostProcessPass?.Cleanup();
2025-11-25 08:19:33 -05:00
afterTransparentPass = null;
beforePostProcessPass = null;
afterPostProcessPass = null;
2025-12-23 19:47:06 -05:00
postProcessorVolumes = null;
2025-11-25 08:19:33 -05:00
}
2025-12-23 19:47:06 -05:00
base.Dispose(disposing);
2025-11-25 08:19:33 -05:00
}
}
}