一种基于gpu的高效顶点动画播放方法
技术领域
1.本发明涉及游戏开发技术领域,特别涉及一种基于gpu的高效顶点动画播放方法。
背景技术:2.当前有两种模型动画的方式,即顶点动画和骨骼动画。在骨骼动画中,模型具有互相连接的“骨骼”组成的骨架结构,通过改变骨骼的朝向和位置来为模型生成动画。骨骼动画每帧都需要cpu计算,随着游戏画面中同屏的游戏角色的数量越来越多,cpu高负荷运转,会出现游戏卡顿的现象,导致游戏帧率降低,玩家体验变差。而gpu计算能力比cpu高很多,因此就有了将更新顶点的计算放在gpu端进行,也就衍生了将骨骼动画烘焙到纹理的技术,这就是当前存在的gpu顶点动画技术。但在顶点动画中,仍然存在gpu内存浪费严重的现象,这是由于:骨骼动画烘焙到顶点动画的纹理编辑器只适用单个动画烘焙,在将单个动画烘焙到对应的单个顶点动画纹理中,纹理需要2的幂次方,于是就会出现很多空白像素,在游戏角色较多、动画较多的情况下会严重浪费gpu内存,此外,现有的顶点动画使用的rgbahalf的纹理格式本身所占用的内存大小为512*512像素,需要2m内存,这就更加剧了对gpu内存的占用,不利于动画播放效果的展示。
技术实现要素:3.为解决上述问题,本发明提供了一种基于gpu的高效顶点动画播放方法。
4.本发明采用以下技术方案:
5.一种基于gpu的高效顶点动画播放方法,包括如下步骤:
6.s1、获取待烘焙的骨骼动画片段中每一帧的顶点位置;
7.s2、对各所述顶点位置的值进行修正压缩;
8.s3、将修正压缩后的顶点位置数据烘焙到纹理中,所述纹理中每段纹理像素坐标对应一帧骨骼动画,将多个骨骼动画片段烘焙在同一张纹理中,且将每个骨骼动画片段的初始纹理像素和结束纹理像素分别作为该骨骼动画片段的开始索引和结束索引;
9.s4、将各所述骨骼动画片段的动画信息分别序列化并存储为.asset文件,所述.asset文件以所述骨骼动画片段名称命名,并索引至相对应的纹理;
10.s5、gpu根据策划配置列表获取相应的骨骼动画片段名称及其对应的.asset文件,并读取所述纹理以索引到对应动画的初始纹理像素;
11.s6、步骤s5中索引到所述纹理进行采样还原并播放。
12.进一步地,步骤s1中,所述顶点位置是通过unity内置获取的。
13.进一步地,步骤s2中对各所述顶点位置的值进行修正压缩,具体包括如下步骤:
14.s21、自定义设置一个偏移值offset,并将所述顶点位置的值(x,y,z)分别与该偏移值offset相加,得到修正后的新顶点位置的值(x1,y1,z1),且新顶点位置的值的各分量均不为负数;
15.s22、获取新顶点位置的值中最大的分量作为压缩倍数m,新顶点位置的各分量均
除以压缩倍数m,从而将各分量压缩到[0,1]范围内,压缩后的顶点位置的值为(x2,y2,z2),并将m值作为纹理像素的w分量。
[0016]
进一步地,步骤s3中,所述纹理像素坐标由修正压缩后的顶点位置的值和压缩倍数组成,即纹理像素坐标为(x2,y2,z2,m)。
[0017]
进一步地,步骤s4中,所述动画信息包括动画片段名称、帧数、长度、开始索引、结束索引以及循环次数。
[0018]
进一步地,步骤s5中,所述策划配置列表是通过动画控制脚本的inspector视图进行配置,所述策划配置列表为动画名称列表,每个所述动画名称都预先配置好对应的骨骼动画片段。
[0019]
进一步地,步骤s6中所述采样播放时,将纹理像素坐标中的x2、y2、z2分别乘以压缩倍数m,再减去偏移值offset,以还原顶点位置的值为(x,y,z)。
[0020]
采用上述技术方案后,本发明与背景技术相比,具有如下优点:
[0021]
本发明的方法将游戏角色的所有骨骼动画烘焙到同一张顶点动画纹理中,并通过修正压缩顶点数据的方式降低纹理精度,从而减少纹理对gpu内存的占用,且通过在gpu中采样还原顶点动画纹理来播放对应的动画,在保证原有播放效果的前提下,将骨骼动画对cpu的消耗转化到内存上,减少对cpu的消耗,有效提高游戏性能,减少卡顿的现象。
附图说明
[0022]
图1为本发明方法流程图。
具体实施方式
[0023]
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
[0024]
实施例
[0025]
如图1所示,一种基于gpu的高效顶点动画播放方法,包括如下步骤:
[0026]
s1、通过unity内置获取待烘焙的骨骼动画片段中每一帧的顶点位置,顶点位置的值包括x、y、z三个分量,即顶点位置的值为(x,y,z);
[0027]
s2、对各所述顶点位置的值进行修正压缩,具体包括如下步骤:
[0028]
s21、在获得骨骼动画的顶点位置的值后,通过自定义设置一个偏移值offset,并将所述顶点位置的值(x,y,z)分别与该偏移值offset相加,得到修正后的新顶点位置的值(x1,y1,z1),且新顶点位置的值的各分量均不为负数,即x1,y1,z1均不为负数;
[0029]
s22、比较新顶点位置的三个分量x1,y1,z1,获取新顶点位置的值中最大的分量作为压缩倍数m,将新顶点位置的各分量均除以压缩倍数m,从而将各分量压缩到[0,1]范围内,压缩后的顶点位置的值为(x2,y2,z2),并将m值作为纹理像素的w分量。
[0030]
现有的顶点动画使用的是rgbahalf的纹理格式,而rgbahalf每通道是16位,范围为[-6000,6000],占用的内存较大,且会出现负数的情况,而rbga32每个通道是8位,占用的内存较小,但是对于顶点动画的来说,显然其范围是不够的,因此本实施例通过步骤s2对顶点位置的数据进行修正压缩,降低精度,使其压缩到[0,1]范围内。
[0031]
s3、将修正压缩后的顶点位置数据烘焙到纹理中,所述纹理中每段纹理像素坐标对应一帧骨骼动画(因为一帧骨骼动画约有几百个顶点位置),将多个骨骼动画片段烘焙在同一张纹理中,且将每个骨骼动画片段的初始纹理像素(即第一个纹理像素)和结束纹理像素(即最后一个纹理像素)分别作为该骨骼动画片段的开始索引和结束索引;所述纹理像素坐标由修正压缩后的顶点位置的值和压缩倍数组成,即纹理像素坐标为(x2,y2,z2,m),其中w=m。这里,纹理的尺寸会自动根据需要烘焙的骨骼动画片段所需要的像素来自动设置。
[0032]
s4、将各所述骨骼动画片段的动画信息分别序列化并存储为.asset文件,所述.asset文件以所述骨骼动画片段名称命名,并索引至相对应的纹理;所述动画信息包括动画片段名称、帧数、长度、开始索引、结束索引以及循环次数,后续播放动画的时候会根据这里的动画信息进行采样播放。
[0033]
通过步骤s1-s4,我们获得了一张存储了多个骨骼动画片段的顶点动画纹理,以及分别存储了它们的动画信息的.asset文件。
[0034]
s5、gpu根据策划配置列表获取相应的骨骼动画片段名称及其对应的.asset文件,并读取所述纹理以索引到对应动画的初始纹理像素;所述策划配置列表是通过动画控制脚本的inspector视图进行配置,所述策划配置列表为动画名称列表,每个所述动画名称都预先配置好对应的骨骼动画片段。
[0035]
一般来说在游戏中播放的动画传入的名称都是固定的,也就是说动画名称是固定的,因此,我们预先在脚本中配置好这些动画名称(动画名称不等于当前播放的动画片段名称,动画名称只是一种通用名称,比如都有attack、idle、run等),其实际对应的动画片段名称,由策划人员从相应的.asset文件的名称中选择,可以选择纹理中包含任何动画片段。
[0036]
这样,在运行过程中,外部调用时,只需要关心当前要播的动画名称即可,而不需要关心实际播放的动画片段具体是什么,因为实际播放的动画都是策划人员去配置,从而实现动画的灵活配置;而内部运行时,通过动画名称即可得到当前需要播放的动画片段名称,然后跟动画片段名称从.asset文件里面获取对应动画片段的所有动画信息,gpu会根据该动画信息,找到该动画片段在纹理中的开始索引以及帧数等,再由着色器来进行采样播放。
[0037]
s6、通过unity中的着色器对步骤s5中索引到所述纹理进行采样还原并播放,采样播放时,将纹理像素坐标中的x2、y2、z2分别乘以压缩倍数m,再减去偏移值offset,以还原顶点位置的值为(x,y,z),这样最后得到的播放效果与直接采用cpu进行计算后的播放效果一致,但在内存上却降低了一半,有效地提高了游戏的性能。
[0038]
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。