using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; namespace MuHua { /// /// 渲染轮廓功能 /// public class SRFOutline : ScriptableRendererFeature { [Tooltip("轮廓大小")] public float size = 5; [Tooltip("辅助材质")] public Material unlit; [Tooltip("轮廓材质")] public Material outline; [Tooltip("混合材质")] public Material blend; /// 渲染Event public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingPostProcessing; /// 渲染对象 public static List RenderObjs = new List(); /// 是否有效 public bool IsValid => unlit != null && outline != null && blend != null; /// 渲染通道 private SRFOutlinePass outlinePass; /// 渲染设置 private SRFOutlineSettings settings; public override void Create() { outlinePass = new SRFOutlinePass(); settings = new SRFOutlineSettings(); } public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { if (!IsValid) { return; } RenderObjs.RemoveAll(obj => obj == null); settings.unlit = unlit; settings.outline = outline; settings.blend = blend; settings.renderObjs = RenderObjs.ToArray(); settings.renderPassEvent = renderPassEvent; outlinePass.Setup(settings, renderingData); renderer.EnqueuePass(outlinePass); Dispose(); } /// 添加到渲染队列 public static void Add(Renderer renderer, bool isClear) { if (isClear) { Clear(); } if (RenderObjs.Contains(renderer)) { RenderObjs.Add(renderer); } } /// 添加到渲染队列 public static void Add(Renderer[] renderers, bool isClear) { if (isClear) { Clear(); } RenderObjs.AddRange(renderers); } /// 移出渲染队列 public static void Remove(Renderer renderer) { if (RenderObjs.Contains(renderer)) { RenderObjs.Remove(renderer); } } /// 清空队列 public static void Clear() { RenderObjs?.Clear(); RenderObjs = new List(); } } }