效果
步骤
- 新建一个unity3d项目
- 创建res文件夹存放贴图和shader以及对应材质,贴图可自行在网络上查找,shader创建如下图所示(shader的源代码往下看,有详细注释),创建完shader之后,鼠标右击shader创建对应材质(create->material)
- 然后将贴图拖到材质中
- 然后在场景中创建一个3D Object -> Plane,将Plane的材质改为shader的材质,点击运行即可看到波浪效果
Shader源码
Shader "Custom/SinShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert //vert作为顶点着色器的入口
#pragma fragment frag //frag作为片元着色器的入口
#include "UnityCG.cginc" //引用Unity自带的函数库,可以使用Unity自带函数
struct appdata
{
float4 vertex : POSITION; //绑定模型顶点的位置
float2 uv : TEXCOORD0; //绑定二维纹理的坐标
};
struct v2f //v2f表示将vert传给frag
{
float2 uv : TEXCOORD0; //绑定纹理
float4 vertex : POSITION; //绑定顶点
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
float dist = distance(v.vertex.xyz, float3(0, 0, 0)); //模型顶点到模型正圆心的距离
float h = sin(dist + _Time.z);
o.vertex = mul(unity_ObjectToWorld, v.vertex); //将原点坐标变换到世界坐标
o.vertex.y = h; //设置y
//o.vertex = mul(unity_WorldToObject, o.vertex); //在将世界坐标变换到原点坐标
o.vertex = mul(UNITY_MATRIX_MVP, o.vertex); //将顶点坐标变换到unity的mvp坐标
o.uv = TRANSFORM_TEX(v.uv, _MainTex); //模型的顶点坐标转换为真正的uv坐标
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}