效果:

案例:新仙剑,王者之剑。
在切换场景的时候,就会有这样的全屏扭曲效果。

思路:
1.用GrabPass抓屏到一张纹理中。
2.进行扭曲,绘制到UGUI的Image上。

准备:
去官网下载Unity内置Shader,当前最新版本:builtin_shaders-5.3.1f1
http://unity3d.com/cn/get-unity/download/archive
里面有Image用的默认Shader:Sprites-Default
我们要在这个shader的基础上加上扭曲效果。

GrabPass比较耗,加上我没有好看的场景,这里就用一张全屏的背景图进行扭曲了。
代码中//–add 就是在原来基础上添加部分

Shader "Custom/ImageSwirl"
{
Properties
{
[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
_Color("Tint", Color) = (,,,)
[MaterialToggle] PixelSnap("Pixel snap", Float) =
} SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
} Cull Off
Lighting Off
ZWrite Off
Blend One OneMinusSrcAlpha //-----add
GrabPass
{
"_MyGrabTex"
}
//--------- Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ PIXELSNAP_ON
#include "UnityCG.cginc" struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
}; struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
}; fixed4 _Color; //------------add
float _Radius;
float _Angle;
sampler2D _MyGrabTex;
float2 swirl(float2 uv);
float2 swirl(float2 uv)
{
//先减去贴图中心点的纹理坐标,这样是方便旋转计算
uv -= float2(0.5, 0.5); //计算当前坐标与中心点的距离。
float dist = length(uv); //计算出旋转的百分比
float percent = (_Radius - dist) / _Radius; if (percent < 1.0 && percent >= 0.0)
{
//通过sin,cos来计算出旋转后的位置。
float theta = percent * percent * _Angle * 8.0;
float s = sin(theta);
float c = cos(theta);
//uv = float2(dot(uv, float2(c, -s)), dot(uv, float2(s, c)));
uv = float2(uv.x*c - uv.y*s, uv.x*s + uv.y*c);
} //再加上贴图中心点的纹理坐标,这样才正确。
uv += float2(0.5, 0.5); return uv;
}
//--------------- v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color * _Color;
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap(OUT.vertex);
#endif return OUT;
} sampler2D _MainTex;
sampler2D _AlphaTex;
float _AlphaSplitEnabled; fixed4 SampleSpriteTexture(float2 uv)
{
fixed4 color = tex2D(_MainTex, uv); //----------modify
//fixed4 color = tex2D(_MyGrabTex, float2(uv.x,1-uv.y));
//----------- #if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
if (_AlphaSplitEnabled)
color.a = tex2D(_AlphaTex, uv).r;
#endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED return color;
} fixed4 frag(v2f IN) : SV_Target
{
//---add
IN.texcoord = swirl(IN.texcoord);
//-------- fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
c.rgb *= c.a;
return c;
}
ENDCG
}
}
}

核心:

//uv = float2(dot(uv, float2(c, -s)), dot(uv, float2(s, c)));
uv = float2(uv.x*c - uv.y*s, uv.x*s + uv.y*c);

我的另一篇文章:基础知识:Q&A 中有对旋转矩阵进行简单推导。

C#脚本:以时间驱动来增长角度和半径

using UnityEngine;
using System.Collections;
using UnityEngine.UI; public class Swirl : MonoBehaviour
{
float angle = ;
float radius = 0.1f;
Material mat;
void Start ()
{
mat = this.GetComponent<Image>().material; //延迟2秒开始,每隔0.2s调用一次
InvokeRepeating("DoSwirl", 2f, 0.2f);
} void DoSwirl()
{
angle += 1f;
radius += 0.1f; mat.SetFloat("_Angle",angle);
mat.SetFloat("_Radius",radius); //rest
if (radius >= 0.6f)
{
angle = ;
radius = 0.1f;
}
}
}

