这两天实现了下新手引导需要的遮罩镂空shader效果,记录一下。

1、圆形镂空shader代码:

//计算片元世界坐标和目标中心位置的距离
float dis = distance(IN.worldPosition.xy, _Center.xy);
//过滤掉距离小于(半径-过渡范围)的片元
clip(dis - (_Radius - _TransitionRange));
//优化if条件判断,如果距离小于半径则执行下一步,等于if(dis < _Radius)
fixed tmp = step(dis, _Radius);
//计算过渡范围内的alpha值
color.a *= (1 - tmp) + tmp * (dis - (_Radius - _TransitionRange)) / _TransitionRange;

效果:忽略渐变的蒙版,随便找的图片

2、椭圆镂空shader代码:

//计算X轴方向距离
float disX = distance(IN.worldPosition.x, _Center.x);
//计算Y轴方向距离
float disY = distance(IN.worldPosition.y, _Center.y);
//运用椭圆方程计算片元的alpha值,_Ellipse为椭圆系数
fixed factor = clamp(pow(abs(disX / _Width), _Ellipse) + pow(abs(disY / _Height), _Ellipse), 0.0, 1.0);
//优化if条件判断
fixed tmp = step(factor, 1.0f);
//赋值椭圆外或椭圆内的alpha值
color.a *= (1 - tmp) + tmp * factor;

效果:

3、圆形目标位置聚合动画shader代码:

//_StartTime为效果开始时间点,Unity中对应赋值material.SetFloat("_StartTime", Time.timeSinceLevelLoad);
fixed processTime = _Time.y - _StartTime;
//判断shader执行时长是否超过_TotalTime
clip(_TotalTime - processTime);
//优化if条件判断
fixed tmp = step(processTime, _ReduceTime);
//计算当前时间点的圆形镂空半径
float curRadius = (1 - tmp) * _Radius + tmp * (_MaxRadius - (_MaxRadius - _Radius) * processTime / _ReduceTime);
float dis = distance(IN.worldPosition.xy, _Center.xy);
//抛弃距离小于当前圆形镂空半径的片元
clip(dis - curRadius);

效果:不知道为啥上传上来就有问题了,正常是没问题的

