Unity URP RenderFeature 自定义后效

关于自定义Pass 我们可以在Create-Rendering-renderPiplineAsset创建我们的管理文件,RenderFeature中添加内置feature pass管理启用我们自定义pass关键字
在这里插入图片描述
或者我们完全自定义我们的feature Pass

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

public class ArtsEffectFeature : ScriptableRendererFeature
{
	//属性暴露在RenderFeature界面
    public static bool GlobalActive = false;
    [Serializable]
    public class Setting
    {
        public Material material;
        public Texture texture;
        public float _RotateSpeed;
      ...
        [Range(0, 10f)] public float _CenterPower;
    }
    public bool enable = false;
    public Setting setting = new Setting();
    private ArtsEffectPass pass;

    public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
    {
        if(!enable || !GlobalActive) return;
        //这一效果是特写相机使用,屏蔽BaseCamera 防止LUT等被修改
        if (renderingData.cameraData.renderType != CameraRenderType.Base) return;
        //传递colorTexture到Pass
        pass.SetUp(setting, renderer.cameraColorTarget);
        renderer.EnqueuePass(pass);
    }

    public override void Create()
    {
        pass = new ArtsEffectPass();
    }
}

public class ArtsEffectPass : ScriptableRenderPass
{
    private ArtsEffectFeature.Setting setting;
    private RenderTargetIdentifier colorRt;

    public ArtsEffectPass()
    {
    	//在半透明队列之后
        renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
    }

    public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
    {
        if (renderingData.cameraData.renderType != CameraRenderType.Base) return;
        var material = setting.material;
        if (material == null || material.shader == null || !material.shader.isSupported)  return;
        //命名并创建CommandBuffer
        CommandBuffer cmd = CommandBufferPool.Get("ArtsEffect");
        cmd.Clear();
        //Texture属性设置
        var descriptor = renderingData.cameraData.cameraTargetDescriptor;
        descriptor.msaaSamples = 1;
        descriptor.depthBufferBits = 0;
        //图片名称
        var texId = Shader.PropertyToID("ArtsEffectTex");
        //创建图片
        cmd.GetTemporaryRT(texId, descriptor);
        material.SetTexture("_BaseMap", setting.texture);
        material.SetFloat("_Brightness", setting._Brightness);
        ...
        material.SetFloat("_CenterPower", setting._CenterPower);

		//ColorTexture 根据后效shader绘制到TempTexture上
        cmd.Blit(colorRt, texId, material);
        //拷贝回colorTexture
        cmd.Blit(texId, colorRt);
        cmd.ReleaseTemporaryRT(texId);
        //执行
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }

    internal void SetUp(FinishArtsEffectFeature.Setting setting, RenderTargetIdentifier colorRt)
    {
        this.setting = setting;
        this.colorRt = colorRt;
    }
}
//shader中我们采样_MainTex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值