缩放shader 的编写-shader学习1

本文档介绍了在学习某博客后,作者动手实践制作了一个shader,目的是实现贴图随着时间逐渐缩放。针对正方形贴图,通过在tex2D中调整uv坐标,使用mapuv函数来实现缩放变换,并设定边框颜色为白色。随着时间推移,改变边框宽度以呈现缩放效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值