Unity shader Note : 纹理动画和顶点动画及其阴影

纹理动画&顶点动画及其阴影

1.纹理动画

序列帧动画

更改纹理坐标实现动画
需要使用到的内置时间变量
在这里插入图片描述
其中_Time.y 就是开始加载所经过的时间

效果在这里插入图片描述
代码
①需要将渲染模式设置为透明
②关闭深度写入和开启混合,就是透明度混合那一套
③floor函数表示向下取整
④在片元着色器中进行纹理动画坐标变化

Shader "Unlit/Image_seq"
{
   
	Properties
	{
   
		_Color ("Color Tint",Color)= (1,1,1,1)
		_MainTex("Image Sequence", 2D) ="white"{
   }
		_HorizontalAmount("Horizonton Amount", Float) = 4
		_VerticalAmount("Vertical Amount",Float) =4
		//这两项分别代表了水平和竖直方向上包含的的关键帧图像的个数,在是窗口设置成8x8
		_Speed("Speed",Range(1,100))= 30
		//控制动画播放速度
	}
	SubShader
	{
   
		Tags {
    "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
		  //因为帧序列是png透明纹理因此用透明队列

		Pass
		{
   
			Tags {
   "LightMode"="ForwardBase"}
			ZWrite off  //关闭深度写入
			Blend SrcAlpha OneMinusSrcAlpha  

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
   
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
   
				float2 uv : TEXCOORD0;
				float4 pos : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed4 _Color;
			float _VerticalAmount;
			float _HorizontalAmount;
			float _Speed;
			
			v2f vert (appdata v)
			{
   
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
   
				float time = floor(_Time.y * _Speed);
				float row  = floor(time / _HorizontalAmount);
				  //floor 函数向下取整
				float column = time - row * _HorizontalAmount;
				  //原书上写的是乘以_VerticalAmount 
				  //应该是乘以_HorizontalAmount;
				  //之所以没出错是因为两个值相同

				  //_Time.y是场景加载的时间,_Time是内置变量
				  //使用经过时间除以_HorizontalAmount 的商所谓对应的行索引,其余数作为列索引

				half2 uv = i.uv + half2 (column, -row); 
				uv.x /= _HorizontalAmount;
				uv.y /= _VerticalAmount;
				//上下两种计算方法都可
				//half2 uv = float2(i.uv.x /_HorizontalAmount, i.uv.y /_VerticalAmount);
				//uv.x += column / _HorizontalAmount;
				//uv.y -= row /_VerticalAmount;

				//我们已经知道帧序列是8*8的图,下面需要通过行列索引值来找到真正的采样坐标
				//首先把i.uv除以帧序列行列数,进行等分,得到每个子图像的坐标范围
				//然后用当前的行列数对上面的坐标进行偏移,行坐标用加法进行偏移
				//列坐标按照从下到上逐渐增加与帧序列图由下到上递减相反,因此使用 -=

				fixed4 c = tex2D (_MainTex,uv);
				c.rgb *= _Color;

				return c;
			}
			ENDCG
		}
	}
	Fallback "Transparent/VertexLit"
}

背景纹理动画

在这里插入图片描述
代码
①不同的是有两层贴图
②在顶点着色器中变换纹理坐标
③用lerp对背景进行混合

Shader "Unlit/back-seq"
{
   
	Properties
	{
   
		_MainTex ("Texture", 2D) = "white" {
   }
		_DetailTex ("2nd Layer(RGB)", 2D) = "white"{
   } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值