整个shader源码,在Unity UGUI 自带Default shader基础上添加:

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "UI/Default_Mask"
{Properties{[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}_Color ("Tint", Color) = (1,1,1,1)_StencilComp ("Stencil Comparison", Float) = 8_Stencil ("Stencil ID", Float) = 0_StencilOp ("Stencil Operation", Float) = 0_StencilWriteMask ("Stencil Write Mask", Float) = 255_StencilReadMask ("Stencil Read Mask", Float) = 255_ColorMask ("Color Mask", Float) = 15[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0//-------------------add----------------------_Center("Center", vector) = (0, 0, 0, 0)_Radius("Radius", Range(0,1000)) = 1000 // sliders_TransitionRange("Transition Range", Range(0, 100)) = 10_Width("Width", Float) = 1_Height("Height", Float) = 1_Ellipse("Ellipse", Float) = 4_ReduceTime("ReduceTime", Float) = 1_TotalTime("TotalTime", Float) = 1_StartTime("StartTime", Float) = 0_MaxRadius("MaxRadius", Float) = 1500[KeywordEnum(ROUND, ELLIPSE, DYNAMIC_ROUND)] _RoundMode("Mask mode", Float) = 0//-------------------add----------------------}SubShader{Tags{"Queue"="Transparent""IgnoreProjector"="True""RenderType"="Transparent""PreviewType"="Plane""CanUseSpriteAtlas"="True"}Stencil{Ref [_Stencil]Comp [_StencilComp]Pass [_StencilOp]ReadMask [_StencilReadMask]WriteMask [_StencilWriteMask]}Cull OffLighting OffZWrite OffZTest [unity_GUIZTestMode]Blend SrcAlpha OneMinusSrcAlphaColorMask [_ColorMask]Pass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"#include "UnityUI.cginc"#pragma multi_compile __ UNITY_UI_CLIP_RECT#pragma multi_compile __ UNITY_UI_ALPHACLIP#pragma multi_compile _ROUNDMODE_ROUND _ROUNDMODE_ELLIPSE _ROUNDMODE_DYNAMIC_ROUNDstruct appdata_t{float4 vertex   : POSITION;float4 color    : COLOR;float2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float4 vertex   : SV_POSITION;fixed4 color    : COLOR;float2 texcoord  : TEXCOORD0;float4 worldPosition : TEXCOORD1;UNITY_VERTEX_OUTPUT_STEREO};fixed4 _Color;fixed4 _TextureSampleAdd;float4 _ClipRect;//-------------------add----------------------half _Radius;float2 _Center;half _TransitionRange;half _Width;half _Height;half _Ellipse;fixed _ReduceTime;half _TotalTime;float _StartTime;half _MaxRadius;//-------------------add----------------------v2f vert(appdata_t v){v2f OUT;UNITY_SETUP_INSTANCE_ID(v);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);OUT.worldPosition = v.vertex;OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);OUT.texcoord = v.texcoord;OUT.color = v.color * _Color;return OUT;}sampler2D _MainTex;fixed4 frag(v2f IN) : SV_Target{half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;#ifdef UNITY_UI_CLIP_RECTcolor.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);#endif#ifdef UNITY_UI_ALPHACLIPclip (color.a - 0.001);#endif//-------------------add----------------------
#ifdef _ROUNDMODE_ROUND//计算片元世界坐标和目标中心位置的距离float dis = distance(IN.worldPosition.xy, _Center.xy);//过滤掉距离小于(半径-过渡范围)的片元clip(dis - (_Radius - _TransitionRange));//优化if条件判断,如果距离小于半径则执行下一步,等于if(dis < _Radius)fixed tmp = step(dis, _Radius);//计算过渡范围内的alpha值color.a *= (1 - tmp) + tmp * (dis - (_Radius - _TransitionRange)) / _TransitionRange;
#elif _ROUNDMODE_ELLIPSE//计算X轴方向距离float disX = distance(IN.worldPosition.x, _Center.x);//计算Y轴方向距离float disY = distance(IN.worldPosition.y, _Center.y);//运用椭圆方程计算片元的alpha值,_Ellipse为椭圆系数fixed factor = clamp(pow(abs(disX / _Width), _Ellipse) + pow(abs(disY / _Height), _Ellipse), 0.0, 1.0);//优化if条件判断fixed tmp = step(factor, 1.0f);//赋值椭圆外或椭圆内的alpha值color.a *= (1 - tmp) + tmp * factor;
#else//_StartTime为效果开始时间点,Unity中对应赋值material.SetFloat("_StartTime", Time.timeSinceLevelLoad);fixed processTime = _Time.y - _StartTime;//判断shader执行时长是否超过_TotalTimeclip(_TotalTime - processTime);//优化if条件判断fixed tmp = step(processTime, _ReduceTime);//计算当前时间点的圆形镂空半径float curRadius = (1 - tmp) * _Radius + tmp * (_MaxRadius - (_MaxRadius - _Radius) * processTime / _ReduceTime);float dis = distance(IN.worldPosition.xy, _Center.xy);//抛弃距离小于当前圆形镂空半径的片元clip(dis - curRadius);
#endif//-------------------add----------------------return color;}ENDCG}}
}

Unity Shader 新手引导效果相关推荐

  1. [Unity Shader]凌波微步效果

    [Unity Shader]凌波微步效果 相信很多人都看过天龙八部,里面的段誉有一个技能就是凌波微步:移动的时候人先到,衣角跟随其后.说白了就是移动时有一个残影跟着他.下面先看下最终效果 下面我们看如 ...

  2. Unity Shader 动画效果出现残影

    问题 复现<Unity Shader入门精要>的动画效果时,我发现我的动画都出现了残影. 一开始认为是程序写错了,采样出现了问题,但是复查对比其他资料很多遍也没发现错误. 解决方法 后来反 ...

  3. Unity Shader放大镜效果

    小菜最近看到了一篇关于Shader实现的放大镜效果,酷炫的效果让小菜倍生好奇,冲动之下还是搬来练练手,刚好巩固下自己的顶点片元着色器编码. 有没有想学习的冲动!!! 文章的开始先来介绍一款好用的vs编 ...

  4. unity Shader 扭曲效果

    原理 所谓扭曲就是扰动一个物体的uv坐标,表现出来就是一个扰动效果,如火焰扭曲空气,和水波对水底的影响. 1. 在shader 中我们需要一张当前渲染的纹理 2. 给一个物体渲染并使用当前纹理,用屏幕 ...

  5. Unity Shader - 描边效果

    原文链接:http://blog.csdn.net/puppet_master/article/details/54000951 简介 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个 ...

  6. Unity Shader透明效果

    在实时渲染中要实现透明效果,通常会在渲染模型时控制他的透明通道.当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性--透明度.当透明度为1时表示该像素是完全 ...

  7. Unity Shader 贴花效果(一)

    本文实现的是一个Mesh Decal方法的贴花方案,参考了本篇博文链接: unity的贴花方案.链接的文章是转载的,我并没有找到原文地址.本篇文章主要是学习和自己的理解为主. 先看未贴花之前的效果 这 ...

  8. 【Unity Shader 消融效果_案例分享】

    1.实现逻辑 消融效果主要是利用了Shader中的clip()函数,也就是透明测试功能,在ASE中叫"Opacity Mask". 消融效果是基于一张"Noise&quo ...

  9. 【Unity Shader 描边效果_案例分享】

    1.实现逻辑 描边效果Shader有多种实现方式,可以通过后处理和MatCap实现. 这次主要想展示的是通过两个Pass实现. 当Shader中有多个Pass时,渲染流程会安装顺序依次执行,于是后面的 ...

最新文章

  1. Latex之WinEdt编辑界面的自动换行
  2. linux socket 时间,Socket编程获取服务器时间
  3. 学会python编程容易吗-Python编程入门难不难
  4. web.xml还不会配置编码过滤器?
  5. python二维列表做参数_python sum函数iterable参数为二维list,start参数为“[]”该如何理解...
  6. 洛谷 P1506 拯救oibh总部-dfs染色法
  7. linux下web压力测试工具ab使用及详解
  8. 数据结构之选择排序:堆排序
  9. Tensorflow卷积神经网络
  10. 微信公众号迁移流程参考
  11. SKLEARN实例:【用随机森林回归填补缺失值】
  12. 从开发应用的角度来看,物联网的关键技术包括哪几个方面?
  13. 2022-2027年中国海参行业市场深度分析及投资战略规划报告
  14. Android 百度地图反向Geo “PERMISSION UNFINISHED“
  15. 如何找到能商用的背景纯音乐
  16. 石家庄地铁查询双人项目进度总结
  17. 动态站点:部署论坛系统Discuz!
  18. RVV线与RV线有什么区别
  19. noip2003侦探推理详解
  20. Mysql 报错Duplicate entry '值' for key '字段名'的解决

热门文章

  1. 小熊录屏剪辑视频多能破J版
  2. 计算机应用基础在线3,计算机应用基础3(答案).doc
  3. 香港城市人文旅拍Lightroom预设APP滤镜与视频调色LUT预设
  4. 令人捧腹大笑的QQ个性签名:我爸有钱不单身,我单身没有钱
  5. win10清理_win10安全清理小建议
  6. 项目管理PMP多大作用?
  7. Android TV开发 视频窗口选中放大效果的实现
  8. 金融行业中的AI、IB、VC和PE分别代表什么
  9. c语言单播,OSPF单播、多播及网络类型
  10. AndroidGradle基础——渠道化配置