请选择 进入手机版 | 继续访问电脑版

查看: 21383|回复: 296

[原创] Unity粒子遇上着色器,引爆视觉特效

  [复制链接]

1092

主题

1778

帖子

2万

贡献

管理员

Rank: 9Rank: 9Rank: 9

积分
23200
QQ
发表于 2017-8-28 02:15:49 | 显示全部楼层 |阅读模式
由Real-Time VFX举办的首届“伟大的变形者”视觉特效大赛已落下帷幕,最终冠军花落Michał Piątek使用Unity中的粒子特效结合着色器实现的作品。今天这篇文章将由Unity技术经理鲍健运,为大家剖析该特效作品的实现过程。

下面先来看看这个特效作品的视频:



根据Michał的思路,他想实现的是类似于“炼金术“一般的,强烈化学反应伴随着奇特物理变形的效果。须臾间圆环膨胀扭转,似银瓶乍破水浆迸。一阵水银泻地之后,复凝结成一混沌,电光火石间化作静置的茶壶。是不是非常的赏心悦目?现在就为大家解析如何实现这些视觉特效。

基本原理

该特效实质上是基于粒子系统驱动的着色器控制画面的表现,场景中的粒子用于控制器物表面的凸起位置、强度和颜色。Michał还同步处理了参考发射器(Emitter)生命周期的溶解纹理(Dissolve Texture),因此可以在Unity粒子系统呈现的动画过程中看到淡出效果。



为了进一步优化效果,场景还引入了具有质量和阻力系数的空气阻力模块,以及随机化的吸引器模块,它会针对每个粒子产生吸引力的效果,从而表现出凝结成混沌。

伪3D气泡

Michał撰写了一些自定义的网格着色器,自定义粒子气泡着色器以及自定义shuriken模块。伪3D气泡就是其中比较有趣的一个实现。

实现这样的效果需要自定义Unity表面着色器(Surface Shader),该着色器包含以下参数:

法线贴图,如下所示:



  • 法线贴图的强度倍数,主要用于控制法线的强度

  • 噪音纹理用来对法线图片与剪切纹理进行变形

  • 剪切纹理


这里的关键点是,使用法线缓冲(Normal Buffer)创建假阴影的环境光遮蔽(Ambient Occlusion),它有助于展现“3D”外观。基于这样的处理,就能表现出如下图这样非常“真实”的伪3D气泡效果:





Melt Shader

回顾整个特效的过程,不难发现一切都是从熔化的圆环开始的。Michał写了一个叫Melt Shader的着色器,作用于圆环和茶壶之上。只要拥有适当的平铺UV(tiled UV),并应用一些噪声纹理,它就可以作用于任意网格。基本上这个着色器的参数都是由粒子系统驱动的,以下就是在材质检视窗口(Material Inspector)的所有参数设置:




下面的简短视频显示了这些着色器参数变化对于特效表现的影响。如调节中止阈值(Cutoff Threshold),可以改变圆环表面粗细及有无的变化显示;改变中止遮罩速度(Cutoff mask speed),就直接改变了它们的变化速度;修改塌陷强度(Collapse Strength),会影响圆环表面的塌陷凹凸状变化的效果;增加重力强度(Gravity Strength),会产生圆环在重力作用下向平面的塌陷效果。这些综合起来可以理解为,这个着色器“挤压”网格,并为它施加一个伪重力,即着色器越是给网格施压,物体就越是靠近地面。假定地面是平坦的,就可以通过使用地形高度图(Terrain Heightmap)作为地面等级来改善着色器。



视频中展现的着色器的另一部分,即调整噪音缩放(Noise Tiling),用于改变特效的随机化程度。其实就是基于纹理的溶解和在顶点着色器中采样的噪音纹理。

Melting Object

下面来分析粒子系统驱动的数据,Michał使用粒子的尺寸(Size)和颜色(Color)来控制一些着色器参数。为了更好的进行参数调整,MeltingObject脚本除了引用了“熔化”对象的渲染器(Melting Object Renderer)和粒子渲染器(Particles Renderer),还添加了网格剔除值(Cutoff Value),塌陷强度(Collapse Strength,即重力)和发光强度倍数值(Emission Strength),以曲线的形式编辑。如下图所示:



