URP下自定义后处理

说明

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

1
2
3
4
graph LR
Vlome-->RenderFeature --> RenderPass1 --> RenderPass2--> ......

RenderPass--> Shader--> ShaderPass1-->ShaderPass2-->......
流程如上

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,实现生命周期和处理行为。

按照生命周期流程如下
1
2
graph LR
OnCameraSetup-->Execute --> OnCameraCleanup
  • 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菜单路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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)