using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class GrabTex : ScriptableRendererFeature { class CustomRenderPass : ScriptableRenderPass { static string rt_Name = "_GrabTex"; static int rt_ID = Shader.PropertyToID(rt_Name); // This method is called before executing the render pass. // It can be used to configure render targets and their clear state. Also to create temporary render target textures. // When empty this render pass will render to the active camera render target. // You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear. // The render pipeline will ensure target setup and clearing happens in a performant manner. public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) { RenderTextureDescriptor descriptor = new RenderTextureDescriptor(1920, 1080, RenderTextureFormat.DefaultHDR, 0); cmd.GetTemporaryRT(rt_ID, descriptor); ConfigureTarget(rt_ID); ConfigureClear(ClearFlag.Color, Color.black); } // Here you can implement the rendering logic. // Use ScriptableRenderContext to issue drawing commands or execute command buffers // https://docs.unity3d.com/ScriptReference/Rendering.ScriptableRenderContext.html // You don't have to call ScriptableRenderContext.submit, the render pipeline will call it at specific points in the pipeline. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get("tmpcmd"); cmd.Blit(renderingData.cameraData.renderer.cameraColorTarget, rt_ID); context.ExecuteCommandBuffer(cmd); cmd.Clear(); cmd.Release(); } // Cleanup any allocated resources that were created during the execution of this render pass. public override void OnCameraCleanup(CommandBuffer cmd) { cmd.ReleaseTemporaryRT(rt_ID); } } CustomRenderPass m_ScriptablePass; /// public override void Create() { m_ScriptablePass = new CustomRenderPass(); // Configures where the render pass should be injected. m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents; } // Here you can inject one or multiple render passes in the renderer. // This method is called when setting up the renderer once per-camera. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { renderer.EnqueuePass(m_ScriptablePass); } }