学习使用shader制作序列帧的效果的记录。
思路:
1.纹理采样需要映射到每个帧的小格中
//改动顶点的uv坐标
2.获取每个帧小格的纹理范围
// pos0 = float2(1/column,1/row) 即为纹理左下角的一小格范围
// 其余小格的范围 通过pos0.x=第几列x1/column pos0.y=第几行x1/row 即可
3.由于uv是左下角开始的,而序列帧图片一般是从左上角开始,需要对uv.y方向的范围特殊对待。
//所以第二步的 pos0.y = (行数-第几行)x1/row
4.从时间变量中获取循环的行列数。
//allcell = column*row
// time/allcell 时间除以全部格子数 取余数 获取 【0—全部格子-1】的循环数
//上述循环数 / 行数 取整 获得行数
//上述循环数 / 列数 取余 获得列数
5.一个特别的点 上边的循环数 如果不是[0,1,2]这种间断的值,而是0-1连续变化的值,会发现序列帧纹理不是一格一格的变化,而是从第一行从左往右平移效果。
Shader "Mytest/Sequence frame Shader"{
Properties{
_FrameTexture("FrameTexture",2D)="white"{}
_PlaySpeed("PlaySpeed",Range(1,50))=1
_HCount("HCount",Float)=8
_VCount("VCount",Float)=8
}
SubShader{
Tags{"Queue"="Transparent" "RenderType"="TransParent" "IgnoreProject"="true"}
//播放序列帧
//将uv映射到采样范围中 [0-1] -->每个单独块的坐标范围
//获取每个单独块的坐标范围
Pass{
Tags{"LightMode"="ForwardBase"}
ZWrite Off
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _FrameTexture;
float4 _FrameTexture_ST;
float _PlaySpeed;
float _HCount;
float _VCount;
struct v2f{
float4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
};
v2f vert(appdata_base v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord,_FrameTexture);
return o;
}
fixed4 frag(v2f i):SV_Target{
//小块uv映射 左下角的一格
float2 newImageUV = float2(i.uv.x/_VCount,i.uv.y/_HCount);
float scal = _HCount * _VCount;
//float number = floor(fmod(_Time.y*_PlaySpeed,scal));//[0,1,2,3..,xy-1]
float number = fmod(_Time.y*_PlaySpeed,scal);//[0---xy-1]
float h = floor(number/_HCount);//行
float v = fmod(number,_VCount);//列
newImageUV.x = newImageUV.x + 1.0/_VCount*v;
newImageUV.y = newImageUV.y + 1.0/_HCount* (_HCount - h);
fixed4 color = tex2D(_FrameTexture,newImageUV);
return fixed4(color.rgb,1);
}
ENDCG
}
}
FallBack ""
}