巧用带有骨骼动画的四种蒙皮技术

来源:互联网 发布:最全的电影数据库 编辑:程序博客网 时间:2024/04/28 13:32

   深入研究d3dx(14)——带有骨骼动画的四种蒙皮技术

                                                                                                         Darren
//基于shader的蒙皮和基于软件的蒙皮技术
预备知识
(1)模型的骨骼:骨骼动画中的就是一些矩阵数据,这些矩阵保存的是各个相关顶点的信息,不同的顶点对应不同的矩阵就得到了骨骼,比如一个立方体的顶部4个顶点的变化我们将其绑定骨骼是一组矩阵A,底部的四个顶点同理可以得到矩阵B,这两个矩阵保存的数据完全不同,于是产生了不同的骨骼定义。
(2)蒙皮的实质:蒙皮的实质就是按照骨骼矩阵数据信息将模型的每个顶点建立一块块面,从而实现网格的效果Mesh。
(3)操作流程的位置:本次操作流程位置在贴图之前。试想如果没有网格,那么贴图将无从按照指定的模型贴上。注:一般的游戏引擎里面都会有一些对于模型进行预处理的工序,比如,假如没有骨骼的矩阵数据,那么引擎会直接对所有的顶点按照相邻3个顶点为一个平面为原则,把这个模型蒙皮。
四种种蒙皮的原理
一 固定函数非索引蒙皮渲染Rendering with Fixed-Function Non-Indexed Skinning
1 原理
这个是直接取得骨骼动画的所有矩阵,在这个流程当中,每个骨骼在下一帧变化之前的状态都会得到渲染
具体就是调用ID3DXSkinInfo::ConvertToBlendedMesh
在每一次渲染过程中就是在不断调用IDirect3DDevice9::DrawIndexedPrimitive.
这个函数实时将默认的材质按照定点和骨骼信息蒙皮得到一个三维模型。
骨骼的绑定信息在d3dx9里面有这样一个结构体描述
typedef struct D3DXBONECOMBINATION {
    DWORD AttribId;//属性标签(可以理解为校验者的一个校验标签)
    DWORD FaceStart;//面向方向(这是向量由不同的顶点确定的法向量得出)
    DWORD FaceCount;//向量数
    DWORD VertexStart;//起始顶点(&就是定位向量的顶点)
    DWORD VertexCount;//顶点数目
    DWORD * BoneId;//已绑定骨骼的索引
} D3DXBONECOMBINATION, *LPD3DXBONECOMBINATION;
然后调用IDirect3DDevice9::SetTransform进行骨骼的变化,其实这个函数包含两个参数,第一个是state是表示骨骼矩阵数据的可修改状态,另一个是matrix就是骨骼矩阵本身,就是修改后的骨骼矩阵数据。

2这种方法的优缺点:优点是比较精确,并且实时反映变换,缺点是无法进行着色,不能利用pattle.,占用内存比较厉害。
3 它的使用范围:在贴图之前要求保持原始贴图状态而不变化贴图的材质。


二 固定函数索引蒙皮渲染Rendering with Fixed-Function Indexed Skinning
1 原理:这种方式和上一种方式比较相似,最大的差别就是引入了调色板palette。而且引入的调色版是静态的,就是事先现将一组palette矩阵分配到内存当中。然后调用
ID3DXSkinInfo::ConvertToIndexedBlendedMesh函数进行蒙皮,此函数调用过后不止会将蒙皮进行,而且可以对于蒙皮过程的每一个小平面保留一个索引,这个索引和调色板的索引一一对应。同上面的原理,他也是在第二次更新矩阵信息之前进行更新。
2 优缺点:优点是可以动态调节可变化的模型材质颜色,缺点,由于得给调色板单独开一个buffer造成的内存浪费比较严重,在内存紧张时候无法支持大的调色板。
3 适用范围:给定的调色板并且让其进行着色,或者实时转换模型的材质颜色等。

三 基于shader的蒙皮渲染Rendering with Shader-Based Skinning
1 原理:渲染管线是在模型的三维空间外部的一种映射表现。可以这样理解,三维模型将映像投射到渲染管线当中(其实程序中实现是先把三维空间的模型的顶点数据信息装进管线的内存当中,可见的图案就是渲染管线经过计算之后的效果)。此一级操作是建立在空间蒙皮之前的。就是将模型的骨骼矩阵完全保存在渲染管线shader当中。表现为矩阵matrix的四个参数中有前三个参数全部变成了shader对象的成员,然后就执行上面第二种渲染方法,同样是调用
ID3DXSkinInfo::ConvertToIndexedBlendedMesh函数,只不过这一次,每一个小面的索引对应的不是存储在内存中的调色板数据的索引,而是经过shader处理后的调色板索引,这个调色板的存储地址是在shader中的,所以相对比较节省内存。
由于骨骼的矩阵matrix的前三个参数都是shader对象的成员,那么最后一个参数一般就是
(0,0,0,1);用不着特意去设定。
  值得强调的是在程序运行的最前端,启动shader程序处理的函数可以是
调用的是IDirect3DDevice9::SetVertexShaderConstantF
或者ID3DXBaseEffect::SetMatrixArray。这两种都可以实现不同模式的shader管线渲染。


2 优缺点:优点是内存占用小,灵活性超强,缺点是对于机器以及操作系统的配置要求非常高,否则无法满足游戏的需求,但是在目前的pc机显卡几乎都支持了shader2.0的基础上,几乎没什么影响。
3 适用范围:几乎适用于各种情况的开发,尤其是强调画面的特效和灵活的动效的程序上。

四 软件默认蒙皮渲染Rendering with Software Skinning
1 原理:关于这个其实没有什么可以特殊说明的,因为这就是我在第一种方案中提到的一般有引擎处理没有绑定骨骼的动画的方式,就是按照其模型的所有顶点进行直接蒙皮,与第一种方案的区别是调用ID3DXSkinInfo::UpdateSkinnedMesh函数,进行渲染的同时自动读取pc的现有调色板进行着色,这样就可以根据材质信息直接按照pc自带的调色板进行着色。

2 优缺点:优点是适应性强,内存消耗少。缺点是:专业性差,不能够实时反映程序编码者的要求。
3 适用范围:跨平台的游戏,可移植性,可通用性比较强的渲染程序。
关于四种骨骼渲染方法就介绍到这里,具体参见DrectX sdk2007的以下demo可以看出各种方法的不同渲染效果。

Pic,MutiAnimation, PostProcess.exe, MeshFromOBJ.exe  DepthOfField.exe