shaderforge UVTile节点
一、 介绍
UVTile
UVTile可以用来以uv坐标为基准在一个纹理中取到其中一块的贴图。
[UV]是整个贴图的UV值
[Wid]指定沿tilemap的x轴方向上分成几块。
[Hei]指定沿tilemap的y轴方向上分成几块
[Tile]是用于指定你想提取的tilemap中具体那一小块纹理的索引值。它是一个整数,其中0为第一块,从左下角开始。
注意:
它的计数方向是从左下到右上的。
可用于制作序列帧动画
二、节点的输入
1. UV
物体的uv坐标信息,shaderforge提供一个数据节点[UV Coord.]用于提供物体的uv信息
2. Wid
横向将图片切分为Wid份
3. Hei
纵向将图片切分为Hei份
4. Tile
索引号
三、节点的输出
UV
整张贴图中摘取的一小块贴图的uv坐标
四、应用实例-制作序列帧动画效果
=》
原理
- 计算每个小图的纹理坐标,按照uv取到图片
- 获取时间的离散值作为索引值,索引不同的图片
ShaderForge连线图
五、自定义Unity Shader实现UVTile节点
写法
Shader "Hidden/UVTile"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Wid("Wid", Int) = 1
_Hei("Hei", Int) = 1
_Tile("Tile", Int) = 1
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
int _Wid;
int _Hei;
int _Tile;
fixed4 frag (v2f i) : SV_Target
{
float2 data = float2(1.0,1.0)/float2(_Wid,_Hei);
// 计算行号
float y = floor(_Tile*data.x);
// 计算列号
float x = _Tile - _Wid*y;
float2 uvNew = (i.uv + float2(x,y))*data;
fixed4 col = tex2D(_MainTex, uvNew);
return col;
}
ENDCG
}
}
}