前言
游戏后处理效果是游戏开发过程中不可或缺的部分。它们通过颜色、光照、模糊等技术手段,让游戏画面更加逼真、迷人。在Unity的Built-in管线下,想要完成后处理效果,要么引进著名的后处理插件Post Processing Stack来实现此目标,要么使用OnRenderImage()配合Shader的方法进行自定义。当使用以上方法实现后,便可以对场景使用想要的后处理效果,并且自由度很高,可以随时进行修改和扩展。
而当项目转到了URP下,则会发现URP已经自带了一套相应的后处理框架Volume,不再需要去下载插件来实现目的,但随着项目的逐渐开发,一些其它方面问题却不请自来。如:
- 想要添加别的后处理效果应该怎么做?
- 怎么控制不同后处理的处理时机?
- 怎样实现一些特殊的效果?
- ......?
添加自定义的后处理
在如何添加URP没有的后处理效果这个问题上,大致有如下两种方案。
第一种就是修改URP自带Volume的源码,让添加的后处理特效融入进Volume里。首先定位到当前Unity使用的URP包体文件com.unity.render-pipelines.universal。然后对其进行修改,在Volume上面添加自己的后处理效果。这个方法能让自定义的后处理效果完美的融入URP的后处理框架。但是弊端也很明显——需要修改源码,难度较大,且破坏了包体的完整性,如果后续有升级会很麻烦。
第二种就是使用Unity提供的RenderFuture来添加自己的想要的后处理效果,这里主要参考https://www.bilibili.com/read/cv11343490,它是Unity官方提供的添加自定义后处理的案例,利用RenderFuture添加了一个后处理效果。大家可以仔细学习一下,顺便了解一下Render Future是用来做什么的。很显然这个添加后处理的方法比第一种要优雅,同时也不会对URP本身的代码进行修改,能够满足一定需求。但是添加一个后处理效果未免还是复杂了一丢丢,需要额外关注Render Future和RenderPass,而且每写一个后处理就要写一个RenderPass吗?因此不禁会想,能不能在添加后处理效果时只关注后处理面板和实现逻辑且将添加的后处理效果合并在一个RenderPass里呢?所以为了解决这个问题且方便后续管理和扩展,需要制作一个URP自定义后处理的框架 。
制作框架
为了方便使自定义后处理能够出现在Volume组件里且易于管理,这里新定义了一个类VolumeSetting,具体如下:
public abstract class VolumeSetting : VolumeComponent, IPostProcessComponent
{
public abstract bool IsActive();
public bool IsTileCompatible() => false;
public abstract Shader GetShader();
}
IsActive()方法获取当前后处理效