# 说明

在 URP 中 Unity 通过定义 RenderFeature 来编写自定义后处理效果,实现 SRP渲染管线

VlomeRenderFeatureRenderPass1RenderPass2......RenderPassShaderShaderPass1ShaderPass2
流程如上

# Step1 编写后处理 Shader

# Setp2 编写 Render Feature

# Render Feature

Render Feature 是一个处理集,继承自 ScriptableRendererFeature ,可以包含多个 Render Pass。

public override void Create()

用于在 RenderFeature 创建时调用,一般在这里进行使用到的 RenderPass 的初始化操作。

public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)

用于指定渲染队列信息,通过 renderer.EnqueuePass(renderpass) 方法来将 renderpass 加入渲染队列。

# Render Pass

RenderPass 类似于 ShaderPass,是一块处理单元,通过继承 ScriptableRenderPass , 实现生命周期和处理行为。

按照生命周期流程如下
OnCameraSetupExecuteOnCameraCleanup
  • public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)

    用于初始化 RenderPass,完成基础操作。

  • public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)

    用于处理 Pass 逻辑。

  • public override void OnCameraCleanup(CommandBuffer cmd)

    用于进行收尾操作,释放资源等。

# Setp3 编写 Volume Component

创建一个类继承自 VolumeComponent , 实现 IPostProcessComponent 接口。

定义 VolumeComponentMenu 菜单路径。

[Serializable, VolumeComponentMenu("MyPost-processing/Translation")]
public class TranslationEffect : VolumeComponent, IPostProcessComponent
{
    [Range(0.0f, 1f)] public FloatParameter width = new FloatParameter(0.5f);
    [Range(0.0f, 1f)] public FloatParameter height = new FloatParameter(0.5f);
    [Range(0.0f, 1f)] public FloatParameter scale = new FloatParameter(0.5f);
    public Vector2Parameter viewport=new Vector2Parameter(new Vector2(0.5f,0.5f));
    
    
    public bool IsActive()
    {
        return scale.value >= 0f;
    }
    public bool IsTileCompatible()
    {
        return false;
    }
}

PS:书写参数时,必须使用经过保证的参数类型,如 Float 应该使用 FloatParameter 类型代替。

# Setp4 编写控制脚本

# 参考资料

  1. 【鸡丝菌的 ShaderGraph 小教室】动物森友会转场效果的实现_哔哩哔哩_bilibili
  2. Unity - Scripting API: ScriptableRenderContext (unity3d.com)
  3. URP 自定义后处理 - 知乎 (zhihu.com)
  4. 如何扩展 Unity URP 的后处理 Volume 组件 - 知乎 (zhihu.com)
  5. URP 系列教程 | 如何使用 Scriptable Renderer Feature 来自定义后处理效果 - 知乎 (zhihu.com)
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Fasty 微信支付

微信支付

Fasty 支付宝

支付宝

Fasty 贝宝

贝宝