微信号:Unity-GreaterChina

介绍:Unity官方开发者平台,分享最前沿的技术文章和开发经验,精彩的Unity活动和社区相关信息.

Unity中的PostFX v2

2018-07-15 13:35 田彪

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官方在线培训课程

7月18日,Unity将正式举办首期Unity官方在线培训课程,打破地理位置的限制,通过在线一日系统化教学,帮助你掌握和使用Unity。参加完此次一天的在线课程后, 参会者将被授予Unity官方培训证明。[了解详情

报名地址:

https://connect.unity.com/events/UnityTrainingWorkshop


实时优化,智造收益 - Unity Monetization开发者生态沙龙

8月3日,Unity将于举办为期半天的Unity Monetization开发者生态沙龙!本次活动将与大家共同探讨移动游戏开发与变现相关难点与痛点。[了解详情]

报名地址:

https://connect.unity.com/events/unityads


7月Asset Store资源商店促销 

7月,只需在Asset Store资源商店消费满30-199美元,最高可获得价值235美元的5款免费资源,参与活动,获得夏日精选资源包。

活动地址:

https://assetstore.unity.com/g/july-promo-activation-cn



点击“阅读原文”访问Unity官方中文论坛

 
Unity官方平台 更多文章 \\bUnity 2018.2正式版功能介绍(中) Unity机器学习代理ML-Agents强化学习示例解析 揭秘《死者之书》之风、场景地形及优化技巧 2018年上半年最受欢迎的Top 10技术文章 首期Unity官方在线培训课程火热报名中
猜您喜欢 Android性能优化之如何避免Overdraw JAVA之殇 | 一个影响广泛的Java工具集RCE漏洞 In App Purchase 最佳实践 - (1)基本配置 013 | 与病共生,改变人类世界的病毒 OpenStack和Docker成最受欢迎开源云计算项目