本篇文章将给大家介绍一个前段时间在项目中为了适配低端机扭而实现的曲的一个后处理效果,公众号贴代码可读性比较差,所以以图片形式呈现,文章中使用到的素材和完整源代码工程大家可以在公众号发送“后处理扭曲”来获得。
因为安卓手机中有些低端机会不支持grabpass,所以需要后处理脚本来实现后处理效果;
原理:用另一个摄像机来捕捉场景中用来扭曲(扭曲shder)的特效,然后把grab屏幕存在一张rt中,最后用另外一个后处理shader来处理这张图片。原理基本和unity的Grabpass相同,只不过要我们手动来操作。在这里大家要注意的是,unity2018以前的版本,多个相机同时开启其实在性能上有较大的消耗,但是为了在低端机上实现扭曲的效果,也只能这样做了。
⬆
⬆⬆扭曲相机图像
⬆
⬆⬆主相机图像
⬆
⬆⬆合成后的最终图像
实现步骤:
1.准备一张扭曲用的NormalMap(根据个人喜好)⬇⬇⬇
2.编写用来渲染NormalMap的shader
这里只需要一个普通的alphablend粒子shader,直接从unity官网下载内置粒子shader修改一下就好了。但我们需要把这个shader的Tags当中"RenderType"改为一个自定义的名字,相当于把使用这个shader渲染的物体标记出来,在扭曲相机里使用SetReplacementShader这个方法单独渲染这些物体。
Tags{ "Queue"="Transparent" "IgnoreProjector"="True""RenderType"="HeatDistortion"}
3.编写用来后处理的shader
也就是用来处理扭曲相机中获取图片的shader,我们把主相机中获得的图片作为底图,把扭曲相机中获得的图片作为NormalMap,用这个shader来实现扭曲。
4. 编写相机的脚本处理
首先,要在场景摄像机的基础上创建一个用来存储扭曲信息的摄像机;
在OnEnable方法中创建扭曲相机,将扭曲相机渲染到rt中,将rt赋给后处理材质作为一张扭曲图
最后把主摄像机中的图片(src)输入到_postEffectMaterial
5.实际使用
我们新建一个场景,新建一个简单的火焰粒子系统,然后把火焰粒子系统复制一份,改为发射我们的NormalMap的图片。
然后我们把发射NormalMap的粒子系统的Layer设置一下(名字自定义)。
在主相机中剔除掉NormalMap粒子系统的Layer。
给主相机附上我们写的后处理用的脚本并设置参数,如下图。
最后运行,会发现自动生成了一个扭曲相机,我们大功告成!!!!
这种方法并不局限于火焰热干扰特效,大家可以根据自己的发挥和想象来实现更多的效果,比如刀光,爆炸,雨点等等。
最后,如果大家对本期的教程有什么问题不清楚,或者是意见和建议,可以给我们的公众号留言(现在并没有评论功能)。大家有什么想学的想懂的也欢迎留言提醒,我们会收集问题并发布文章来回答。
领取专属 10元无门槛券
私享最新 技术干货