using Unity.Toonshader; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; [HideInInspector] public class UTSOutlinePass : DrawRenderersCustomPass { private ShaderTagId outlineTag = new("Outline"); protected override void Execute(CustomPassContext ctx) { var utsRenderer = ctx.hdCamera.volumeStack.GetComponent(); if (utsRenderer == null) return; if (!utsRenderer.enableOutline.value || !utsRenderer.enable.value) return; Shader.SetGlobalFloat("_Outline_MaxWidth", utsRenderer.outlineMaxWidth.value * 0.01f); var mask = RenderStateMask.Nothing; var stateBlock = new RenderStateBlock(mask) { depthState = new DepthState(depthWrite, depthCompareFunction), // We disable the stencil when the depth is overwritten but we don't write to it, to prevent writing to the stencil. stencilState = new StencilState(false), }; var renderConfig = HDUtils.GetRendererConfiguration(false, false); var result = new UnityEngine.Rendering.RendererUtils.RendererListDesc(outlineTag, ctx.cullingResults, ctx.hdCamera.camera) { rendererConfiguration = renderConfig, renderQueueRange = GetRenderQueueRange(RenderQueueType.All), excludeObjectMotionVectors = false, stateBlock = stateBlock, }; CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result)); } }