当不要脸已成习惯,当山峰也没有了棱角,当招人这么困难的时候,我还是在篇头植入的招聘。
坐标山东青岛市北,招聘日系画师,其他岗位目前公司没有说,有意思的可以入群私聊。
然后再说一下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
}
}
}