角色Shader的动效需求

角Shader的开发不知要实现最基础光照等功能, 可能还要在角色武器的Shader增加多种动效, 比如因武器品质区分的流光特效, 被技能击中时的冻结效果.
这类动效的实现方式有多种, 以下以Shader的方式实现下列三种:

  • 流光
  • 溶解

开发思路

具体效果

  • 流光

    两层
    Alpha控制范围

  • matcap实现

  • 溶解

    支持溶解边缘亮边
    step(fixed2(noise, noise+edge), _Dissolve)

对需要实现的效果进行排序

实现这些需求的过程上来说, 肯定是一层一层在基础效果只上叠加上去的,相互之间是有"覆盖"关系的, 于是我们将以上需求排列整理如下:

  • 光照
  • 流光
  • 溶解

2. Shader代码的实现

1. 封装

#ifndef MESH_FX_CORE_INCLUDED
#define MESH_FX_CORE_INCLUDED #ifdef MESH_FX_ON
uniform float4 _EdgeColor;
uniform sampler2D _DissolveNoiseTex;
uniform float4 _DissolveNoiseTex_ST;
uniform float _DissolveWidth;
uniform float _Dissolve; uniform sampler2D _MatcapTex ;
uniform float _MatcapIntensity; uniform float4 _FlowColor;
uniform sampler2D _FlowTex ;
uniform float4 _FlowTexTiling ;
uniform float4 _Flow1Color;
uniform sampler2D _FlowTex1 ;
uniform float4 _FlowSpeed ;
uniform float _FlowIntensity ; struct MeshFXData
{
float2 UV0;
float3 normalWorld;
fixed3 BaseColor;
}; fixed4 FX_Dissolve(MeshFXData fx)
{
float2 uv_DissolveNoiseTex = fx.UV0 * _DissolveNoiseTex_ST.xy + _DissolveNoiseTex_ST.zw;
float4 dissolveTexCol = tex2D(_DissolveNoiseTex, uv_DissolveNoiseTex);
float2 twoLayer = float2(dissolveTexCol.r, saturate(dissolveTexCol.r + _DissolveWidth));
float2 dissolveResult = step(twoLayer, _Dissolve.xx);
float4 finalCol = _EdgeColor * (dissolveResult.x - dissolveResult.y) * dissolveTexCol.r;
finalCol.a = saturate(dissolveResult.x);
return finalCol;
} fixed4 FX_Frozen(MeshFXData fx)
{
float2 matCapUV = ((mul(UNITY_MATRIX_V, float4(fx.normalWorld, 0.0)).xyz * 0.5) + 0.5).xy;
float4 finalCol = tex2D(_MatcapTex, matCapUV);
finalCol.a = _MatcapIntensity;
return finalCol;
} fixed4 FX_LightFlow(MeshFXData fx)
{
float2 uv0 = fx.UV0 * _FlowTexTiling.xy + (_Time.y * _FlowSpeed.xy);
fixed4 flowCol1 = tex2D(_FlowTex, uv0);
fixed mask1 = tex2D(_FlowTex, fx.UV0.xy).a; // float2 uv1 = fx.UV0 * _FlowTexTiling.zw + (_Time.y * _FlowSpeed.zw);
fixed4 flowCol2 = tex2D(_FlowTex1, uv1);
fixed mask2 = tex2D(_FlowTex1, fx.UV0.xy).a; fixed4 layer1 = flowCol1 * mask1 * _FlowColor;
fixed4 layer2 = flowCol2 * mask2 * _Flow1Color;
fixed4 col = (layer1 + layer2) * _FlowIntensity;
col.a = max(flowCol1.a, flowCol2.a);
return col;
} fixed4 MeshFXInternal(MeshFXData fx)
{
fixed4 finalColor = fixed4(0, 0, 0, 0); fixed4 Dissolve = FX_Dissolve(fx);
fixed4 Frozen = FX_Frozen(fx);
fixed4 LightFlow = FX_LightFlow(fx); // lightflow -> frozen -> dissolve //lightflow
finalColor.rgb = fx.BaseColor + LightFlow.rgb * fx.BaseColor * 2; //matcap frozen
finalColor.rgb = lerp(finalColor.rgb, Frozen.rgb, Frozen.a); //dissolve
finalColor.rgb = finalColor + Dissolve.rgb;
finalColor.a = Dissolve.a;
return finalColor;
}
#endif
#endif

2. 调用

#if defined(MESH_FX_ON)
MeshFXData fx = (MeshFXData)0;
fx.UV0 = i.tex.xy;
fx.normalWorld = s.normalWorld;
fx.BaseColor = Color.rgb;
Color = MeshFXInternal(fx);
#endif

3. ShaderGUI的实现

体力活

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

