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的更多相关文章

  1. Shader 屏幕后期特效 Shake(震屏)&Wave(波纹)

    震屏效果 Shader: //////////////////////////////////////////// ///// CameraPlay - by VETASOFT 2017 ///// ...

  2. [Unity] Shader(着色器)之固定管线

    在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制 ...

  3. 【unity shaders】:Unity中的Shader及其基本框架

    shader和Material的基本关系 Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这个输出来将图 ...

  4. 水面shader 线性擦除

    // Upgrade NOTE: replaced 'PositionFog()' with multiply of UNITY_MATRIX_MVP by position // Upgrade N ...

  5. Shader的语法

    Shader "name" { [Properties] Subshaders [Fallback] }(1)Properties:{ Property [Property ... ...

  6. Unity3d Shader

    Unity3d Shader 预览Surface Shader主要用来实现光照相关处理,可能更简洁. Vertex and Fragment Shader 如果不与光照交互, 则可以用这个shader ...

  7. Unity3d Shader开发(一)Properties

    着色器可以定义一个参数列表,可以由开发者在材质检视面板编辑参数.着色器文件中的Properties块定义了这些参数: 语法: Properties { Property [Property ...] ...

  8. 这几天阅读的shadowgun的几个shader

    直接从阅读时记录的笔记摘抄过来,写的比较随意. 1. MADFINGER-blinking-god-rays 除了可以用于实现太阳光线效果,还能调整参数让颜色随时间淡入淡出闪烁,能做出想灯光之类的效果 ...

  9. Unity Kajiya Hair Shader Mod by Normals

    Shader "HairShader" { Properties { _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = &q ...

随机推荐

  1. 前端基础jQuery

    jQury jQuery 是一个 JavaScript 函数库,jQuery 极大地简化了 JavaScript 编程. jQuery库包含以下功能: HTML 元素选取 HTML 元素操作 CSS ...

  2. Oracle Mysql的jdbc连接

    Oracle和MySql的jdbc或连接池中的连接,写下来以便随时参考 Oracle: driverClassName=oracle.jdbc.driver.OracleDriver url=jdbc ...

  3. 函数的返回值return

    '''1.什么是返回值 返回值是一个函数的处理结果 2.为什么要有返回值 如果我们需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须有返回值 3.函数的返回值的应用 函数的返回值用retur ...

  4. Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传

    http://www.jb51.net/article/77223.htm https://www.cnblogs.com/breeze1988/p/4019510.html

  5. jquery日期控件+时分秒

    因为项目需要,一些时间上的查询要精确的时分.先看下效果图吧. 所需要的js 跟css 文件 jsp://特别注意引入的先后顺序 <link rel="stylesheet" ...

  6. ubuntu 下安装redis

    获取Redis 1.通过官网http://redis.io/获取稳定版源码包下载地址: 2.通过wget http://download.redis.io/releases/redis-3.0.2.t ...

  7. C++ 多态、虚函数、虚析构函数

    1.若某种语言只支持类但不支持多态,则只能称为基于对象,不能说是面向对象. 2.多态:向不同对象发送同一个消息,不同的对象会产生不同的行为,发送消息可以是调用函数等操作.函数重载.运算符重载都是多态. ...

  8. 【git】搭建git服务器

    在 Linux 下搭建 Git 服务器 目录 ① 安装 Git ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 ③ 服务器端创建 Git 仓库 ④ 客户端 clon ...

  9. WPF学习- 新建项目后自定义Main()[Type 'App' already defines a member called 'Main' with the same parameter types]

    问题点: 在App.xaml.cs中自己添加Main方法,编译会出现如下报错: 错误 CS0111 类型“App”已定义了一个名为“Main”的具有相同参数类型的成员  错误 Type 'App' a ...

  10. ztree 样式修改 white-space: nowrap; 后 下划线要是跟上的话 宽度 width 要 auto 就自动更新了

    width:auto; border-bottom:1px solid #ccc; height:30px; display: inline-block;white-space: nowrap;