[Shader/渲染] 【转载】详解Unity中的PostFX v2的部分功能

查看:714 |回复:0 | 2019-11-19 12:50:06

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 kanisen 于 2019-11-19 10:42 编辑

Post Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊艳而逼真的特效,目前为v2版本,我们简称为PostFX v2。今天将由Unity技术支持工程师田彪带领大家了解PostFX v2的部分功能。

d8f8f131-3cd0-4e60-ac07-d0e50ac49e0e_0.jpeg




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下载源代码。





评分

参与人数 1元素币 +10 活跃度 +12 展开 理由
源支始 + 10 + 12

查看全部评分

2019-11-19 12:50:06  
 赞 赞 0

使用道具 登录

0个回答,把该问题分享到群,邀请大神一起回答。

CG 游戏行业专业问题

手机游戏引擎手游引擎Unity3D技术
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表