如果代码中有什么不清楚请查看以下基础知识
Shader基础知识
unity3d 中 七种坐标知识详解
顶点有规律的上下浮动的效果
该效果可以使静态模型拥有动感,比较适合应用在水面海浪、定格动画模拟,数据可视化等场景。效果图中使用了网格显示,实际上顶点浮动可以使用在各种shader中,核心部分都在顶点着色器里,直接拿走即可。
Shader "Unlit/simple"
{
//变量接口
Properties
{
//线段长度
_MovePower("power",float) = 1.
_MoveSpeed("speed",float) = 1.
//线段颜色
_LineColor("Color",COLOR) = (0,1,0,1)
}
//着色器正文
SubShader
{
//着色器程序块
Pass
{
Tags { "RenderType" = "Opaque" }
LOD 200
CGPROGRAM
#pragma target 5.0
//顶点着色器,用于处理位置信息
#pragma vertex vert
//片元着色器,用于处理颜色
#pragma fragment frag
//几何着色器,DirectX 10新增的,介于顶点和片元着色器之间的可选着色器
#pragma geometry geo
//引入空间转换宏
#include "UnityCG.cginc"
float _MovePower;
float _MoveSpeed;
fixed4 _LineColor;
//输入到顶点着色器的数据
struct v2g
{
//顶点位置
float4 pos : POSITION;
//法线
float3 normal : NORMAL;
//纹理坐
float2 tex0 : TEXCOORD0;
};
//输入到片元着色器的数据
struct g2f
{
//像素位置
float4 pos : POSITION;
//纹理
float2 tex0 : TEXCOORD0;
};
//顶点着色器,这里是顶点浮动的核心部分,可以直接移植到任何地方
v2g vert(appdata_base v)
{
v2g o;
o.normal = v.normal;
o.tex0 = v.texcoord;
//模型坐标转为世界坐标,因为要计算绝对位置
o.pos = mul(unity_ObjectToWorld, v.vertex);
//顶点的高度 = 原顶点高度+ sin(原顶点x值+时间长度)* 幅度
o.pos.y = o.pos.y + sin(o.pos.x + (_Time.y * _MoveSpeed)) * _MovePower;
//将坐标转为裁剪空间,否则就无法正常可视化
o.pos = mul(UNITY_MATRIX_VP, o.pos);
return o;
}
//几何着色器,放在顶点和片元之间。
//maxvertexcount设置从顶点着色器到几何着色器每次输出最大顶点数量
//输入修饰有point、line、triangle、lineadj、triangleadj分别对应点、线、三角形、有临接的线段、有邻接的三角形
//inout输出修饰类型有PointStream、LineStream、TriangleStream,分别显示顶点、线段、三角面
//输入顶点的信息,inout这里是将一个数据传入函数,在函数中的修改会返回到函数外的数据
//一次接受triangle的3个顶点数据,输出为LineStream的3条线段
[maxvertexcount(3)]
void geo(triangle v2g vg[3], inout LineStream<g2f> ls)
{
//轮询一个片元的三个顶点,这里i<2去掉了斜线
for (int i = 1; i < 3; i++)
{
//初始化一个像素信息
g2f g2f_1;
//获取每个顶点的位置
g2f_1.pos = vg[i].pos;
//初始化纹理
g2f_1.tex0 = float2(0.0f, 0.0f);
//将点压入线条数据
ls.Append(g2f_1);
}
//即使点不够,也会终止一个循环,并重新开始
ls.RestartStrip();
}
//片元着色器,用于上色
fixed4 frag(g2f input) : COLOR
{
return _LineColor;
}
ENDCG
}
}
}