角色和武器Shader特效开发的更多相关文章

  1. 我利用网上特效开发的Jquery插件

    我利用网上特效开发的Jquery插件 代码如下 (function($){ $.fn.Dialogx = function(options) { var defaults={ Width:" ...

  2. Javascript网页特效开发技巧

    Javascript网页特效开发技巧 相信很多人跟我一样,做网站开发已经有两到三年了,但大部分时间还是复制别人的代码,虽然能看懂别人的代码,同时也觉得别人写的代码很简单,但自己却写不出来: 我总结了一 ...

  3. [原]Unity3D深入浅出 - Shader基础开发

    概述 简单来讲,shader是为渲染管线中的特定处理截断提供算法的一段代码.Shader是伴随着可编程渲染管线出现的,开发者可使用Shader对渲染过程加以控制,拥有更大的创作控件,因此Shader的 ...

  4. C++游戏系列2:角色装备武器

    很多其它见:C++游戏系列文件夹 知识点:类的组合,A类的数据成员.是B类的对象,或B类的对象.做A类的数据成员 [项目-带武器的游戏角色] 设计一个武器类,其数据成员至少要有武器名.威力,还能够加上 ...

  5. [Unity3D]Unity3D游戏开发之刀光剑影特效的实现

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 我实在不明确有的人为什么不喜欢武侠/仙侠类游戏,也许是因为武侠/仙侠类游戏身上被永远烙上的国 ...

  6. Unity3D着色器Shader编程入门(一)

    自学Unity3D也有大半年了,对Shader一直不敢入坑,最近看了些资料,以及通过自己的实践,对Shader还是有一点了解了,分享下仅作入门参考. 因Shader是对图像图像渲染的,学习前可以去了解 ...

  7. S老师 Shader 学习

    Mesh Filter : 存储一个Mesh(网格,模型的网格,就是模型的由哪些三角面组成,组成一个什么样子的模型,三角面的一些顶点信息) Mesh Renderer:用来渲染一个模型的外观,就是样子 ...

  8. 关于Unity中Shader的基础认识

    Shader也叫着色器,是Unity里面比较难的一个点,网上有很多别人写好的shader,我们可以下载下来用或者修改学习. Shader可以做出很多非常不错的效果,因为它是插在渲染管道里面的程序,一来 ...

  9. 【Shader】这是一篇记录随笔,我要开始学Shader了!

    背景: 前天学校有场招聘会,转了一圈只看到一家和unity有关的公司,还是做VR游戏的,然后HR也很好说话.和我说话的HR正好是做UnityVR方面的,聊了会受益匪浅,自己就像是找到了方向似的,突然很 ...

随机推荐

  1. SQL触发器与CLR的使用

    在数据库的日常操作中,面对复杂业务的情况下,总会有用sql语句或存储过程不是那么方便的时候,所以这时候就会想到在数据库中调用CLR,也就是调用程序集,此处用C#实现来讲解一个测试案例 测试案例的业务是 ...

  2. Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

  3. 浅析Java CompletionService

    JDK的CompletionService提供了一种将生产新的异步任务与使用已完毕任务的结果分离开来的服务.生产者 submit 运行的任务.使用者 take 已完毕的任务,并依照完毕这些任务的顺序处 ...

  4. Kubernetes中的资源调度与资源管理

    一.scheduling:把pod放到node上 1.最小调度单元:pod 2.1.8的版本后,最大支持5000个node 3.scheduling由两个部分组成: 3.1 Predicates:过滤 ...

  5. c++ 堆和栈以及区别

    c++中内存分成5个区:堆.栈.自由存储区.全局\静态存储区.常量存储区 栈是一种连续存储的数据结构,具有先进后出的性质.堆是一种非连续的树形存储数据结构,每个节点有一个值,整棵树是经过排序的,特点是 ...

  6. mysql因为服务器异常关机倒是启动不了 找不到mysql.sock

    今天mysql服务器突然异常关机,查看云平台发现该vm处于为开机状态切状态是无法启动,经过协调, 服务器启动了.但是进行service mysql start 启动时.提示错误: Starting M ...

  7. django 表结构

    django 表结构 一:查看orm写的sq语句:如果对某个语句不清楚的话可以调用queryset的的query方法来查看sql. 1 obj=Hostinfo.objects.filter(id=v ...

  8. C语言程序设计I—第六周教学

    第六周教学总结(8/10-14/10) 教学内容 第二章 用C语言编写程序 2.4 输出华氏-摄氏温度转换表 课前准备 在蓝墨云班课发布资源: PTA:2018秋第六周作业 分享码:88C28D89E ...

  9. Ext4文件系统架构分析(三) ——目录哈希、扩展属性与日志

    struct dx_root Htree的内部节点: struct dx_node Htree 树根和节点中都存在的 Hash map: struct dx_entry 1.20 扩展属性EA 扩展属 ...

  10. jQuery----jquery实现Tab键切换

    使用Jquery实现tab键切换,代码简洁易懂,实现逻辑清晰明了.具体总结如下: 需求分析: 鼠标进入tab切换模块,鼠标当前的模块上边框变为红色,并显示对应的商品名称.鼠标离开后,上边框恢复原色,图 ...