当前位置:   article > 正文

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

序列帧

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


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


然后再说一下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反了

修改一下


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


上个全码

  1. Shader "Unlit/TestSheet"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _Rotation("Rotation",Range(0,1)) = 0
  7. [Header(Rows Column)] _Param("",Vector) = (8,8,0,0)
  8. }
  9. SubShader
  10. {
  11. Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
  12. Blend SrcAlpha OneMinusSrcAlpha
  13. LOD 100
  14. Pass
  15. {
  16. CGPROGRAM
  17. #pragma vertex vert
  18. #pragma fragment frag
  19. #pragma multi_compile_particles
  20. #include "UnityCG.cginc"
  21. struct appdata
  22. {
  23. float4 vertex : POSITION;
  24. float4 uv : TEXCOORD0;
  25. float4 color:COLOR;
  26. float tmp : TEXCOORD1;
  27. };
  28. struct v2f
  29. {
  30. float2 uv : TEXCOORD0;
  31. float4 vertex : SV_POSITION;
  32. float4 color:COLOR;
  33. };
  34. sampler2D _MainTex;
  35. float4 _MainTex_ST;
  36. fixed _Rotation;
  37. float2 _Param;
  38. v2f vert (appdata v)
  39. {
  40. v2f o;
  41. float3 perParticleWorldPos = float3(v.uv.zw,v.tmp);
  42. float3 lookAt = normalize(_WorldSpaceCameraPos - perParticleWorldPos);
  43. float radius = atan2(lookAt.z,lookAt.x)/6.283 + 0.5;
  44. radius = -frac(radius + _Rotation);
  45. float Index = floor(_Param.x * _Param.y * radius);
  46. float2 SliceUV = v.uv.xy / _Param.xy;
  47. float2 ShiftUV = float2(Index,floor(Index/_Param.x))/_Param.xy;
  48. ShiftUV.y = 1-ShiftUV.y;
  49. o.vertex = UnityObjectToClipPos(v.vertex);
  50. o.uv = TRANSFORM_TEX(ShiftUV+SliceUV, _MainTex);
  51. o.color = v.color;
  52. return o;
  53. }
  54. fixed4 frag (v2f i) : SV_Target
  55. {
  56. fixed4 col = tex2D(_MainTex, i.uv);
  57. return col;
  58. }
  59. ENDCG
  60. }
  61. }
  62. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/138370
推荐阅读
相关标签
  

闽ICP备14008679号