在unity中使用PostProcessing在进行后处理开发(一) 基本使用方法 | 狂吼的面包圈
因为梦想
我们一直在努力

在unity中使用PostProcessing在进行后处理开发(一) 基本使用方法

什么是后处理

后处理通常是指在某一个渲染阶段完成后,针对该渲染阶段的结果进行统一渲染效果处理的过程。例如:Bloom效果、动态模糊等

为什么要进行后处理

在画面渲染的过程中,一些效果无法再特定物体渲染时添加。比如说,想要画面在某个特定的时候变成黑白。如果在正常渲染过程中处理,则需要修改每一个参与渲染的材质的Shader,使其输出的颜色变为黑白。这样会使逻辑复杂化并且可能会带来性能上的开销。实际上讲,要实现上述效果,只需要把渲染完成后的彩色画面映射成黑白画面即可。就像是使用一个滤镜处理一张照片。

怎么进行后处理

通常,我们可以在相机上添加一个MonoBehavior的脚本, 并实现函数OnRenderImage(RenderTexture src, RenderTexture dest)。该函数的第一个参数为场景渲染的结果,可以理解为原图。第二个参数为输出的画面结果。

Example:

先创建一个用于后处理效果的shader, 这里可以使用unity的Image Effect Shader模板进行创建

创建好的shader与普通shader结构上并没有什么太大区别, 需要注意的是这几个参数

由于后处理已经是对整个画面进行处理, 因此无需剔除, 深度检查以及深度写入.

然后创建一个C#脚本,实现OnRenderImage函数

接下来创建一个承载后处理shader的材质,再调用Blit函数进行绘制

这里我修改了下shader, 让他返回图像亮度, 使图片变成黑白. 因此命名为GrayScale.

Blit函数即发起一次drawcall, 绘制的面是一个Quad. 该函数有多种重载, 有兴趣可以自己看看, 这里使用的是最常用的一种. 第一个参数为主纹理, Blit函数会将这个参数的Texture传入到Shader的_MainTex字段中. 第二个参数为绘制目标, 对应到shader的SV_Target上. 第三个参数对应绘制时采用的材质, 第四个参数为所选用的pass编号.

完成上述操作后, 将脚本附在相机上, 点击运行就可以看到效果了

什么是PostProcessing

PostProcessing或者叫PostProcessingStack, 是unity推出的一个开源的后处理插件. 该插件使用CommandBuffer组织后处理流程, 通过插件式的管理方式组织多个后处理效果的工作, 可以简化很多开发工作. 同时, PostProcessing可以实现在不运行的情况预览效果, 以及Scene窗口预览效果.

为什么要用PostProcessing

在Unity5.X中, 官方提供了一个特效包(ImageEffect).导入后就可以使用多个预制的特效.其实现方法就类似于本文最开始提到的在OnRenderImage编写处理逻辑. 但这样带来一个问题, 就是多个特效处理时不好组织后处理的生效顺序, 需要调整脚本执行顺序或者手动改写代码. 由于这个原因, 或者别的考虑,  Unity取消了特效包, 而推出了PostProcessing插件. 该插件可以直接在Editor界面添加/移除效果, 以及这些效果的先后顺序. 由于使用了CommonBuffer, 也可以在更多的环节添加后处理逻辑.

怎么使用PostProcessing

1.获取插件

Unity2018以前的版本可以到GitHub: https://github.com/Unity-Technologies/PostProcessing下载并将 PostProcessing文件夹拷贝到工程目录下即可使用. 也可以在AssetStore上下载资源包导入.

2018版本除了上面两个方法还可以使用Window->PackageManager进行添加.

由于后续教程都是基于2.0版本进行开发, 因此推荐大家使用2.0版本.

2.添加PostProcessing组件到场景

导入完成后,在相机上添加PostProcessLayer组件

这里的Trigger一般选择相机本身, 具体用处稍后会提到. Layer最好单独为PostProcessing定义一个或几个Layer. 这里选Default就报警告了.再下面的抗锯齿等参数暂时保持默认就好.

接下来, 在GameObject->3D Object菜单中会多出一个Post-process Volume的选项. 点击添加一个.

添加的Post-process Volume物体包含这些组件

Transform不用多说. 这里之所以会有一个Collider, 是因为PostProcessing支持局部生效. Volume不是全局生效时, Layer上的Trigger进入该Collider范围, 这个Volume上面挂的后处理效果才会生效. 当有多个Volume交叠时. 则会根据BlendDistance, Weight 以及 Priority进行渐变过渡.

然后, 为Volume选择一个Profile或者new一个Profile就可以编辑后处理特效了. 特别注意, 这个Volume物体的Layer需要包含在之前相机上Post Process Layer组件上选择的Layer中.

这里添加了一个bloom效果

可以看出在非运行状态下, Scene和Game视图都可以看到bloom效果.

使用PostProcessing编写自定义效果

同样添加一个C#脚本以及一个Shader

C#脚本可以以此为模板

脚本中继承两个类: PostProcessEffectSettings和PostProcessEffectRenderer<T>

PostProcessEffectSettings类中实现对外的设置参数定义, 类似于普通Mono脚本的public变量. 这些变量会出现在Editor面板中

PostProcessEffectRenderer类中实现正式的渲染逻辑, 其中必须重写Render函数, 并在该函数中书写实现渲染逻辑.

PostProcessing的shader需要使用HLSL语法进行编写因此有很多地方都不一样, 这个将在后续教程详细解释, 有兴趣的朋友也可以在https://github.com/Unity-Technologies/PostProcessing/wiki

看一下官方的说明.

在我的GitHub上,上传了一个代码模板工具, 欢迎访问https://github.com/RCBelmont/Unity-ShaderLab-Render/tree/master/ShaderLabAndRender/Assets, 并将PostProcessingCustom文件夹下面的内容添加到自己的工程中.这样将会在asset面板的邮件菜单出现PostProcessing的代码模板创建选项

同时在GameObject的右键菜单的Effects目录下会增加AddPPEffect选项.

这个可以帮你自动添加Post Process Layer以及创建Post Process Volume物体. 注意这个脚本只在相机物体上生效.

转载请注明原出处:狂吼的面包圈 » 在unity中使用PostProcessing在进行后处理开发(一) 基本使用方法