using AOT.Common; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.RendererUtils; using UnityEngine.Rendering.Universal; namespace AOT.PostProcess.CustomDraw { public class CustomDrawRPF : ScriptableRendererFeature { [System.Serializable] public class Settings { public RenderPassEvent renderPassEvent = RenderPassEvent.AfterRenderingOpaques; public LayerMask layerMask; public string lightModeName = "CustomDraw"; } class CustomRenderPass : ScriptableRenderPass { private Settings _settings; private ShaderTagId _shaderTagId; public CustomRenderPass(Settings settings) { _settings = settings; _shaderTagId = new ShaderTagId(settings.lightModeName); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { if (!AOTCodeDefine.ENABLE_MESH_OUTLINE) return; var cmd = CommandBufferPool.Get("CustomDraw"); cmd.Clear(); var renderListDesc = new RendererListDesc(_shaderTagId, renderingData.cullResults, renderingData.cameraData.camera); renderListDesc.renderQueueRange = RenderQueueRange.all; renderListDesc.layerMask = _settings.layerMask; var renderList = context.CreateRendererList(renderListDesc); cmd.DrawRendererList(renderList); context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } } public Settings settings = new Settings(); private CustomRenderPass _scriptablePass; public override void Create() { _scriptablePass = new CustomRenderPass(settings); _scriptablePass.renderPassEvent = settings.renderPassEvent; } public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { renderer.EnqueuePass(_scriptablePass); } } }