【shaderforge学习笔记】 UVTile节点

时间:2022-04-20 04:01:41

shaderforge UVTile节点

一、 介绍

UVTile
【shaderforge学习笔记】 UVTile节点
UVTile可以用来以uv坐标为基准在一个纹理中取到其中一块的贴图。
[UV]是整个贴图的UV值
[Wid]指定沿tilemap的x轴方向上分成几块。
[Hei]指定沿tilemap的y轴方向上分成几块
[Tile]是用于指定你想提取的tilemap中具体那一小块纹理的索引值。它是一个整数,其中0为第一块,从左下角开始。
注意:
它的计数方向是从左下到右上的。
【shaderforge学习笔记】 UVTile节点
可用于制作序列帧动画

二、节点的输入

1. UV

物体的uv坐标信息,shaderforge提供一个数据节点[UV Coord.]用于提供物体的uv信息

2. Wid

横向将图片切分为Wid份
【shaderforge学习笔记】 UVTile节点

3. Hei

纵向将图片切分为Hei份

4. Tile

索引号
【shaderforge学习笔记】 UVTile节点

三、节点的输出

UV
整张贴图中摘取的一小块贴图的uv坐标

四、应用实例-制作序列帧动画效果

【shaderforge学习笔记】 UVTile节点=》【shaderforge学习笔记】 UVTile节点

原理

  • 计算每个小图的纹理坐标,按照uv取到图片
  • 获取时间的离散值作为索引值,索引不同的图片

ShaderForge连线图

【shaderforge学习笔记】 UVTile节点

五、自定义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
}
}
}

效果展示

【shaderforge学习笔记】 UVTile节点