Shader实例:扭曲,漩涡的更多相关文章

  1. Shader实例:NGUI制作网格样式血条

    效果: 思路: 1.算出正确的uv去采样过滤图,上一篇文章说的很明白了.Shader实例:NGUI图集中的UISprite正确使用Shader的方法 2.用当前血量占总血量的百分比来设置shader中 ...

  2. 【OpenGL】Shader实例分析(七)- 雪花飘落效果

    转发请保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一个雪花飘落效果.感觉挺不错的.分享给大家,效果例如以下: 代码例如 ...

  3. 关于Unity中顶点片元Shader实例

    补充 float4 fixed4 _Time 1: float4是内置向量 (x, y, z, w); float4 a; 访问单独成员a.x, a.y, a.z, a.w;2: fixed4 是内置 ...

  4. 【OpenGL】Shader实例分析(六)- 卡牌特效

    转发请保持地址:http://blog.csdn.net/stalendp/article/details/30989295 本文将介绍怎么通过alpha通道来隐藏信息.并实现卡牌特效. 执行效果例如 ...

  5. Shader实例:NGUI图集中的UISprite正确使用Shader的方法

    效果: 变灰,过滤,流光 都是UI上常用效果. 比如: 1.按钮禁用时,变灰. 2.一张Icon要应付圆形背景框,又要应付矩形背景框.就要使用过滤的方式来裁剪. 避免了美术提供两张icon的麻烦,又节 ...

  6. Shader实例:序列帧动画

    效果: 序列帧图片网上随便找的,质量不是很好,重点不是它,不要在意. 思路: 1.之前都是在一张面片上直接映射一张纹理,IN.uv的范围是0~1 现在要映射一张纹理上的一小块区域,就要用这块区域的uv ...

  7. Shader实例:溶解效果(Dissolve)

    效果: 图左:一道金光闪过,瞬间灰飞烟灭 图右:燃烧效果,先过渡到黄色,然后渐渐过渡到黑色,最后消失殆尽. 这是游戏中常见的效果,各位可以想想自己玩过的游戏. 手头正在玩的,梦三国手游,死亡的时候就是 ...

  8. Shader实例:边缘发光和描边

    效果图: 1.边缘发光 思路:用视方向和法线方向点乘,模型越边缘的地方,它的法线和视方向越接近90度.点乘越接近0 那么用 1-减去上面点乘的结果,来作为颜色分量,来反映边缘颜色强弱. Shader ...

  9. Shader实例:2D流光

    准备: 1.一张背景图 2.一张流光图 3.一张过滤图 like this: 效果: 代码: Shader "Custom/2d_flow" { Properties { _Mai ...

随机推荐

  1. shell 脚本中的运算

    #!/bin/bash read -p "please Insert two integer values: " a b if [ ! -n "$a" -o ! ...

  2. Node.js配合node-http-proxy解决本地开发ajax跨域问题

    情景: 前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法: 1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. ...

  3. bootStrap树形目录组件

    需求描述 产品添加页面,需要选择车型.在bootStrap的modal上弹出子modal来使用.车型一共有4级目录.要使用目录树.然后分活动和商品两种,需要能够通过不通参数来调用该组件.车型品牌要使用 ...

  4. Docker - 入门

    术语 1. 镜像(image)与容器(container) 镜像是指文件系统快照或tar包. 容器是指镜像的运行态(时) 2.宿主机管理 设置/配置一台物理服务器或虚拟机,以便用于运行Docker容器 ...

  5. 算法练习_图的连通性问题(JAVA)

    一.问题 1.问题描述: 有n个点(1...n),输入整数对(8,9),表示8,9点之间存在相互的连接关系. 动态连通性问题--编写一段程序过滤掉所以无意义的整数对,即为在不破坏图连通性的前提下,以最 ...

  6. gnuWin32-mini-2016.10.30

    2016-10-28 04:48 1,017,856 awk.exe ver 4.1.4 2016-10-29 00:26 77,312 bc.exe ver 1.06 2016-10-30 01:4 ...

  7. ZOJ 3871 Convex Hull(计算几何、凸包)

    题意:给n个点,|x[i]|,|y[i]| <= 1e9.求在所有情况下的子集下(子集点数>=3),凸包的面积和. 这题主要有几个方面,一个是凸包的面积,可以直接用线段的有向面积和求得,这 ...

  8. Shell 获取指定行的内容

    需求: 有一个文件,根据指定的字符串,得到该字符串上两行的内容. 文件内容如下: linux-56:# cat sys.ttconnect.ini # Copyright (C) 1999, 2006 ...

  9. Ubuntu 16.04 安装ftp服务器

    1.sudo apt-get update 2.sudo apt-get install vsftpd ,执行完该步骤,vsftpd服务已经安装 3.创建ftp用户 a,创建用户目录 sudo mkd ...

  10. ADO 连接数据库,取到VT_DATE型日期转换成 int型

    DATE dt = vDate;(vDate是从数据库取出来的值,类型为_variant_t) COleDateTime odt = COleDateTime(dt); CString strdate ...