进击的序列帧 三(额外篇,一篇顶两篇)------- 让你的序列帧没有帧感,如飘柔般丝滑。

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

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


然后再说一下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不就是下一帧的序号么。。。

那么我们开始写上

Index += 1 ;
float2 ShiftUV2 = float2 (Index, floor (Index/_Param.x))/_Param.xy;
ShiftUV2.y = 1 -ShiftUV2.y;


那么,下一帧的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不就是这个值么。。。














猜你喜欢

转载自blog.csdn.net/u012871784/article/details/80322676
今日推荐