using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class PixelateFeature : ScriptableRendererFeature { [System.Serializable] public class Settings { public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; [Tooltip("用于像素化的材质")] public Material pixelateMaterial = null; } public Settings settings = new Settings(); private PixelatePass m_PixelatePass; // 当Feature被创建或Inspector中的值被改变时调用 public override void Create() { // 检查材质是否存在 if (settings.pixelateMaterial != null) { m_PixelatePass = new PixelatePass(settings.pixelateMaterial); // 将Inspector中设置的事件赋值给Pass m_PixelatePass.renderPassEvent = settings.renderPassEvent; } else { // 如果材质为空,则不创建Pass,避免后续报错 m_PixelatePass = null; } } // 【核心修正】这个方法现在非常干净,只负责将创建好的Pass入队 public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { if (m_PixelatePass == null) { // 如果Pass没有被成功创建(因为没材质),就直接返回 return; } // 将我们的Pass添加到渲染队列中,URP会在正确的时间执行它 renderer.EnqueuePass(m_PixelatePass); } }