// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/sin_shader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" //使用unity自带的库文件,常用的内置函数在里面
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;//绑定第一张纹理图
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : POSITION;
};
sampler2D _MainTex;//2D纹理图片
float4 _MainTex_ST;//而_MainTex_ST的ST是SamplerTexture的意思 ,就是声明_MainTex是一张采样图,也就是会进行UV运算。 如果没有这句话,是不能进行TRANSFORM_TEX的运算的。
//下面的两个函数是等价的o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
//o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
//_MainTex_ST中的ST是Sampler texture ,声明这个变量是为了告诉编译器_Main_TEX是一张纹理采样图,如果没有这句话,_Main_TEX是不能参与运算的。
v2f vert (appdata v)
{
v2f o;
float dist = distance(v.vertex.xyz, float3(0, 0, 0));
float h = sin(dist*20 + _Time.z);
o.vertex = mul(unity_ObjectToWorld, v.vertex);//先把模型坐标转换成世界坐标,在世界空间震荡,所以要在世界空间例修改
o.vertex.y = h;//将顶点赋值
o.vertex = mul(unity_WorldToObject, o.vertex);//将点的世界坐标转换成模型坐标
o.vertex = mul(UNITY_MATRIX_MVP,o.vertex);//用于将顶点/方向矢量坐标从模型空间变换成剪裁空间,在显示器上显示
o.uv = TRANSFORM_TEX(v.uv,_MainTex);//将坐标转换成真正的uv坐标(在屏幕中的坐标)返回的是uv坐标
return o;//保存的v2f
}
//这里的i就是承接上一个函数中路下一个工位的o
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);//tex2D(sampler2D tex, float2 s)函数,
//这是CG程序中用来在一张贴图中对一个点进行采样的方法,返回一个float4。这里对 _MainTex在输入点
//上进行了采样,并将其颜色的rbg值赋予了输出的像素颜色,将a值赋予透明度。于是,
//着色器就明白了应当怎样工作:即找到贴图上 对应的uv点,直接使用颜色信息来进行着色,over。
return col;
}
ENDCG
}
}
}
不懂可以看后面的注释
shader中做成unity_ObjectToWorld矩阵来实现局部转世界的转换
tex2D(sampler2D tex, float2 s)函数是shader中用来在一张贴图中对一个点进行采样的方法,返回一个float4,在上面的代码中是对_MainTex在输入点上进行了采样,并将其颜色的rgb值赋予了输出的像素颜色。
distance(float3 x,float3 y),计算两个点的距离
sin()计算两点之间的正弦值