简介

今天是只狼发售一周年,作为去年的goty,只狼最核心的系统莫过于弹反,笔者去年也是和弦一郎大战几百回合,通关之后很想实现以下弹反瞬间的效果。

最终实现效果如下:

Unity实现只狼弹反后处理效果

笔者不是专业技美,如有问题,欢迎指出。

实现思路

首先仔细观察一下只狼在弹反的瞬间是怎么一个过程

首先是,受到攻击的瞬间,这一瞬间,产生了火花,并从弹反中心扩散出了一道模糊波纹,特效大小占据屏幕接近一半

接着逐渐开始消散,火花熄灭,周边部分出现明显径向模糊效果

最后,中心开始逐渐清晰,到屏幕边缘的地方就基本消失了

总结起来就是从中心点开始,随着时间逐渐扩散

设计流程

特效部分我不是很擅长,所以就网上找了一个现成的卡通特效,我们这次就着重看一下后处理的部分。

径向模糊

首先我们实现一个由内到外扩张的一个整体径向模糊,方式也比较简单,先获取到弹反的中心点BlurCenter,然后在fragment阶段各个像素和他计算相对位置获得方向,对方向上的点采样取平均就可以了,核心代码如下:

fixed4 frag (v2f i) : SV_Target

{

//这里是为了让扩散为圆形而不是屏幕的比例,_Aspect是屏幕的宽高比 float2 p=i.uv*float2(_Aspect,1);

float2 dir =normalize(p-_BlurCenter);

dir*=_MainTex_TexelSize.xy;

//对方向上的点采样取平均 fixed4 col =tex2D(_MainTex,i.uv-dir*1) ;

col +=tex2D(_MainTex,i.uv-dir*2) ;

col +=tex2D(_MainTex,i.uv-dir*3) ;

col +=tex2D(_MainTex,i.uv-dir*5) ;

col +=tex2D(_MainTex,i.uv-dir*8) ;

col +=tex2D(_MainTex,i.uv+dir*1) ;

col +=tex2D(_MainTex,i.uv+dir*2) ;

col +=tex2D(_MainTex,i.uv+dir*3) ;

col +=tex2D(_MainTex,i.uv+dir*5) ;

col +=tex2D(_MainTex,i.uv+dir*8) ;

col *=0.1;

return col;

}

此时我们应用在unity中,效果如下:

原图:

区别还是挺大的,很明显有径向模糊的效果,有那种感觉了。

径向模糊优化

上面的实现是逐像素的采样,而如果用户的电脑分辨率非常高的话,或者说用户的电脑配置不够,或者我们的平台是手机,那么我们就要做一定的优化。

我们可以先降低图片的分辨率,然后再采样,比如1080变成540,甚至270p,这样我们就能够大大降低gpu的负担,不过会多一层pass

270p压缩图:

270p+径向模糊:

540p+径向模糊:

注意:对应不同的像素密度我们也要控制采样范围

相关的cs部分如下:

private void OnRenderImage(RenderTexture source, RenderTexture destination)

{

RenderTexture rt1 = RenderTexture.GetTemporary(source.width >> downSampleFactor, source.height >> downSampleFactor, 0, source.format);

RenderTexture rt2 = RenderTexture.GetTemporary(source.width >> downSampleFactor, source.height >> downSampleFactor, 0, source.format);

Graphics.Blit(source, rt1);

//使用降低分辨率的rt进行模糊:pass0 Graphics.Blit(rt1, rt2, material, 0);

//使用rt2和原始图像lerp:pass1 material.SetTexture("_BlurTex", rt2);

Graphics.Blit(source, destination, material, 1);

//释放RT RenderTexture.ReleaseTemporary(rt1);

RenderTexture.ReleaseTemporary(rt2);

}

波纹扩散

为了做更好的过渡以及定制化,我们使用unity的curve来实现当前径向贴图的采样程度

同时,为了更好的性能,我们应该把这部分计算放在gpu部分,可以采用生成贴图的方法:

private void Start()

{

//初始化振幅贴图(也就是把waveform曲线初始化到gradTexture上面) gradTexture = new Texture2D(1024, 1, TextureFormat.Alpha8, false);

gradTexture.wrapMode = TextureWrapMode.Clamp;

gradTexture.filterMode = FilterMode.Bilinear;

for (var i = 0; i < gradTexture.width; i++)

{

var x = 1.0f / gradTexture.width * i;

var a = curve.Evaluate(x);

gradTexture.SetPixel(i, 0, new Color(a, a, a, a));

}

gradTexture.Apply();

//初始化material material = new Material(PointBlurShader);

material.hideFlags = HideFlags.DontSave;

material.SetTexture("_GradTex", gradTexture);

}

这样,shader部分就得到了当前曲线上所有的数据,存储在了_GradTex中。

最终,我们在frag部分完成当前的采样,相关代码如下

//计算当前像素点的采样程度,_Timer为特效产生开始的计时float GetBlurPercent(float2 pos){

//计算当前时间以及像素为主下,对应的曲线横坐标t float t=_Timer-length(pos-_BlurCenter)/_BlurSpeed;

//如果要让这个波纹的宽度变大可以调整BlurCircleRadius t*=1/_BlurCircleRadius;

//获取对应值 return tex2D(_GradTex,float2(t,0)).a;

}