最后提交大赛评审的版本,事实已经禁用了粒子渲染,因为这些粒子只是为了将数据传递给着色器,不会执行任何其它操作。

下面的操作视频打开了粒子渲染,帮助大家理解特定参数的调整所引起的变化:



那这些粒子到底是如何驱动着色器的呢?这点在Unity中实现并不复杂。

1、ParticleSystem有这样一个API:
public int GetParticles(Particle[] particles);

其作用是将粒子数据写入一个粒子数组作为缓冲,返回值就是该粒子的数量。

2、粒子的每个参数都可以被读取,比如尺寸、速度、位置、颜色、透明值等。在运行时还可以使用GetCurrentColor、GetCurrentSize、GetCurrentSize3D,获得当前状态下的颜色、二维尺寸和三维尺寸

3、取得这些数值后,便可以通过“圆环”的渲染器,去修改应用该渲染器的材质的着色器参数。而这里只需做几件事:用尺寸(Size)设定点亮面积的大小;用透明值(Alpha)设置网格变形值;在粒子发射器的生命周期内,基于网格剔除值、塌陷强度和发光强度倍数的曲线进行变化。

这样,就能产生粒子系统驱动着色器的效果了。

Post Processing Stack

为了表现绚丽的画面效果,Michał还在项目中添加了Unity官方的Post Processing Stack进行摄像机后期处理。



上图就是使用了图像晕光(Bloom)效果,结合HDR产生流光溢彩的视觉体验。此外,项目还运用了屏幕空间环境光遮蔽(Screen Space Ambient Occlusion)和运动模糊(Motion Blur)的后处理特效,使得特效的展现更为流畅平滑。

最后

如果大家对于这个特效作品还是意犹未尽,Michał还生成了一个exe的可执行项目可供参考。

回复可见:

游客,如果您要查看本帖隐藏内容请回复



本帖子中包含更多资源

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

x

0

主题

1

帖子

15

贡献

初级UU族—1级

Rank: 1

积分
15
发表于 2017-11-27 08:16:59 | 显示全部楼层
真的很劲爆,没有代码分享一下么

11

主题

37

帖子

585

贡献

中级UU族—1级

Rank: 4

积分
585
发表于 2017-9-6 14:31:47 | 显示全部楼层
炫酷得让我想学习。。

0

主题

14

帖子

265

贡献

初级UU族—3级

Rank: 3Rank: 3

积分
265
发表于 2017-8-28 03:04:00 | 显示全部楼层
学习学习,尝试一下

0

主题

4

帖子

75

贡献

初级UU族—2级

Rank: 2

积分
75
发表于 2017-8-28 03:11:16 | 显示全部楼层
感谢分享~~~~~~~

0

主题

5

帖子

155

贡献

初级UU族—2级

Rank: 2

积分
155
发表于 2017-8-28 03:47:40 | 显示全部楼层
学习下, 看着很好.

0

主题

2

帖子

50

贡献

初级UU族—2级

Rank: 2

积分
50
发表于 2017-8-28 04:22:54 | 显示全部楼层
666666666666

0

主题

21

帖子

235

贡献

初级UU族—3级

Rank: 3Rank: 3

积分
235
发表于 2017-8-28 04:43:57 | 显示全部楼层
真是强大啊

2

主题

5

帖子

155

贡献

初级UU族—2级

Rank: 2

积分
155
发表于 2017-8-28 05:02:41 | 显示全部楼层
66666666666666666

0

主题

2

帖子

50

贡献

初级UU族—2级

Rank: 2

积分
50
发表于 2017-8-28 05:08:49 | 显示全部楼层
nice job,handsome

0

主题

1

帖子

20

贡献

初级UU族—1级

Rank: 1

积分
20
发表于 2017-8-28 05:14:38 | 显示全部楼层
厉害了,学习学习

1

主题

9

帖子

155

贡献

初级UU族—2级

Rank: 2

积分
155
发表于 2017-8-28 05:28:42 | 显示全部楼层
cool,学习学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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