一种骨骼动画兼容处理方法与流程

文档序号:15640896发布日期:2018-10-12 22:03阅读:620来源:国知局

本发明涉及计算机图形技术领域,更具体地说,涉及一种骨骼动画兼容处理的实现方法。



背景技术:

骨骼动画是计算机动画技术的一个重要组成部分,在计算机辅助动画电影制作和各类广告制作中一直发挥着重要的作用。

随着计算机硬件能力的提升和渲染技术的提升,计算机绘制出来的图像越来越逼真,不仅仅在传统的动画上面有进一步的发展,3d动画电影也越来越受到观众的喜爱。现在使用最广泛的关键帧动画就是骨骼动画。在骨骼动画中,动画模型由两个部分来表示:一个部分是形成层次的一系列骨胳,即骨架(skeleton),每一个骨骼数据都包含其自身的动画数据;另一个部分是蒙在骨架上的皮肤(skin),即网格模型,用于提供动画绘制所需要的几何模型和纹理材质信息。通过对骨架进行动画模拟,再利用骨胳控制皮肤变形就实现了骨骼动画。骨骼动画与关键帧动画相比占用空间较小,因为它不需要存储每一帧的各个顶点的数据,而只需存储每一帧的骨骼(骨骼数量相对较少),并且多个不同的皮肤可以通过使用相同的骨骼共享相同的动画。骨骼动画在蒙皮时通常有两种计算方式,一种是通过cpu运算好骨架动画数据,然后再通过cpu来进行顶点变换来改变顶点的位置,最后再将变换后的顶点提交给gpu来渲染。另一种是通过cpu运算好骨架动画数据后直接提交给gpu,gpu直接对原始网格的顶点缓冲对象(vbo)在着色器(shader)中进行变化位置后直接绘制在屏幕上。后者不仅有效的利用的gpu的算力来加速了蒙皮的过程,并且不用重复提交不同姿态(pose)网格顶点数据给gpu,大大降低了cpu与gpu通讯所带来的开销。然而后者也并不是没有缺点,虽然不用像前者那种每次都去提交大量顶点数据,但是要提交骨骼数据(相对较小)。虽然顶点着色器可以同过uniform标示符的变量来接收骨骼数据,但是现代gpu通常都会有uniform变量的容量限制(通常是256*4个浮点精度数)。然后骨骼数据中一个骨头的数据就需要占据16个浮点精度数,也就是说即使全部使用最多也就64根骨头数据。然而实际渲染过程中着色器中还需要接收诸如灯光,材质等等的的数据。所以真正能剩下的uniform变量少之又少(大概仅剩下1/3-1/2,依赖于材质复杂度和灯光个数,换算下来就是20-30根骨骼)。所以如何让大量骨骼的骨骼动画运行在gpu上就成了一个问题。



技术实现要素:

为了解决上述问题,本发明提供一种骨骼动画兼容处理方法,通过cpu运算好骨骼动画数据然后提交给gpu,如下步骤:

s1、根据cpu运算好的骨骼动画数据判断骨骼数所需要的uniform变量书是否小于剩余着色器的uniform变量个数,如果是,转到步骤s2;如果否,转到步骤s3;

s2、直接采用uniform的方式将骨骼数提交给着色器;

s3、通过纹理映射的方式将骨骼数传递给着色器;

所述步骤s3中通过纹理映射的方式将骨骼数传递给着色器主要包括如下步骤:

s31、判断硬件是否支持浮点精度纹理,如果是,转到步骤s32;如果否,转到步骤s33;

s32、当硬件支持浮点精度纹理时,将骨骼数进行更新,并将更新后的骨骼数据依次填充进纹理当中,然后和着色器中的纹理采样器绑定,顶点着色器通过顶点缓冲对象中的骨骼id数映射成纹理的坐标,纹理采样器再根据纹理坐标依次往后采样4个像素(一个像素有rgba4个浮点精度通道),总共所采样处理的16像素通道值就是一个骨骼所需的16个浮点精度数据;

s33、当硬件不支持浮点精度纹理时,纹理数据只能保存0-255之间的整型数据,将浮点数据映射成整形数据填充到纹理里。

将浮点数据映射成整形数据填充到纹理里包括如下步骤:

s33-1、将浮点精度数拆成4个byte即4个纹理像素保存;

