Shader Wave
Shader Wave

一、原理
1. 采用 UV 坐标为原始数据,生成每一条波浪线。
2. 使用 Unity 的 Time.y 作为时间增量,动态变换波形。
二、操作步骤
1. 首先使用纹理坐标生成一条线;

纹理坐标左下角为(0,0),右上角为(1,1),我们先把纹理坐标的中心位置(0,0)移动到图中(0.5,0.5)的位置。 即纹理坐标范围由[0,1]变换到[-1,1]。
float2 uv = i.uv;
uv = uv*2.0 -1.0;
接着,缩小Y方向的值,例如我们缩小150倍。那么现在Y的范围变换为[-150,150]。在着色器中,只有[0,1]范围类的值会被映射在正常的颜色空间,大于1的值,颜色空间按照1的值处理,小于0的值按0处理。现在我们关心[0,150]范围类的值。用颜色来表示,就是黑色到白色的过度,其中白色占的比例比 149/150 还要多。我们需要的是[0,1]之间的值,进行填充,着色。我们将该区域的 uv.y 的值[0,150]取倒数。同理,负值区域一样,只是多取了绝对值。
float wave_width;
wave_width = abs(1.0 / (150.0 * uv.y));
2. 现在让直线变成波形,利用uv.x的增量,产生波形,在使用Time.y的时间增量,让波运动起来。
float wave_width;
float3 color1 = float3(,,); for(float i=0.0; i<10.00; i++)
{
uv.y += (0.07 * sin(uv.x + i/7.0 + _Time.y)); //相位实现波不同的起点
wave_width = abs(1.0 / (150.0 * uv.y));
color1.xyz += fixed3(wave_width, wave_width, wave_width);
}
三、源码
Shader "JQM/#Name#"
{
//属性快
Properties
{
_Color("Base Color",Color) = (,,,)
} SubShader
{ Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct VertexOutput
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0; }; sampler2D _MainTex;
float4 _MainTex_ST; float4 _Color; //顶点着色器
VertexOutput vert (appdata_full v)
{
VertexOutput o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord.xy;
return o;
} //像素着色器
fixed4 frag (VertexOutput i) : COLOR
{ float2 uv = i.uv;
uv = uv*2.0 -1.0;
float wave_width; float3 color1 = float3(,,); for(float i=0.0; i<10.00; i++)
{
uv.y += (0.07 * sin(uv.x + i/7.0 + _Time.y));
wave_width = abs(1.0 / (150.0 * uv.y));
color1.xyz += fixed3(wave_width, wave_width, wave_width);
} return float4(color1.xyz,)*_Color;
}
ENDCG
}
}
}
四、CG 函数
abs
取绝对值。
五、引用
http://blog.csdn.net/stalendp/article/details/21993227
Shader Wave的更多相关文章
- Shader 屏幕后期特效 Shake(震屏)&Wave(波纹)
震屏效果 Shader: //////////////////////////////////////////// ///// CameraPlay - by VETASOFT 2017 ///// ...
- [Unity] Shader(着色器)之固定管线
在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制 ...
- 【unity shaders】:Unity中的Shader及其基本框架
shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...
- 水面shader 线性擦除
// Upgrade NOTE: replaced 'PositionFog()' with multiply of UNITY_MATRIX_MVP by position // Upgrade N ...
- Shader的语法
Shader "name" { [Properties] Subshaders [Fallback] }(1)Properties:{ Property [Property ... ...
- Unity3d Shader
Unity3d Shader 预览Surface Shader主要用来实现光照相关处理,可能更简洁. Vertex and Fragment Shader 如果不与光照交互, 则可以用这个shader ...
- Unity3d Shader开发(一)Properties
着色器可以定义一个参数列表,可以由开发者在材质检视面板编辑参数.着色器文件中的Properties块定义了这些参数: 语法: Properties { Property [Property ...] ...
- 这几天阅读的shadowgun的几个shader
直接从阅读时记录的笔记摘抄过来,写的比较随意. 1. MADFINGER-blinking-god-rays 除了可以用于实现太阳光线效果,还能调整参数让颜色随时间淡入淡出闪烁,能做出想灯光之类的效果 ...
- Unity Kajiya Hair Shader Mod by Normals
Shader "HairShader" { Properties { _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = &q ...
随机推荐
- flask框架学习
第一:flask框架基础入门 第二:flask框架框架概述 第三:flask框架请求数据 第四:flask框架路由系统 第五:flask框架静态文件 第六:flask框架模板引擎 第七:flask其他 ...
- 移动游戏By HYJ
暴力求SG函数即可,记忆化贼方便 /*program from Wolfycz*/ #include<cmath> #include<cstdio> #include<c ...
- _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 保存高斯消元模版. ps,这一题的英文名字是ヨスガノソラ的开发商~^_^ #inclu ...
- _bzoj1001 [BeiJing2006]狼抓兔子【平面图】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 顺便推荐一个ppt,里面有对平面图的介绍:浅析最大最小定理在信息学竞赛中的应用. 这里 ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- TSP+Floyd BestCoder Round #52 (div.2) 1002 Victor and Machine
题目传送门 题意:有中文版的 分析:(出题人的解题报告)我们首先需要预处理出任意两个国家之间的最短距离,因为数据范围很小,所以直接用Floyd就行了.之后,我们用f[S][i]表示访问国家的情况为S, ...
- InputStream和OutputStream的一遍博客 分析非常到位
http://www.cnblogs.com/springcsc/archive/2009/12/03/1616187.html
- hibernate 中createQuery与createSQLQuery(转载)
息: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.miracle.dm.doc.catalog.mo ...
- 关于cocoapods安装与使用的总结
昨天晚上研究了很入的cocoapods,在各大论坛也看过了很多方法,这里把之前的方法做一个总结. 这里我把自己遇到的一些问题,大概的说了一下.也让广告初学者少走弯路. 先是来自code4app的文章: ...
- Android的handler消息机制
Hnadler机制中有这么几部分构成,包括 handler.Message.Looper和MessageQueue.要想在一个线程中使用Handler的话必须要有Looper和MessageQueue ...