using System; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using X.Rendering.Assets; namespace X.Rendering.Scene { internal class ShadowEdgeRemapSetupPass : ScriptableRenderPass, IDisposable { [Serializable] public class ShadowEdgeRemapSettings { public bool Enable = true; public GradientTexture ShadowRemapTex; public RenderPassEvent InjectionPoint = RenderPassEvent.BeforeRendering; } const string ShadowRemap = "_ShadowRemapON"; private ShadowEdgeRemapSettings settings; private CommandBuffer commandBuffer; public ShadowEdgeRemapSetupPass(ShadowEdgeRemapSettings settings, SceneEffect sceneEffect) { this.settings = settings; renderPassEvent = settings.InjectionPoint; commandBuffer = CommandBufferPool.Get(nameof(ShadowEdgeRemapSetupPass) + sceneEffect.name); } public override void FrameCleanup(CommandBuffer cmd) { cmd.DisableShaderKeyword(ShadowRemap); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { var cmd = commandBuffer; cmd.EnableShaderKeyword(ShadowRemap); cmd.SetGlobalTexture("_ShadowRemap", settings.ShadowRemapTex.GetTexture()); context.ExecuteCommandBuffer(cmd); cmd.Clear(); } public void Dispose() { commandBuffer.Dispose(); } } }