fixed4 frag_mix (v2f_lerp i) : SV_Target{

fixed4 rawCol = tex2D(_MainTex, i.uv1);

fixed4 blurCol = tex2D(_BlurTex, i.uv2);

fixed4 col = lerp(rawCol,blurCol,_BlurStrength

//获取当前像素点在曲线上的值 *GetBlurPercent(i.uv1*float2(_Aspect,1))

//范围限制,调整BlurRange可以控制波的大小 *min(_BlurRange/length(i.uv1*float2(_Aspect,1)-_BlurCenter),1));

return col;

}

特效

后处理的部分就基本完成了,然后我们加上一些lensflare和particle,我们的效果就完成了~调的参数有点高,狼都看不清了2333

应用

我观察了很多游戏,尤其是动作游戏,在径向模糊这块几乎是一个必备的要素,而且反馈感非常高,可以把打击感提高好几个层次。

怪物猎人

生化危机

鬼泣

要问为啥都是卡婊的游戏,我也不知道。

结语

项目原工程地址:github.com/cyclons/Seki

相比于写游戏逻辑,写shader还是非常享受的一个过程,编译快,反馈强,唯一比较难受的还是ide吧。

感谢观看!

参考文章

声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。

作者:joker

来源:https://zhuanlan.zhihu.com/p/115272047

More:【微信公众号】u3dnotes

unity脚本控制逐渐消失_Unity实现只狼弹反后处理效果相关推荐

  1. unity脚本控制逐渐消失_Unity实现模型逐渐消失及逐渐出现

    using UnityEngine; using System.Collections; public class Fade : MonoBehaviour { float tempTime; voi ...

  2. unity脚本控制逐渐消失_Unity实现物体逐渐消失(逐渐出现)

    原理很简单,就是通过改变目标物体的Alpha值.但是要求材质的类型是Transparent/Diffuse 有用的地方在代码中标注了,直接贴代码 using UnityEngine; using Sy ...

  3. Unity 脚本控制Spine播放动画

    1.定义 public SkeletonAnimation ani_DaJingYu; 2.这个方法为播放完正在播放的动作后播放下此动作.第一个参数作用不详,第二个参数为动画名称应该为字符串,这里我我 ...

  4. unity脚本 --- 控制物体(游戏对象)移动

    一.键盘WSAD控制移动 void Update() {float horizontal = Input.GetAxis("Horizontal");float vertical ...

  5. Unity脚本控制更换材质球

    定义游戏对象和材质球对象: //游戏对象public GameObject dianji01; //材质public Material dongtai; 一句话更换材质球 guandao1.GetCo ...

  6. 【Unity 工具,简单学习】DoTween,脚本控制动画工具

    DOTween:脚本控制动画工具 简单介绍 安装 简单使用 eg.1 简单移动,跳动 eg2. 缓动 Easing(动画插值) eg3. 循环 Looping eg4. 变换颜色,变换大小 eg5. ...

  7. [Unity][ShaderGraph][FlowCanvas] SetFloat 无效:通过脚本控制 shader 的动态参数时需要使用参数的引用名

    我的 shader 很简单,就是一个 tiling and offset 制作滚动效果 然后我想用一个脚本控制 speed 但是实际运行没有起效果 一开始我看的这个,然后用的 sharedmateri ...

  8. Unity Timeline运行时脚本控制Mute和UnMute(Mute/UnMute a timeline track via scripting)

    Unity Timeline运行时脚本控制Mute和UnMute 最近遇到了一个问题就是希望能够在运行时脚本控制Timeline特定轨道的mute和unmute,本来以为是一个很简单的问题,结果发现并 ...

  9. Unity(三十七):3D模型动画、脚本控制模型骨骼IK动画

    效果(左侧模型动画,右侧模型IK控制) 模型动画下载及导入 推荐模型动画下载链接地址 https://actorcore.reallusion.com/ Unity导入教程参见以下链接地址(需要科学上 ...

最新文章

  1. ENC28j60以太网芯片驱动程序简介
  2. R语言使用caret包对GBM模型自定义参数调优:自定义优化参数网格、可视化核心参数与评估指标关系、Accuracy与树的深度、个数的关系、Kappa与树的深度、个数的关系
  3. 占用过高_Windows10电脑磁盘占用率过高,用这二招轻松解决
  4. C++golden section search黄金分割搜索的实现算法(附完整源码)
  5. 最速下降法steepest descent详细解释
  6. 如何获取百度文库中的文章【原创】
  7. ret php,php生成器的send方法详解,php yield send
  8. java treeset排序_java TreeSet的排序之自然排序
  9. 六千字干货文:到底要怎么去学算法?
  10. Go语言使用PostgreSQL数据库
  11. Docker与容器化-01-Docker简介及Docker在CentOS7环境下安装
  12. 拓端tecdat|R语言泊松Poisson回归模型分析案例
  13. 20162327WJH 实验三 《敏捷开发与XP实践》 实验报告
  14. COOKIE与SESSION比较
  15. 华为、海尔之后,阿里在全屋智能领域有新动作,这次牵手的是萤石
  16. 首届中国移动互联网直播行业峰会在京召开
  17. 第三章 opengl之着色器
  18. 解决使用高分辨率笔记本分辨率放大100%以上运行程序界面控件不跟随方大方式qt+gtk+ui
  19. 联想LJ2400激光打印机开机4灯闪烁维修分析
  20. maven私服下载jar包失败的问题记载

热门文章

  1. 清华大学生反CNN网站被黑 创始人呼吁提供技术支援
  2. PPPOE和DCHP获得IP地址的方式
  3. [RK3399[NanoPC-T4][Android-Q]强调色
  4. 疾风之刃鸿蒙炸裂,《疾风之刃》天武僧二觉将开 12.1正式上线
  5. 分数的乘法公式是什么
  6. 推动量子计算与AI融合,飞桨成为中国首个支持量子机器学习的深度学习平台
  7. 文创设计结论_2019上海国际高中艺术offer大盘点!设计界哈佛罗德岛的offer都给了谁?...
  8. 基于LOAM框架的激光SLAM开源程序集合
  9. 我的第一个应用(三)
  10. DNA的限制性内切酶酶切反应