一种虚拟对象的大规模动画渲染方法、装置、设备及介质与流程
未命名
09-03
阅读:92
评论:0

1.本发明涉及动画渲染技术领域,尤其涉及一种虚拟对象的大规模动画渲染方法、装置、设备及介质。
背景技术:
2.在大量虚拟对象同屏时,由于虚拟对象数量众多,渲染压力会很大,会产生数量庞大的drawcal。为了降低drawcall的数量,通常会使用动态合批和gpu instance等技术来优化渲染性能。然而,在某些情况下,由于每个虚拟对象在同一时刻的状态是不一样的,导致它们的材质或纹理不同,就无法进行动态合批等技术,这意味着无法利用动态合批等技术来优化渲染性能,而需要逐个绘制每个对象,无法有效减少drawcall的数量。
技术实现要素:
3.本发明的目的在于提供一种虚拟对象的大规模动画渲染方法、装置、设备及介质,利用simd指令和动画播放计算函数批量计算多个虚拟对象的当前播放动画、帧,并在gpu中进行渲染处理,以解决上述现有问题的至少之一。
4.本发明提供了一种虚拟对象的大规模动画渲染方法,所述方法具体包括:
5.为每个虚拟对象创建动画概要数据结构体和动画播放器结构体,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组;
6.基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体;
7.将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理。
8.进一步的,所述为每个虚拟对象创建动画概要数据结构和动画播放器结构,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组,具体包括:
9.为每个虚拟对象创建动画概要数据结构体,所述动画概要数据结构体用于存储每个虚拟对象的动画数量、每个动画的所有关键帧的时间点;
10.为每个虚拟对象创建动画播放器结构体,所述动画播放器结构体用于存储当前播放动画的动画索引和当前播放帧的帧索引;
11.创建第一数组,所述第一数组用于存储所有虚拟对象的动画概要数据结构体;
12.创建第二数组,所述第二数组用于存储所有虚拟对象的动画播放器结构体。
13.进一步的,所述基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体,具体包
括:
14.创建动画播放计算函数;
15.在所述动画播放计算函数中,通过所述第一数组获取当前屏幕中每个虚拟对象的当前播放动画的关键帧的时间点,然后加载到simd寄存器中;
16.在所述simd寄存器中,使用simd指令对当前屏幕中每个虚拟对象的当前播放动画的关键帧的时间点进行计算操作,获得当前屏幕中每个虚拟对象的当前播放动画的动画索引和当前播放帧的帧索引并分别存储至各自的所述动画播放器结构体进行更新;
17.判定当前帧不是当前动画的最后一帧,切换到下一帧,或者,判定当前帧是当前动画的最后一帧,切换到下一个动画,继续调用所述动画播放计算函数和所述simd指令确定新的动画索引和帧索引。
18.进一步的,所述将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理,具体包括:
19.遍历每个虚拟对象,并将相同种类的虚拟对象存储到同一个数组中;
20.获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,将所述顶点位置坐标和所述顶点uv纹理坐标转换为gpu处理格式的动画数据并传输到gpu中;
21.在所述gpu中设置顶点着色器和片段着色器,根据所述顶点着色器和所述片段着色器处理所述动画数据,获得着色数据;
22.根据所述着色数据对每个相同种类的虚拟对象进行渲染处理。
23.更进一步的,所述遍历每个虚拟对象,并将相同种类的虚拟对象存储到同一个数组中,具体包括:
24.采集相同种类的虚拟对象的角色参数,并为每个相同种类的虚拟对象创建一个用于存储角色参数的结构体;
25.创建第三数组集合,所述第三数组集合包含若干个第三数组;
26.遍历每个相同种类的虚拟对象的结构体,将每个结构体分别存储至一个所述第三数组中。
27.更进一步的,所述获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,将所述顶点位置坐标和所述顶点uv纹理坐标转换为gpu处理格式的动画数据并传输到gpu中,具体包括:
28.根据每个相同种类的虚拟对象的骨骼动画数据的大小,在gpu中创建一个尺寸对应的纹理贴图对象或缓冲区对象;
29.获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,然后存储到所述纹理贴图对象或所述缓冲区对象中;
30.使用opengl库设置所述纹理贴图对象或所述缓冲区对象的参数,然后将所述纹理贴图对象或所述缓冲区对象传输到所述gpu中。
31.更进一步的,所述根据所述顶点着色器和所述片段着色器处理所述动画数据,获得着色数据,具体包括:
32.在所述顶点着色器中设置模型矩阵和骨骼矩阵数组,所述模型矩阵用于将每个虚
拟对象的模型从局部空间变换为观察空间,所述骨骼矩阵用于计算每个虚拟对象的骨骼动画变换;
33.根据所述模型矩阵和所述骨骼矩阵数组,对所述动画数据中转换格式后的顶点位置坐标和顶点uv纹理坐标进行变换,获得目标顶点位置;
34.将所述目标顶点位置中的片段uv纹理坐标传输至所述片段着色器,根据所述片段着色器对所述片段uv纹理坐标进行颜色采样并输出目标片段颜色;
35.将所述目标顶点位置和所述目标片段颜色合并为着色数据。
36.本发明还提供了一种虚拟对象的大规模动画渲染装置,所述装置具体包括:
37.第一处理模块,用于为每个虚拟对象创建动画概要数据结构体和动画播放器结构体,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组;
38.第二处理模块,用于基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体;
39.渲染处理模块,用于将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理。
40.本发明还提供了一种计算机设备,包括:存储器和处理器及存储在存储器上的计算机程序,当所述计算机程序在处理器上被执行时,实现如上述方法中任一项所述的虚拟对象的大规模动画渲染方法。
41.本发明还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器运行时,实现如上述方法中任一项所述的虚拟对象的大规模动画渲染方法。
42.与现有技术相比,本发明具有以下技术效果的至少之一:
43.1、通过将骨骼顶点坐标和uv纹理贴图信息打包成纹理贴图或者存储到缓冲区的方式,可以将多个虚拟对象的数据合并到一张大的纹理或缓冲区中,可以减少每个虚拟对象的独立绘制和状态切换的开销,从而降低了drawcall的数量。
44.2、使用顶点着色器中的骨骼矩阵数组对顶点坐标进行动画变换。这种方式允许每个虚拟对象在同一时刻具有不同的状态,因为骨骼矩阵可以根据每个对象的骨骼动画数据进行个别计算,这使得可以在同一次绘制调用中处理多个虚拟对象的动画变换,而无需进行状态切换或独立绘制,进一步减少了drawcall的数量。
45.3、本发明的动画计算和变换操作是在gpu上进行的,通过使用纹理贴图和着色器程序,可以充分利用gpu的并行计算能力,可以在一次绘制调用中同时处理多个虚拟对象的动画变换,从而提高渲染性能。
46.4、通过设置动画概要数据结构体和动画播放器结构体,利用simd指令和动画播放计算函数批量计算多个虚拟对象的当前播放动画、帧,提高了执行效率。
附图说明
47.是为了更清楚地说明本技术实施例中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的
附图。
48.图1是本发明实施例提供的一种虚拟对象的大规模动画渲染方法的流程示意图;
49.图2是本发明实施例提供的一种虚拟对象的大规模动画渲染装置的结构示意图;
50.图3是本发明实施例提供的一种计算机设备的结构示意图。
具体实施方式
51.以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本技术实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本技术。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本技术的描述。
52.应当理解,当在本技术说明书和所附权利要求书中使用时,术语“包括”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
53.还应当理解,在本技术说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
54.如在本技术说明书和所附权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。
[0055]
另外,在本技术说明书和所附权利要求书的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
[0056]
在本技术说明书中描述的参考“一个实施例”或“一些实施例”等意味着在本技术的一个或多个实施例中包括结合该实施例描述的特定特征、结构或特点。由此,在本说明书中的不同之处出现的语句“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
[0057]
在大量虚拟对象同屏时,由于虚拟对象数量众多,渲染压力会很大,会产生数量庞大的drawcal。为了降低drawcall的数量,通常会使用动态合批和gpu instance等技术来优化渲染性能。然而,在某些情况下,由于每个虚拟对象在同一时刻的状态是不一样的,导致它们的材质或纹理不同,就无法进行动态合批等技术,这意味着无法利用动态合批等技术来优化渲染性能,而需要逐个绘制每个对象,无法有效减少drawcall的数量。
[0058]
参照图1,本发明实施例提供了一种虚拟对象的大规模动画渲染方法,所述方法具体包括:
[0059]
s101:为每个虚拟对象创建动画概要数据结构体和动画播放器结构体,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组;
[0060]
基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引
和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体。
[0061]
在一些实施例中,所述为每个虚拟对象创建动画概要数据结构和动画播放器结构,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组,具体包括:
[0062]
为每个虚拟对象创建动画概要数据结构体,所述动画概要数据结构体用于存储每个虚拟对象的动画数量、每个动画的所有关键帧的时间点;
[0063]
为每个虚拟对象创建动画播放器结构体,所述动画播放器结构体用于存储当前播放动画的动画索引和当前播放帧的帧索引;
[0064]
创建第一数组,所述第一数组用于存储所有虚拟对象的动画概要数据结构体;
[0065]
创建第二数组,所述第二数组用于存储所有虚拟对象的动画播放器结构体。
[0066]
在一些实施例中,所述基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体,具体包括:
[0067]
创建动画播放计算函数;
[0068]
在所述动画播放计算函数中,通过所述第一数组获取当前屏幕中每个虚拟对象的当前播放动画的关键帧的时间点,然后加载到simd寄存器中;
[0069]
在所述simd寄存器中,使用simd指令对当前屏幕中每个虚拟对象的当前播放动画的关键帧的时间点进行计算操作,获得当前屏幕中每个虚拟对象的当前播放动画的动画索引和当前播放帧的帧索引并分别存储至各自的所述动画播放器结构体进行更新;
[0070]
判定当前帧不是当前动画的最后一帧,切换到下一帧,或者,判定当前帧是当前动画的最后一帧,切换到下一个动画,继续调用所述动画播放计算函数和所述simd指令确定新的动画索引和帧索引。
[0071]
该实施例中,当虚拟对象的数量过于庞大时,gpu端计算所有角色正在播第几个动画、播放到第几帧也是一个庞大的计算量,为了解决这个问题,使用simd指令来批量处理这些计算。首先,将虚拟对象的动画概要数据(一个角色有几个动画,每个动画所有关键帧的时间点)设计成一个结构体struct(animationdata),再设计一个动画播放器结构体struct(player),用于存储动画播放计算函数的计算结果,以及两个数组(animationdata[],player[]),分别用来装所有虚拟对象的动画概要数据结构体struct(animationdata)与动画播放器结构体struct(player),还要设计一个动画播放计算函数(playanimation)用来计算“角色正在播第几个动画、播放到第几帧”。playanimation函数可以用simd指令执行,操作数分别为animationdata[]、player[],操作数设计成大数组目的是为了增加内存命中率,增加指令的执行效率,提高同屏单位的承载能力。
[0072]
该实施例的代码示例如下。
[0073]
[0074]
[0075][0076][0077]
上述代码中,animationdata结构体用于存储角色的动画数量和每个动画的关键帧的时间点。player结构体用于控制角色的动画播放,包含当前播放动画的动画索引和当前播放帧的帧索引。animationdata数组用于存储所有角色的动画概要数据,player数组用
于存储所有角色的动画播放器。
[0078]
playanimation函数接受角色索引作为输入,并根据角色的当前动画索引和帧索引执行相应的逻辑。根据当前的动画索引和帧索引,可以在函数中执行相关操作,如更新角色的顶点坐标和uv等。然后,根据当前帧索引判断是否需要切换到下一帧或下一个动画。
[0079]
使用_mm_loadu_si128函数加载当前动画的关键帧时间点到keyframe_times变量中,然后使用simd指令_mm_add_epi32对关键帧的时间点进行加法计算,将结果存储回帧索引数组。这样,通过一次simd指令操作,同时对多个角色的帧索引进行计算,实现了批量处理和并行计算的优化效果。
[0080]
在示例代码的main函数中,创建了一个animationdata对象和一个player对象,并将它们添加到对应的数组中。然后,调用playanimation函数播放动画,并获取当前的动画索引和帧索引,最后将其输出到控制台。
[0081]
s102:将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理。
[0082]
在一些实施例中,所述将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理,具体包括:
[0083]
遍历每个虚拟对象,并将相同种类的虚拟对象存储到同一个数组中;
[0084]
获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,将所述顶点位置坐标和所述顶点uv纹理坐标转换为gpu处理格式的动画数据并传输到gpu中;
[0085]
在所述gpu中设置顶点着色器和片段着色器,根据所述顶点着色器和所述片段着色器处理所述动画数据,获得着色数据;
[0086]
根据所述着色数据对每个相同种类的虚拟对象进行渲染处理。
[0087]
在一些实施例中,所述遍历每个虚拟对象,并将相同种类的虚拟对象存储到同一个数组中,具体包括:
[0088]
采集相同种类的虚拟对象的角色参数,并为每个相同种类的虚拟对象创建一个用于存储角色参数的结构体;
[0089]
创建第三数组集合,所述第三数组集合包含若干个第三数组;
[0090]
遍历每个相同种类的虚拟对象的结构体,将每个结构体分别存储至一个所述第三数组中。
[0091]
该实施例中,由于使用了gpu动画,cpu端只需传两个参数给gpu:“角色正在播第几个动画、播放到第几帧”,故可以把相同种类的角色参数组装成数组传给gpu,利用gpu instance加快绘制效率。假设有6000个单位,这6000个单位由60种小兵组成,使用了gpu instance后只需绘制60次,相比6000次降低了100倍的绘制次数。
[0092]
创建一个数组来存储相同种类角色参数的数据结构的代码示例如下。
[0093]
//定义数据结构来存储角色参数
[0094][0095]
在一些实施例中,所述获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,将所述顶点位置坐标和所述顶点uv纹理坐标转换为gpu处理格式的动画数据并传输到gpu中,具体包括:
[0096]
根据每个相同种类的虚拟对象的骨骼动画数据的大小,在gpu中创建一个尺寸对应的纹理贴图对象或缓冲区对象;
[0097]
获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,然后存储到所述纹理贴图对象或所述缓冲区对象中;
[0098]
使用opengl库设置所述纹理贴图对象或所述缓冲区对象的参数,然后将所述纹理贴图对象或所述缓冲区对象传输到所述gpu中。
[0099]
该实施例中,可以使用纹理贴图(texture maps)或者存储在缓冲区的方法将每个虚拟对象的骨骼动画数据转换为适合gpu处理的格式。
[0100]
使用opengl库设置所述纹理贴图对象或所述缓冲区对象的参数,然后将所述纹理贴图对象或所述缓冲区对象传输到所述gpu中,具体步骤如下:
[0101]
第一步,绑定纹理对象或缓冲对象:使用glbindtexture函数将纹理对象绑定为当前操作的纹理,或使用glbindbuffer函数将缓冲对象绑定为当前操作的缓冲区。
[0102]
第二步,设置纹理参数或缓冲参数:使用gltexparameteri函数(对于纹理对象)或
glbufferstorage函数(对于缓冲对象)设置纹理参数或缓冲参数,例如过滤模式、包装模式等。
[0103]
第三步,传输数据到gpu:使用glteximage2d函数(对于纹理对象)或glbufferdata函数(对于缓冲对象)指定数据的格式、大小和内存布局等参数,这些函数接受参数,例如数据的宽度、高度、像素格式、数据类型等;提供要传输的数据,可以是指针指向的cpu内存中的数据,或者使用glmapbuffer函数将数据映射到cpu内存中,然后进行修改;调用glteximage2d函数(对于纹理对象)或glbufferdata函数(对于缓冲对象)传输数据到gpu中。
[0104]
第四步,解绑纹理对象或缓冲对象:使用glbindtexture函数将纹理对象解绑,或使用glbindbuffer函数将缓冲对象解绑,以确保后续操作不会影响到这些对象。
[0105]
通过以上步骤,可以将纹理数据或缓冲数据传输到gpu中,以供后续的渲染操作使用。
[0106]
在一些实施例中,所述根据所述顶点着色器和所述片段着色器处理所述动画数据,获得着色数据,具体包括:
[0107]
在所述顶点着色器中设置模型矩阵和骨骼矩阵数组,所述模型矩阵用于将每个虚拟对象的模型从局部空间变换为观察空间,所述骨骼矩阵用于计算每个虚拟对象的骨骼动画变换;
[0108]
根据所述模型矩阵和所述骨骼矩阵数组,对所述动画数据中转换格式后的顶点位置坐标和顶点uv纹理坐标进行变换,获得目标顶点位置;
[0109]
将所述目标顶点位置中的片段uv纹理坐标传输至所述片段着色器,根据所述片段着色器对所述片段uv纹理坐标进行颜色采样并输出目标片段颜色;
[0110]
将所述目标顶点位置和所述目标片段颜色合并为着色数据。
[0111]
该实施例中,在顶点着色器中,使用角色的动画数据(例如骨骼矩阵)来计算变换后的顶点坐标;在片段着色器中,使用角色的动画数据(例如uv贴图坐标)来计算纹理采样。
[0112]
具体的代码示例如下。
[0113][0114]
上述代码中,顶点着色器接受角色的顶点坐标和uv作为输入,并使用骨骼矩阵数组对顶点坐标进行变换。在每个顶点上进行骨骼动画的计算,并将变换后的顶点位置传递给片段着色器。片段着色器接收变换后的顶点位置,使用uv坐标从纹理贴图中采样颜色,并输出最终的片段颜色。
[0115]
参照图2,本发明实施例还提供了一种虚拟对象的大规模动画渲染装置,所述装置具体包括:
[0116]
第一处理模块201,用于为每个虚拟对象创建动画概要数据结构体和动画播放器结构体,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组;
[0117]
第二处理模块202,用于基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体;
[0118]
渲染处理模块203,用于将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理。
[0119]
可以理解的是,如图1所示的虚拟对象的大规模动画渲染方法实施例中的内容均适用于本虚拟对象的大规模动画渲染装置实施例中,本虚拟对象的大规模动画渲染装置实施例所具体实现的功能与如图1所示的虚拟对象的大规模动画渲染方法实施例相同,并且达到的有益效果与如图1所示的虚拟对象的大规模动画渲染方法实施例所达到的有益效果也相同。
[0120]
需要说明的是,上述装置之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,其具体功能及带来的技术效果,具体可参见方法实施例部分,此处不再赘述。
[0121]
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本技术的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0122]
参照图3,本发明实施例还提供了一种计算机设备3,包括:存储器302和处理器301及存储在存储器302上的计算机程序303,当所述计算机程序303在处理器301上被执行时,实现如上述方法中任一项所述的虚拟对象的大规模动画渲染方法。
[0123]
所述计算机设备3可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。该计算机设备3可包括,但不仅限于,处理器301、存储器302。本领域技术人员可以理解,图3仅仅是计算机设备3的举例,并不构成对计算机设备3的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如还可以包括输入输出设备、网络接入设备等。
[0124]
所称处理器301可以是中央处理单元(central processing unit,cpu),该处理器301还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现成可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0125]
所述存储器302在一些实施例中可以是所述计算机设备3的内部存储单元,例如计
算机设备3的硬盘或内存。所述存储器302在另一些实施例中也可以是所述计算机设备3的外部存储设备,例如所述计算机设备3上配备的插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。进一步地,所述存储器302还可以既包括所述计算机设备3的内部存储单元也包括外部存储设备。所述存储器302用于存储操作系统、应用程序、引导装载程序(bootloader)、数据以及其他程序等,例如所述计算机程序的程序代码等。所述存储器302还可以用于暂时地存储已经输出或者将要输出的数据。
[0126]
本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器运行时,实现如上述方法中任一项所述的虚拟对象的大规模动画渲染方法。
[0127]
该实施例中,所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术实现上述实施例方法中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质至少可以包括:能够将计算机程序代码携带到拍照装置/终端设备的任何实体或装置、记录介质、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质。例如u盘、移动硬盘、磁碟或者光盘等。在某些司法管辖区,根据立法和专利实践,计算机可读介质不可以是电载波信号和电信信号。
[0128]
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
[0129]
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
[0130]
在本技术所公开的实施例中,应该理解到,所揭露的装置/终端设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/终端设备实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
[0131]
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
技术特征:
1.一种虚拟对象的大规模动画渲染方法,其特征在于,所述方法具体包括:为每个虚拟对象创建动画概要数据结构体和动画播放器结构体,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组;基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体;将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理。2.根据权利要求1所述的方法,其特征在于,所述为每个虚拟对象创建动画概要数据结构和动画播放器结构,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组,具体包括:为每个虚拟对象创建动画概要数据结构体,所述动画概要数据结构体用于存储每个虚拟对象的动画数量、每个动画的所有关键帧的时间点;为每个虚拟对象创建动画播放器结构体,所述动画播放器结构体用于存储当前播放动画的动画索引和当前播放帧的帧索引;创建第一数组,所述第一数组用于存储所有虚拟对象的动画概要数据结构体;创建第二数组,所述第二数组用于存储所有虚拟对象的动画播放器结构体。3.根据权利要求1所述的方法,其特征在于,所述基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体,具体包括:创建动画播放计算函数;在所述动画播放计算函数中,通过所述第一数组获取当前屏幕中每个虚拟对象的当前播放动画的关键帧的时间点,然后加载到simd寄存器中;在所述simd寄存器中,使用simd指令对当前屏幕中每个虚拟对象的当前播放动画的关键帧的时间点进行计算操作,获得当前屏幕中每个虚拟对象的当前播放动画的动画索引和当前播放帧的帧索引并分别存储至各自的所述动画播放器结构体进行更新;判定当前帧不是当前动画的最后一帧,切换到下一帧,或者,判定当前帧是当前动画的最后一帧,切换到下一个动画,继续调用所述动画播放计算函数和所述simd指令确定新的动画索引和帧索引。4.根据权利要求1所述的方法,其特征在于,所述将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理,具体包括:遍历每个虚拟对象,并将相同种类的虚拟对象存储到同一个数组中;获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,将所述顶点位置坐标和所述顶点uv纹理坐标转换为gpu处理格式的动画数据并传输到gpu中;在所述gpu中设置顶点着色器和片段着色器,根据所述顶点着色器和所述片段着色器
处理所述动画数据,获得着色数据;根据所述着色数据对每个相同种类的虚拟对象进行渲染处理。5.根据权利要求4所述的方法,其特征在于,所述遍历每个虚拟对象,并将相同种类的虚拟对象存储到同一个数组中,具体包括:采集相同种类的虚拟对象的角色参数,并为每个相同种类的虚拟对象创建一个用于存储角色参数的结构体;创建第三数组集合,所述第三数组集合包含若干个第三数组;遍历每个相同种类的虚拟对象的结构体,将每个结构体分别存储至一个所述第三数组中。6.根据权利要求4所述的方法,其特征在于,所述获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,将所述顶点位置坐标和所述顶点uv纹理坐标转换为gpu处理格式的动画数据并传输到gpu中,具体包括:根据每个相同种类的虚拟对象的骨骼动画数据的大小,在gpu中创建一个尺寸对应的纹理贴图对象或缓冲区对象;获取每个相同种类的虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标,然后存储到所述纹理贴图对象或所述缓冲区对象中;使用opengl库设置所述纹理贴图对象或所述缓冲区对象的参数,然后将所述纹理贴图对象或所述缓冲区对象传输到所述gpu中。7.根据权利要求4所述的方法,其特征在于,所述根据所述顶点着色器和所述片段着色器处理所述动画数据,获得着色数据,具体包括:在所述顶点着色器中设置模型矩阵和骨骼矩阵数组,所述模型矩阵用于将每个虚拟对象的模型从局部空间变换为观察空间,所述骨骼矩阵用于计算每个虚拟对象的骨骼动画变换;根据所述模型矩阵和所述骨骼矩阵数组,对所述动画数据中转换格式后的顶点位置坐标和顶点uv纹理坐标进行变换,获得目标顶点位置;将所述目标顶点位置中的片段uv纹理坐标传输至所述片段着色器,根据所述片段着色器对所述片段uv纹理坐标进行颜色采样并输出目标片段颜色;将所述目标顶点位置和所述目标片段颜色合并为着色数据。8.一种虚拟对象的大规模动画渲染装置,其特征在于,所述装置具体包括:第一处理模块,用于为每个虚拟对象创建动画概要数据结构体和动画播放器结构体,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组;第二处理模块,用于基于simd指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体;渲染处理模块,用于将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引对应的顶点位置坐标和顶点uv纹理坐标加载到gpu中进行渲染处理。9.一种计算机设备,其特征在于,包括:存储器和处理器及存储在存储器上的计算机程
序,当所述计算机程序在处理器上被执行时,实现如权利要求1至7中任一项所述的虚拟对象的大规模动画渲染方法。10.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,所述计算机程序被处理器运行时,实现如权利要求1至7中任一项所述的虚拟对象的大规模动画渲染方法。
技术总结
本发明涉及动画渲染技术领域,尤其涉及一种虚拟对象的大规模动画渲染方法、装置、设备及介质,所述方法具体包括:为每个虚拟对象创建动画概要数据结构体和动画播放器结构体,将所有虚拟对象的所述动画概要数据结构体存储至第一数组,将所有虚拟对象的所述动画播放器结构体存储至第二数组;基于SIMD指令,根据动画播放计算函数通过所述第一数组确定每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引,并将每个虚拟对象当前播放动画的动画索引和当前播放帧的帧索引分别存储至各自的所述动画播放器结构体。本发明利用SIMD指令和动画播放计算函数批量计算多个虚拟对象的当前播放动画、帧,并在GPU中进行渲染处理。并在GPU中进行渲染处理。并在GPU中进行渲染处理。
技术研发人员:岑观清 苏中华 罗宇轩 张志锋 卢明华
受保护的技术使用者:广州三七极创网络科技有限公司
技术研发日:2023.06.05
技术公布日:2023/8/31
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/