补充

float4 fixed4 _Time

1: float4是内置向量 (x, y, z, w); float4 a; 访问单独成员a.x, a.y, a.z, a.w;
2: fixed4 是内置向量(r, g, b, a); fixed4 c; color.r, color.g, color.b, color.a;
3: float3是内置向量(x, y, z);
4: fixed3 是内置向量(r, g, b);
5: float2 是内置向量(x, y);
6: _Time: 自场景加载开始所经过的时间t,4个分量分别是 (t/20, t, t*2, t*3);
7: _SinTime: t 是时间的正弦值,4个分量分别是 (t/8, t/4, t/2, t);
8: _CosTime: t 是时间的余弦值,4个分量分别是 (t/8, t/4, t/2, t);
9: unity_DeltaTime: dt 是时间增量,4个分量的值(dt, 1/dt, smoothDt, 1/smoothDt),平滑时间,防止时间间隔起伏太大;

正弦波实例

1.创建Unity工程目录

2.创建一个节点plane

3.在resources文件夹下面创建shaders文件夹

4.打开shaders文件夹,创建一个用于顶点片元着色的shader,create---->shader---->unlit shader,重命名为SinShader

5.打开SinShader

第一步:先把第一行改成Shader "Custom/SinShader",这样才能在编辑器里面显示这个shader

第二步:

Shader "Custom/SinShader"
{
Properties//可以绑定到编辑上面的属性
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }//标记
LOD Pass
{
CGPROGRAM//CG代码的开始
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;//模型顶点的位置
float2 uv : TEXCOORD0;//纹理坐标
}; struct v2f
{
float2 uv : TEXCOORD0;//纹理坐标
float4 vertex : POSITION;//模型顶点的位置
}; sampler2D _MainTex;
float4 _MainTex_ST; v2f vert (appdata v)//对模型的顶点坐标的修改写在这里面
{
v2f o;
float dist = distance(v.vertex.xyz, float3(, , ));//求得模型各个顶点坐标到中心原点的相位距离
float h = sin(dist * + _Time.z) / ;//Time是自场景加载开始所经过的时间,t,4个分量分别是 (t/20, t, t*2, t*3);用这个变量.z表示t*2,时间是不断增加的,但是因为周期性,所以h有一个范围
//调整相位dist可以改变水波的振动幅度从而改变水波形态,直接改变振动幅度(除于5)也可以改变水波形态
         o.vertex = mul(unity_ObjectToWorld, v.vertex);//模型顶点坐标转换为世界坐标
o.vertex.y = h;//让模型的y坐标等于h这个范围
o.vertex = mul(unity_WorldToObject, o.vertex);//时间坐标再转换为模型顶点坐标 //这两句不是造成正弦波的语句,是简单的shader模板,一开始写的,把图像贴到模型上
o.vertex = mul(UNITY_MATRIX_MVP, o.vertex);//变换成Unity的MVP,模型坐标转为透视坐标
o.uv = TRANSFORM_TEX(v.uv, _MainTex);//根据顶点的纹理坐标,计算出对应的纹理的真正的UV坐标,有了UV坐标,才能在fixed4 frag (v2f i) : SV_Target里面通过它得到颜色 return o;//这个o其实等下要传给fixed4 frag (v2f i) : SV_Target里面的i
} fixed4 frag (v2f i) : SV_Target//对模型的像素着色的修改写在这里面
{
fixed4 col = tex2D(_MainTex, i.uv);//使用uv坐标,寻址得到颜色,返回颜色,着色到模型上面去,就把贴图给贴上了
return col;
}
ENDCG//CG代码的结束
}
}
}

6.打开shaders文件夹,创建一个材质球叫SinShader,选择shader的属性custom---->SinShader

7.把贴图拖进材质球SinShader

8.给平面plane关联材质球SinShader,平面有了纹理,运行起来像水波

UV动画(捕鱼达人3中使用的技术)

1.把鱼模型(jinqiangyu.FBX,jinqiangyu.png)拖进Hierachy,设置鱼Materials/jinqiangyu的材质球的shader为为mobile diffuse

2.把caustics.png资源拖进resources

3.打开shaders文件夹,创建一个unlit shader,重命名为UVShader

4.打开UVShader

第一步:先把第一行改成Shader "Custom/SinShader",这样才能在编辑器里面显示这个shader

第二步:增加一个纹理的定义

Properties
{
  _MainTex ("Texture", 2D) = "white" {}
  _SubTex ("Texture", 2D) = "white" {}
}

第三步:

Shader "Custom/UVShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_SubTex ("Texture", 2D) = "white" {}//放波光的纹理贴图
} SubShader
{
Tags { "RenderType"="Opaque" }
LOD Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; sampler2D _SubTex;//要用就要再声明一下,波光
sampler2D _MainTex;//要用就要再声明一下,鱼 float4 _MainTex_ST; v2f vert (appdata v)//对顶点坐标的修改写在这里面,因为没有修改顶点,所以没有新增什么
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o;
} fixed4 frag (v2f i) : SV_Target//对像素纹理的修改写在这里面
{
float2 uv_offset = float2(, );
uv_offset.x = _Time.y * 0.25;//不断地获得变化的纹理坐标的x
uv_offset.y = _Time.y * 0.25;//不断地获得变化的纹理坐标的y
// sample the texture
fixed4 linght_color = tex2D(_SubTex, i.uv + uv_offset);//通过uv_offset来让纹理动起来,由于波光纹理属性设置为repeat,所以不用担心图片越界的问题。通过i.uv+uv_offset查找获得波光的纹理
fixed4 col = tex2D(_MainTex, i.uv) + linght_color;//把两张纹理加在一起,为什么用黑色的波光图:因为黑色的值是0,0,0,这里加了也不会改变原来的鱼的整体感觉,正是我们要的效果
return col;
}
ENDCG
}
}
}

