进击的序列帧 一(两篇)------- 让你的序列帧立体起来!

当不要脸已成习惯,当山峰也没有了棱角,当招人这么困难的时候,我还是在篇头植入的招聘。


坐标山东青岛市北,招聘日系画师,其他岗位目前公司没有说,有意思的可以入群私聊。


然后再说一下QQ群,山东手游研发聚集地335772557,进群先看公告,要是抱着我要学习的心态进群的话,那你就失望了,因为是个死群。

偶尔心情好的是时候会发个技术链接。

接下来进入正题!!

这篇文章我只是写个想法,如果想360度的立体,自己根据思路自己实现一下吧,可以跟帖讨论,反正我的博客也是个坟。

先上效果图:


很多人一直都认为序列帧的用法就是一张一张的跑马灯,就像认为图片就是用来存储图像一样的认识短浅。

首先我们先来渲染序列帧图像,打开max,呀的一下就创建了一个teapot。


然后做个动画,渲染个序列帧出个图。


准备工作现在可以结束了


接下来我们进入Unity,准备工作(创建粒子系统等)就省略了

找到粒子系统的Renderer部分,勾选Custom Vertex Stream并添加Center(这个就是每粒子的世界位置)


然后创建Shader修改shader的两个struct,如下


然后在顶点函数里组建一下粒子系统的worldpos。


接下来我们就要开始计算视线与每粒子的角度问题了

首先我们计算一下入射向量


根据入射向量就可以得到弧度


atan2返回值是-pi~pi,但是我喜欢0-1,于是就有了


这样的话,角度问题就计算完成了,后来我自己希望除了视角旋转时可以控制之外,能有一个参数可手动调整。

在Properties中添加属性


并在vert函数前声明一下


然后我们修改一下获取角度的地方


至此,角度就OK了

然后我们就要计算序列帧相关参数的部分了

首先计算一下根据角度得到应显示序列帧的序号。

等一下,似乎我们忘记了什么。。。。。。

序列帧是?x?的问题。。。

添加Properties


并在vert前声明


好了,忘记的东西已经补上了,继续


这就就得到了要显示的序列帧某一帧的序号

但是问题我们是也要切分UV的啊,那么就要根据这个序号来求UV的部分了


UV也算好了,然后就往fragment里传参数吧


效果这这么结束了、、、、

等等,是不是有什么问题,序列帧在跳。。。。。。!!!!!!!

这个问题严重了。。。。其实把序列帧改成123456的UV格,就很容易看出来了,uv的y反了

修改一下


然后在测试,发现跟视图旋转方向相反,再次修改


上个全码

Shader "Unlit/TestSheet"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Rotation("Rotation",Range(0,1)) = 0
		[Header(Rows Column)] _Param("",Vector) = (8,8,0,0)
	}
	SubShader
	{
		Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
		Blend SrcAlpha OneMinusSrcAlpha
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_particles
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float4 uv : TEXCOORD0;
				float4 color:COLOR;
				float tmp : TEXCOORD1;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
				float4 color:COLOR;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed _Rotation;
			float2 _Param;
			
			v2f vert (appdata v)
			{
				v2f o;

				float3 perParticleWorldPos = float3(v.uv.zw,v.tmp);

				float3 lookAt = normalize(_WorldSpaceCameraPos - perParticleWorldPos);

				float radius = atan2(lookAt.z,lookAt.x)/6.283 + 0.5;
				radius = -frac(radius + _Rotation);

				float Index = floor(_Param.x * _Param.y * radius);

				float2 SliceUV = v.uv.xy / _Param.xy;
				float2 ShiftUV = float2(Index,floor(Index/_Param.x))/_Param.xy;
				ShiftUV.y = 1-ShiftUV.y;


				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(ShiftUV+SliceUV, _MainTex);
				o.color = v.color;
				
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.uv);
				return col;
			}
			ENDCG
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值