Hi! I'm fairly new to URP and Shaders in general, but I do have a general understanding of how it works.
Right now, I have a material that uses a CRT shader. Normally, with the built-in Unity Renderer, I could just use `Graphics.Blit` to apply the material affect to the camera, but as I've found out, this isn't the case for URP.
Consider the following view, before any post processing:

Using the default Unity renderer, along with `Graphics.Blit`, I'm able to achieve this:

However, even after switching my code up to blit using `CommandBuffer` instead, the output still remains unchanged (it looks like the first picture, instead of the second.)
Upon analysis using Frame Debugger, the correct view is rendered, however it gets replaced by a "Final Blit Pass". Since I'm new to this, I have absolutely no idea how to either disable it (which I guess would be a bad idea), nor how to pass the correct render texture to that pass.
I wanted to know exactly what I got wrong, or what I missed, since searching for answers online hasn't helped that much.
I use the following class extending ScriptableRenderPass in order to blit the material and the camera's render texture. class MaterialBlitPass : ScriptableRenderPass { private bool enabled; private Material basisMaterial; private int screenCopyID; public MaterialBlitPass(Material basisMaterial, ref bool enabled) { this.basisMaterial = basisMaterial; this.enabled = enabled; } public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { screenCopyID = Shader.PropertyToID("_AfterPostProcessTexture"); cmd.GetTemporaryRT(screenCopyID, cameraTextureDescriptor); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get(); if (enabled && basisMaterial != null) { RenderTargetIdentifier dst = BuiltinRenderTextureType.CurrentActive; cmd.Blit(BuiltinRenderTextureType.CurrentActive, screenCopyID); cmd.Blit(screenCopyID, BuiltinRenderTextureType.RenderTexture, basisMaterial, 0); cmd.SetRenderTarget(BuiltinRenderTextureType.RenderTexture); } context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } public override void FrameCleanup(CommandBuffer cmd) {} }
I still can't find out why the correctly-rendered version is not the one displayed. What am I missing or what might be the cause of the problem? Hopefully someone can point me towards the right direction.
Thanks!
Right now, I have a material that uses a CRT shader. Normally, with the built-in Unity Renderer, I could just use `Graphics.Blit` to apply the material affect to the camera, but as I've found out, this isn't the case for URP.
Consider the following view, before any post processing:

Using the default Unity renderer, along with `Graphics.Blit`, I'm able to achieve this:

However, even after switching my code up to blit using `CommandBuffer` instead, the output still remains unchanged (it looks like the first picture, instead of the second.)
Upon analysis using Frame Debugger, the correct view is rendered, however it gets replaced by a "Final Blit Pass". Since I'm new to this, I have absolutely no idea how to either disable it (which I guess would be a bad idea), nor how to pass the correct render texture to that pass.
I wanted to know exactly what I got wrong, or what I missed, since searching for answers online hasn't helped that much.
I use the following class extending ScriptableRenderPass in order to blit the material and the camera's render texture. class MaterialBlitPass : ScriptableRenderPass { private bool enabled; private Material basisMaterial; private int screenCopyID; public MaterialBlitPass(Material basisMaterial, ref bool enabled) { this.basisMaterial = basisMaterial; this.enabled = enabled; } public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor) { screenCopyID = Shader.PropertyToID("_AfterPostProcessTexture"); cmd.GetTemporaryRT(screenCopyID, cameraTextureDescriptor); } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { CommandBuffer cmd = CommandBufferPool.Get(); if (enabled && basisMaterial != null) { RenderTargetIdentifier dst = BuiltinRenderTextureType.CurrentActive; cmd.Blit(BuiltinRenderTextureType.CurrentActive, screenCopyID); cmd.Blit(screenCopyID, BuiltinRenderTextureType.RenderTexture, basisMaterial, 0); cmd.SetRenderTarget(BuiltinRenderTextureType.RenderTexture); } context.ExecuteCommandBuffer(cmd); CommandBufferPool.Release(cmd); } public override void FrameCleanup(CommandBuffer cmd) {} }
I still can't find out why the correctly-rendered version is not the one displayed. What am I missing or what might be the cause of the problem? Hopefully someone can point me towards the right direction.
Thanks!