using System; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class SceneEffect : MonoBehaviour { public RenderPassEvent injectionPoint = RenderPassEvent.BeforeRendering; [Serializable] class Settings { public GradientTexture ShadowRemapTex; } [SerializeField] private Settings settings; SetupPass pass; private void OnEnable() { pass = new(settings); pass.renderPassEvent = injectionPoint; RenderPipelineManager.beginCameraRendering += OnBeginCamera; } private void OnDisable() { RenderPipelineManager.beginCameraRendering -= OnBeginCamera; } private void OnBeginCamera(ScriptableRenderContext context, Camera cam) { if (pass == null) { return; } if (cam.cameraType != CameraType.Game && cam.cameraType != CameraType.SceneView) { return; } cam.GetUniversalAdditionalCameraData().scriptableRenderer.EnqueuePass(pass); } private class SetupPass : ScriptableRenderPass { const string ShadowRemap = "_ShadowRemapON"; private Settings settings; public SetupPass(Settings settings) { this.settings = settings; } public override void FrameCleanup(CommandBuffer cmd) { cmd.DisableShaderKeyword(ShadowRemap); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { var cmd = CommandBufferPool.Get("DissolveEffect"); cmd.EnableShaderKeyword(ShadowRemap); cmd.SetGlobalTexture("_ShadowRemap", settings.ShadowRemapTex.GetTexture()); context.ExecuteCommandBuffer(cmd); cmd.Clear(); } } }