普通的Shader-序列帧相关

19 篇文章 1 订阅

学习使用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 ""
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值