Notifications
Article
Unity中的PostFX v2
Published 4 months ago
424
0
Post Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊艳而逼真的特效,目前为v2版本,我们简称为PostFX v2。今天将由Unity技术支持工程师田彪带领大家了解PostFX v2的部分功能。
PostFX v2主要包括Post Process Layer 与Post Process Volume。
  • PostProcess Layer需要挂载到Camera的Gameobject,场景中只能有一个Post Process Layer处于Active状态。
  • PostProcess Volume相当于一个效果容器,场景上可以拥有多个PostProcess Volume。

Post Process Layer

PostProcess Layer如下图所示,Trigger变量若设置为Null,则只有Global Post Process Volume里的效果会生效。若不为Null,对于非 Global Post Process Volume。Trigger的位置信息会跟Post Process Volume的Collider 做位置判断,以决定该Post Process Volume是否处于有效区域。

Post Process Volume

Post Process Volume如下图所示,Global变量表示该Post Process Volume是否是全局,若不是则需要挂载Collider组件。
Blend Distance变量的用途为:在非global模式下,判断Trigger距离Collider 的最短距离是否小于Blend distance,小于则该Post Process Volume进行后处理计算。

PostFX v2 渲染

在代码层面,PostFX v2的渲染主要通过用CommandBuffer来实现,在类PostProcessLayer的OnEnable函数中,创建了若干Commandbuffer。如下图所示。
PostFX v2的代码主入口在类PostProcessLayer的OnPrecull函数,该函数为Monobehaviour的回调函数。如下图所示,在该函数的末尾处,存在一次Blit操作,目的是对于Tiled系列的GPU的需要。
在类PostProcessLayer的RenderBuiltins函数中,包含了各种具体效果的逻辑,如下图所示。
如果想要更改后处理效果的渲染书序,调整代码顺序即可。

Bloom效果代码逻辑

下面详细介绍Bloom效果的具体代码逻辑,便于大家了解其实现原理。
在Bloom.cs文件中的Render函数中是Bloom效果的主要的程序逻辑。Bloom.shader,sampling.hlsl,Uber.shader三个文件是Bloom效果涉及的shader逻辑。
Bloom效果的编辑面板如下图所示。
Bloom首先进行预过滤与降采样,如下图所示。
其对应的Pass为Bloom.shader中的Pass 0 - Pass 3,如下图所示。
Pass 0和Pass 1负责预过滤,Pass 2和Pass 3分组降采样,其中Pass 0和Pass 1并非同时执行,而是互斥执行,也就是同时只会执行其中的一个Pass,由QualityOffset变量决定执行哪一个Pass,Pass 2和Pass 3同理。其中,QualityOffset变量的值来源于与Bloom面板上的Mobile Opitmized选择框。
预过滤和降采样,最终的执行函数都是DownsampleBox13Tap和DownsampleBox4Tap ,如下图所示。
如果在Bloom面板上勾选了Mobile Opitmized选择框,那么最终将会执行DownsampleBox4Tap函数,也就是采样4次贴图,反之则执行DownsampleBox13Tap函数。
降采样完成后,将要进行升采样,如下图所示。
其对应的Pass为Pass 4和Pass 5,如下图所示。
同降采样类似,Pass 4和Pass 5也是互斥执行,同样受QualityOffset影响。升采样最终的采样执行在UpsampleTent 和UpsampleBox函数中,4次采样与9次采样的差异,如下图所示。
完成升采样后,最终需要Combine,Bloom效果的最终Combine在Uber shader中进行,如下图所示。
以上即为Bloom效果的整体流程,如果开发想要在PostFX v2的基础上优化Bloom效果,可以C#脚本端降低Blit次数,也就是在降采样和升采样中的循环迭代次数,循环次数受控于类BloomRenderer中的 k_MaxPyramidSize 变量。同时,也可以在Shader层面降低纹理采样次数。

参考资料

  • PostFX v2下载
https://github.com/Unity-Technologies/PostProcessing
  • Tiled Rendering:
https://en.wikipedia.org/wiki/Tiled_rendering

小结

如果想要了解PostFX v2中其它效果的逻辑,可以在Github下载源代码。更多Unity技术文章尽在Unity官方中文论坛(UnityChina.cn) !

Unity China
345
Comments