RenderFeature后处理

renderfeature可以方便的定义后处理
注意要插入postprocess之后,否者会被其他的renderTartget冲掉
https://bzyzhang.github.io/2021/01/31/2021-01-31-%EF%BC%88%E5%8D%81%E4%BA%8C%EF%BC%89URP%E4%B8%AD%E8%87%AA%E5%AE%9A%E4%B9%89%E5%90%8E%E5%A4%84%E7%90%86%E5%AE%9E%E4%BE%8B/

第一步

shader
新建一个image effect
在这里插入图片描述

第二步

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class CustomRenderPassFeature : ScriptableRendererFeature
{
    
    
    private class CustomRenderPass : ScriptableRenderPass
    {
    
    
        private CustomRPSettings _CustomRPSettings;
        private RenderTargetHandle _TemporaryColorTexture;

        private RenderTargetIdentifier _Source;
        private RenderTargetHandle _Destination;

        public CustomRenderPass(CustomRPSettings settings)
        {
    
    
            _CustomRPSettings = settings;
        }

        public void Setup(RenderTargetIdentifier source, RenderTargetHandle destination)
        {
    
    
            _Source = source;
            _Destination = destination;
        }

        public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
        {
    
    
            _TemporaryColorTexture.Init("_TemporaryColorTexture");
        }

        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
    
    
            CommandBuffer cmd = CommandBufferPool.Get("My Pass");

            if (_Destination == RenderTargetHandle.CameraTarget)
            {
    
    
                cmd.GetTemporaryRT(_TemporaryColorTexture.id, renderingData.cameraData.cameraTargetDescriptor, FilterMode.Point);
                cmd.Blit(_Source, _TemporaryColorTexture.Identifier());
                cmd.Blit(_TemporaryColorTexture.Identifier(), _Source, _CustomRPSettings.Material);
            }
            else
            {
    
    
                cmd.Blit(_Source, _Destination.Identifier(), _CustomRPSettings.Material, 0);
            }

            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }

        public override void FrameCleanup(CommandBuffer cmd)
        {
    
    
            if (_Destination == RenderTargetHandle.CameraTarget)
            {
    
    
                cmd.ReleaseTemporaryRT(_TemporaryColorTexture.id);
            }
        }
    }

    [System.Serializable]
    public class CustomRPSettings
    {
    
    
        public Material Material;
        public RenderPassEvent PassEvent = RenderPassEvent.AfterRenderingPostProcessing;
    }

    public CustomRPSettings customRPSettings = new CustomRPSettings();
    private CustomRenderPass _ScriptablePass;

    public override void Create()
    {
    
    
        _ScriptablePass = new CustomRenderPass(customRPSettings);

        _ScriptablePass.renderPassEvent = customRPSettings.PassEvent;
    }

    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
    
    
     	// if (renderingData.cameraData.isSceneViewCamera) return;
        _ScriptablePass.Setup(renderer.cameraColorTarget, RenderTargetHandle.CameraTarget);
        renderer.EnqueuePass(_ScriptablePass);
    }
}



猜你喜欢

转载自blog.csdn.net/A13155283231/article/details/121867000