本文主要是介绍进击的序列帧 三(额外篇,一篇顶两篇)------- 让你的序列帧没有帧感,如飘柔般丝滑。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
当不要脸已成习惯,当山峰也没有了棱角,当招人这么困难的时候,我还是在篇头植入的招聘。
坐标山东青岛市北,招聘日系画师,其他岗位目前公司没有说,有意思的可以入群私聊。
然后再说一下QQ群,山东手游研发聚集地335772557,进群先看公告,要是抱着我要学习的心态进群的话,那你就失望了,因为是个死群。
偶尔心情好的是时候会发个技术链接。
接下来进入正题!!
这篇文章我只是写个想法,如果想360度的立体,自己根据思路自己实现一下吧,可以跟帖讨论,反正我的博客也是个坟。
这次本来真的打算写motionvector和序列帧之间的故事。但是这个写起来太多了,一时半会儿写不完,于是乎,就继续写一下第二篇的一个触类旁通吧
自从我的序列帧立体起来了,我又困扰了,不知为啥,人总是这么作践自己。明明是个3D游戏,非得搞个2D的渲染,于是一部旷世奇作就产生了,他就是罪恶装备,其中,对本村线的印象着实深厚。明明是个2D游戏,非得做的像个3D的感觉,于是。。。。。对,于是我也开始作践。。。
这里先不引入motion vector map。只做最简单的linear lerp
lerp的公式大家都明白,lerp(a,b,v) = a*(1-v) + b*v;
很明显的,需要a和b两个color去做lerp。我们要做细腻丝滑的过度,消除帧感的思路就是前后两帧做linear lerp。
所以,我们需要采样下一帧图。
继续修改第一篇的shader
既然index是当前帧的序号,那么index+1不就是下一帧的序号么。。。
那么我们开始写上
那么,下一帧的uv也计算好了。
目前lerp的a和b都已经准备完毕了,只剩下v这个融合系数了。
计算V有点懵,咱们先放下这个问题,改成原始的序列帧随时间变化的shader。
只需要把radius修改成_Time.x就可以了。
下面咱们一起来分析一下之前第一篇留下的问题,序列帧的序号是怎么算出来的。
假如咱们的序列帧是8x8的图,这是个大前提,下面举例说明会方便很多。
8x8=64,一共64个小图。
再说一下_Time.x是一直在增长的时间变量。
第一个问题:当前时间下,我的序列帧跑到那个序号了?
floor(64*_Time.x);是这个结果吧。(如果不理解,假设t=0,那么得到的就是0;t=0.1,结果=6;如果t=1,结果=64;t=1.1,结果=70;得到的结果是哪张图?如果不理解的话,请恶补一下uv方面的知识吧还有wrapmode)
64*_Time.x究竟有什么意义。。。其实就是把_Time.x根据图片序列的数量放大了多少倍。
我们再修改一下。
speed = _Time.x*速度;
那么64*speed的意义不就是把速度提升了64倍。
不过说这些都没有什么用。。。
我们回归一下,思考一下。
floor(64*_Time.x )是当前帧,到下一帧floor(64*_Time.x) + 1所用的时间是多少?
_Time.x是个线性增长的值,那么当前帧跟下一帧的时间间隔一直都是一样的,这个时间间隔只与_Time.x的增长速度有关系。
那么,frac(64*_Time.x)是什么意义呢?这是第二个问题
这个问题的意义就这样明确了吧——当前帧跟下一帧的时间间隔;一直都是0-1变化着。
我们所探求的v不就是这个值么。。。
这篇关于进击的序列帧 三(额外篇,一篇顶两篇)------- 让你的序列帧没有帧感,如飘柔般丝滑。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!