魔兽世界模型文件.m2 在D3D下的渲染

 

魔兽世界模型文件.m2 D3D下的渲染

 

魔兽世界模型文件众多,是我们用来测试程序的很好的资源。本文通过笔者的实践,分别用GPUCPU两种方法实现m2文件的渲染。

M2文件的解析由国外一个社区完成,藉由此社区的帮助,诞生了像MyWarCraftStudiowowmapviewwowmodelview这些读取并显示魔兽世界模型文件的程序,其中后两者的源代码可以下载到,但他们使用GL实现,参考这两款软件的源码,笔者实现了在D3D下的渲染。

首先,大略介绍一下m2文件的格式。M2文件存储了常规的顶点数据,纹理、法线数据,骨骼动画数据。当然还有许多其他数据,重点说的是它的骨骼数据,它不像.x那样通常存储的是每个关键点的骨骼变换矩阵,而是缩放、平移、旋转因子,在每帧动画中都根据时间计算出平移向量,旋转向量,缩放向量,根据这些向量来计算骨骼的变换矩阵,最后用这个矩阵变换顶点坐标。所以,在时间上m2文件比常规存储的.x文件更耗费时间,因为变换矩阵是通过实时计算得到的,而在空间上m2文件甚为小巧,400K就能包含几十个动画。

其次,对于骨骼动画的渲染,dx sdk中介绍了一种基于骨骼调色板的混合技术,使用了shader实现。原理是:模型的某一顶点,可能受到几个骨骼的共同作用,每个骨骼的作用程度表示为一个权重,所有权重相加为1.所有骨骼的变换矩阵存储为一个矩阵数组(MatrixPalette),由cpu传给shader。具体如何确定骨骼变换矩阵,由顶点数据的一个DWORD确定。具体来说,m2文件的每个顶点最多由4个骨骼共同决定,那么每个骨骼的变换矩阵,都可以在MatrixPalette中找到,利用索引就可以了,该索引值占用一个字节,最大寻址128个骨骼矩阵,所以这种方法要求骨骼数不超过128个。DWORD4个字节,而那4个骨骼矩阵的索引刚好从低位到高位合成了一个DWORD,所以在VS中可以把DWORD转换为int4类型,其分量x/y/z/w刚好就是那4个索引值。

如果模型文件的骨骼数超过128,就使用CPU计算。该段代码可以参照wowmapviewwowmodelviewModel::animate(int panim)方法。

最后,要注意GLDX使用的矩阵和向量不同(当然还有左右手坐标系的不同)。GL使用的是列向量,DX使用的是行向量,GLDX的矩阵互为逆矩阵。所以在看wowmapviewwowmodelview源码的时候一定要注意。

由于还有别的事情,像粒子系统、character以后再说,演示程序默认使用shader渲染,当骨骼数大于128或显卡不支持shader的话使用CPU计算。

窗口使用wxWidgets制作,非常喜欢wx,可用的人不多。

欢迎游戏公司联系笔者itlmy@163.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值