Unity Shader动画

在这里插入图片描述

纹理动画

序列帧动画
在这里插入图片描述
1.首先我们先声明多个属性,以设置该序列帧动画的相关参数:

Properties {
	_Color("Color Tint",Color) = (1,1,1,1)
	_MainTex("Image Sequence",2D) = "while" {}
	_HorizontalAmount("Horizontal Amount",Float) = 4
	_VerticalAmount("Vertical Amount",Float) = 4
	_Speed("Speed",Range(1,100)) = 30
}

_MainTex就是包含了所有关键帧图像的纹理。
由于序列帧图像通常是透明纹理,我们需要设置Pass的相关状态,以渲染透明效果:

SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
	Pass {
		Tags {"LightMode"="ForwardBase"}
		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha
	}
}

由于序列帧图像通常包含了透明通道,因此可以被当成是一个半透明对象。在这里我们使用半透明的“标配”来设置它的SubShader标签,即把Queue和RenderType设置成Transparent,把IgnoreProject设置为True。在Pass中,我们使用Blend命令来开启并设置混合模式,同时关闭了深度写入。
顶点着色器进行基本的顶点变换,并把顶点纹理坐标存储到v2f结构体里

vef vert(a2v v) {
	v2f o;
	o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
	o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
	return o;
}

片元着色器

fixed4 frag(v2f i):SV_Traget {
	float time = floor(_Time.y * _Speed);
	float row = floor(time / _HorizontalAmount);
	float column = time - row * _VerticalAmount;
	half2 uv = i.uv + half2(column,-row);
	uv.x /= _HorizontalAmount;
	uv.y /= _VerticalAmount;
	fixed4 c = tex2D(_MainTex,uv);
	c.rpg *= _Color;
	return c;
}

_Time.y就是自然场景加载后所经过的时间。
最后把Fallback设置为内置的Transparent/VertexLit(也可以选择关闭Fallback):

Fallback "Transparent/VertexLit"

滚动的背景
1.先声明新的属性:

Properties {
	_MainTex("Base Layer (RGB)",2D) = "white" {}
	_DetailTex("2nd Layer (RGB)",2D) = "white" {}
	_ScrollX("Base layer Scroll Speed",Float) = 1.0
	_Scroll2X("2nd layer Scroll Speed",Float) = 1.0
	_Multiplier("Layer Multiplier",Float) = 1
}

_MainTex和_DetailTex分别是第一层(较远)和第二层(较近)的背景纹理,而_ScrollX和_Scroll2X对应了各自的水平滚动速度。_Multiplier参数则用于控制纹理的整体亮度。
2.顶点着色器

v2f vert(a2v v) {
	v2f o;
	o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
	o.uv.xy = TRANSFORM_TEX(v.texcoord,_MainTex) + frac(float2(_ScrollX,0.0) * _Time.y);
	o.uv.zw = TRANSFORM_TEX(v.texcoord, _DetailTex) + frac(float2(_Scroll2X,0.0) * _Time.y);
	return o;
}

我们首先进行了最基础的顶点变换,把顶点从模型空间变换到裁剪空间中。然后,我们计算了两层背景纹理的纹理坐标。为此,我们首先利用TRANSFORM_TEX来得到初始的纹理坐标。然后,我们利用内置的_Time.y变量在水平方向上对纹理坐标进行偏移,以此达到滚动的效果。我们把两张纹理的纹理坐标存储在同一个变量o.uv中,以减少占用的插值寄存器空间。
3.片元着色器

fixed4 frag(v2f i) : SV_Target {
	fixed4 firstLayer = tex2D(_MainTex,i.uv.xy);
	fixed4 secondLayer = tex2D(_DetailTex,i.uv.zw);
	fixed4 c = lerp(firstLayer,secondLayer ,secondLayer .a);
	c.rgb *= _Multiplier;
	return c;
}

我们首先分别利用i.uv.xy和i.uv.zw对两张比较纹理进行采样。然后,使用第二层纹理的透明通道混合两张纹理,这使用CG的lerp函数。最后,我们使用_Multiplier参数和输出颜色进行相乘,以调整背景亮度。
4.最后,我们把Fallback设置为内置的VertexLit(也可以选择关闭Fallback):

Fallback "VertexLit"

顶点动画

1.流动的河流
河流的模拟是顶点动画最常见的应用之一。它的原理通常是使用正弦函数等来模拟水流的波动效果。

2.广告牌
广告牌技术会根据视觉方向来旋转一个被纹理着色的多边形,使得多边形看起来好像总是面对摄像机。广告牌技术被用于很多应用,比如渲染烟雾、云朵、闪光效果等。
广告牌技术的本质就是构建旋转矩阵,而我们知道一个变换矩阵需要3个基向量。广告牌技术使用的基向量通常就是表面法线(normal)、指向上的方向(up)以及指向右的方向(right)。除此之外,我们还需要指定一个锚点(anchor location)。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值