4.选择鱼材质球的shader为custom---->UVShader

5.把波光的贴图拖进鱼材质球的另外一个贴图属性

6.运行就可以看见鱼被动态波光笼罩

注意:

遇到函数使用有问题的,打开#include “UnityCG.cginc”  Unity-->Edit-->Data-->CGIncludes;查看

关于Unity中顶点片元Shader实例的更多相关文章

  1. 顶点/片元 shader 总结

    Cg顶点程序必须在结构中传递顶点数据.几种常用的顶点结构定义在文件UnityCG.cginc中,有如下三种结构体: 1.appdata_base: 包含顶点位置,法线和一个纹理坐标.2.appdata ...

  2. 解读Unity中的CG编写Shader系列八(镜面反射)

    转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...

  3. 解读Unity中的CG编写Shader系列三

    转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...

  4. [转]解读Unity中的CG编写Shader系列9——镜面反射

    讨论完漫反射之后,接下来肯定就是镜面反射了在开始镜面反射shader的coding之前,要扩充一下前面提到的知识,加深理解镜面反射与漫反射的区别.注:这篇文章实现的镜面反射是逐顶点着色(per-ver ...

  5. [转]解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

    在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后面 ...

  6. 解读Unity中的CG编写Shader系列3——表面剔除与剪裁模式

    在上一个样例中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上. 这篇文章将要在此基础上研究片段的擦除(discarding fragments)和前面剪裁.后 ...

  7. 解读Unity中的CG编写Shader系列七(不透明度与混合)

    转自http://www.itnose.net/detail/6098539.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段 ...

  8. Unity中的CG编写Shader系列(Blend)

    1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色 ...

  9. [转]解读Unity中的CG编写Shader系列6——不透明度与混合

    1.不透明度当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色到 ...

随机推荐

  1. 【Unity】7.6 自定义输入

    分类:Unity.C#.VS2015 创建日期:2016-04-21 一.简介 在Unity中可以创建自定义的虚拟按键,然后将设备的输入映射到自定义的按键上.使用虚拟按键的好处是可以让游戏玩家自己定义 ...

  2. 关于checkbox选中问题总结

    (1)ng-checked的值只是用来决定初始状态时选中还是为选中,ng-model  才是随着复选框是否被选中,来实时改变它绑定变量的值. (2)如果初始状态ng-checked和ng-model指 ...

  3. 【ARM】2410裸机系列-uart串口通信

    开发环境 (1)硬件平台:FS2410 (2)主机:Ubuntu 12.04 FS2410串口的原理图 串口UART寄存器配置   配置TXD0与RXD0(GPH2.GPH3) 设置波特率(UBRDI ...

  4. 解决kafka集群由于默认的__consumer_offsets这个topic的默认的副本数为1而存在的单点故障问题

    抛出问题: __consumer_offsets这个topic是由kafka自动创建的,默认50个,但是都存在一台kafka服务器上,这是不是就存在很明显的单点故障?经测试,如果将存储consumer ...

  5. OpenSUSE安装软件

    zypper se xxxxx 是搜索软件包 zypper in xxxxx 跟你的apt-get install xxxx等价 zypper rm xxxx 删除 zypper up xxxx 更新 ...

  6. 这到底是什么bug?---已结贴

    问题描述:全局变量,会被莫名其妙更改!打印为50,后面做比较的时候这个值为0了. 第一,我肯定没有犯低级错误,没有其他的更改,搜索全部代码,没有发现这个变量因为我程序问题导致不符合预期,同时找了两位同 ...

  7. 基于jQuery和CSS3超酷Material Design风格滑动菜单导航特效

    分享一款效果非常炫酷的谷歌 Material Design 风格jQuery和CSS3滑动选项卡特效.该选项卡特效集合了扁平风格设计和按钮点击波特效.是一款设计的非常不错的Material Desig ...

  8. Mac OS X上搭建Apache、PHP、MySQL的Web服务器

    mac OS 系统太帅了,安装php的环境如此简单,大赞一个! 转载自http://jingyan.baidu.com/article/39810a23e1939fb636fda6a9.html 在M ...

  9. win7+php5.3.10下安装memcache (转)

    因为升级到了5.3.10,所以之前的dll不能使用了,弄了好久,终于还是在老外的博客上找到了解决方法: (环境是win7+php5.3.10+win32) 1.解压附件memcached到某个目录,本 ...

  10. 【Java】使用pinyin4j获取汉字的全拼或首字母

    汉字转拼音的工具类,常用于做汉字拼音的模糊查询. https://www.cnblogs.com/htyj/p/7891918.html