s33-2、把所有数据用byte方式存到纹理中,然后和着色器中的纹理采样器绑定,顶点着色器通过顶点缓冲对象中的骨骼id映射成纹理坐标,纹理采样器根据纹理坐标依次向后采样16个像素;

s33-3、步骤s33-2中采样到的16个像素包含64个byte值,即未解码的64个0-255的整型数据,以4个整型数据组装成一个浮点数的方式将64个byte值解码成16个浮点数,解码后的16个浮点数对应骨骼的骨骼数据。

采用本发明方法能够解决大量骨骼的骨骼动画运行在gpu上,实现骨骼动画兼容性处理。

具体实施方式

为了更好的理解本发明,下面详细说明本发明。

本发明提供一种骨骼动画兼容处理方法,通过cpu运算好骨骼动画数据然后提交给gpu,如下步骤:

s1、根据cpu运算好的骨骼动画数据判断骨骼数所需要的uniform变量书是否小于剩余着色器的uniform变量个数,如果是,转到步骤s2;如果否,转到步骤s3;

s2、直接采用uniform的方式将骨骼数提交给着色器;

s3、通过纹理映射的方式将骨骼数传递给着色器;

所述步骤s3中通过纹理映射的方式将骨骼数传递给着色器主要包括如下步骤:

s31、判断硬件是否支持浮点精度纹理,如果是,转到步骤s32;如果否,转到步骤s33;

s32、当硬件支持浮点精度纹理时,将骨骼数进行更新,并将更新后的骨骼数据依次填充进纹理当中,然后和着色器中的纹理采样器绑定,顶点着色器通过顶点缓冲对象中的骨骼id数映射成纹理的坐标,纹理采样器再根据纹理坐标依次往后采样4个像素(一个像素有rgba4个浮点精度通道),总共所采样处理的16像素通道值就是一个骨骼所需的16个浮点精度数据;

s33、当硬件不支持浮点精度纹理时,纹理数据只能保存0-255之间的整型数据,将浮点数据映射成整形数据填充到纹理里。

将浮点数据映射成整形数据填充到纹理里包括如下步骤:

s33-1、将浮点精度数拆成4个byte即4个纹理像素保存;

s33-2、把所有数据用byte方式存到纹理中,然后和着色器中的纹理采样器绑定,顶点着色器通过顶点缓冲对象中的骨骼id映射成纹理坐标,纹理采样器根据纹理坐标依次向后采样16个像素;

s33-3、步骤s33-2中采样到的16个像素包含64个byte值,即未解码的64个0-255的整型数据,以4个整型数据组装成一个浮点数的方式将64个byte值解码成16个浮点数,解码后的16个浮点数对应骨骼的骨骼数据。

具体地说,当骨骼数所需要的uniform变量小于剩余着色器的uniform变量个数时,就采用uniform方式提交给着色器。

当骨骼数所需要的uniform变量大于剩余着色器uniform变量个数时,通过纹理映射的方式传递给着色器。由于有些硬件不支持浮点精度的纹理,所以这里会根据具体情况作如下处理:

当硬件支持浮点精度纹理时,把更新后的骨骼数据依次填充进纹理当中,然后和着色器中的纹理采样器绑定,顶点着色器通过顶点缓冲对象中的骨骼id数映射成纹理的坐标,纹理采样器在根据纹理坐标依次往后采样4个像素(一个像素有rgba4个浮点精度通道),所采样出来的16像素通道值就是一个骨骼所需的16个浮点精度数据。

当硬件不支持浮点精度纹理时,纹理数据只能保存0-255之间的整型数据。所以我们需要把浮点数据映射成整型数据填充到纹理里,在内存中一个byte就是表示0-255之间的数,而一个浮点精度数由4个byte组成,所以我们需要把浮点精度数拆成4个byte(也就是需要4个纹理像素来保存),这里就涉及到浮点精度数在内存中如何存放。当把所有数据用byte方式存放到纹理中后,和着色器中的纹理采样器绑定,顶点着色器通过顶点缓冲对象中的骨骼id映射成纹理坐标,纹理采样器在根据纹理坐标依次向后采样16个像素,这里所采样出来的64个byte值(一个像素有rgba4个byte)是还未进行解码的64个0-255的整型数据。然后再进行4个整型数组装成一个浮点数的方式解码成16个浮点数,解码后的16个浮点数就是对应骨骼的骨骼数据。

采用本发明方法能够解决大量骨骼的骨骼动画运行在gpu上,实现骨骼动画兼容性处理。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1