using Unity.Toonshader; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.HighDefinition; [HideInInspector] public class UTSOutlinePass : DrawRenderersCustomPass { public UnityEngine.RenderingLayerMask renderingLayerMask; 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 outlineTag = new ShaderTagId("Outline"); 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), sortingCriteria = sortingCriteria, excludeObjectMotionVectors = false, overrideMaterial = overrideMaterial, overrideMaterialPassIndex = (overrideMaterial != null) ? overrideMaterial.FindPass(overrideMaterialPassName) : 0, stateBlock = stateBlock, renderingLayerMask = renderingLayerMask, }; CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result)); } }