shader编写是在学习http://blog.sina.com.cn/s/blog_471132920101d8zf.html之后为了练手而制作。需要编写一个使贴图能够随着时间缩放的shader,选择正方形的贴图,关键是在tex2D进行纹理查询的时候,需要对原纹理的uv进行变换mapuv(float2uv,float xLength),将当前的uv变换到缩放之后查询,将边框部位设置为白色。随着时间变化修改边框的大小实现随着时间变化缩放。效果如图2:
Shader "Custom/Zoom" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
struct v2f
{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.uv=TRANSFORM_TEX(v.texcoord,_MainTex);
return o;
}
//输入uv返回映射之后的uv,xLength为边框的大小
float2 mapuv(float2 uv,float xLength)
{
float2 newuv;
float rate=(1-2*xLength)/1;
if(uv.x>xLength&&uv.x<(1-xLength)&&uv.y>xLength&&uv.y<(1-xLength))
{
newuv.x=(uv.x-xLength)/rate;
newuv.y=(uv.y-xLength)/rate;
}
else
{
newuv.x=uv.x;
newuv.y=uv.y;
}
return newuv;
}
//改变边框的大小,interval间隔时间是指从最大变到最小需要花的时间
float changexlength(float interval,float maxLength)
{
float xLength;
int count=_Time.y/interval;
float beginTime=count*interval;
float fadeTime=_Time.y-beginTime;
int parity=count%2;
if(count!=0&&parity!=0)//返回
{
xLength=maxLength-fadeTime/interval*maxLength;
}
else
{
xLength=fadeTime/interval*maxLength;
}
return xLength;
}
float4 frag(v2f i):COLOR
{
float4 outp;
float xLength=changexlength(2,0.3);
float2 newuv=mapuv(i.uv,xLength);
float4 texCol=tex2D(_MainTex,newuv);
if(!(i.uv.x>xLength&&i.uv.x<(1-xLength)&&i.uv.y>xLength&&i.uv.y<(1-xLength)))
{
texCol=float4(1,1,1,1);
}
outp=texCol;
return outp;
}
ENDCG
}
}
}