【Visual C++】游戏开发五十一 浅墨DirectX教程十九 网格模型进阶之路
本系列文章由zhmxy555(毛星云)编写,转载请注明出处。
文章链接: http://blog.csdn.net/zhmxy555/article/details/8770426
作者:毛星云(浅墨) 邮箱: happylifemxy@163.com
最近几个星期,不停地收到大家的评论和邮件,大家都说希望浅墨早点讲骨骼动画。本来按浅墨拟定的写作计划是把骨骼动画放到很后面,因为骨骼动画知识需要前面的网格模型知识为基础,知识量本身有些大,很可能要占很多次更新的篇幅。
但是看到大家一致的评论,都说非常期待骨骼动画。那就好吧,我们就来开始慢慢讲。一路披荆斩棘,把网格模型相关知识讲完,然后消灭掉骨骼动画这个看似很难的大块头。
其实骨骼动画学起来并不难,而且掌握了非常好玩。一般的三维游戏中都要用到骨骼动画,没用到骨骼动画的三维游戏基本上都是那种什么小飞机啊,空战之类的小儿科游戏,弱爆了。
骨骼动画的前置知识是网格模型(把“前置”这两个字在word中打出来的时候怎么让我想起了DNF(毒奶粉)里面学技能时的“前置技能”- -)。而网格模型其实是Direct3D中非常重头的一部分内容,但是纵观已经与大家见面的十八篇Direct3D教程以来,只有《
一、网格模型的优化文章开头就提到过了,我们之前讲过一次网格模型,大家如果不熟练,请移步到《
网格优化标识
精析
D3DXMESHOPT_COMPACT
从网格中移除没用的顶点和索引项。
D3DXMESHOPT_ATTRSORT
根据属性给三角形排序并调整属性表,这将使DrawSubset方法的绘制执行更有效率。
D3DXMESHOPT_VERTEXCACHE
增加顶点缓存的命中率
D3DXMESHOPT_STRIPREORDER
重组顶点索引,让三角带尽可能的长。
D3DXMESHOPT_IGNOREVERTS
只优化索引信息,忽略掉顶点信息。
另外需要注意的是:D3DXMESHOPT_VERTEXCACHE和D3DXMESHOPT_STRIPREORDER这两者的领域重合了,不能同时使用。
■第二个参数,const DWORD类型的*pAdjacencyIn ,指向优化前的邻接数组的指针,一般我们这样填(DWORD*)pAdjacencyBuffer->GetBufferPointer(),其中的pAdjacencyBuffer我们在D3DXLoadMeshFromX中给它附上了被载入网格的邻接信息,然后GetBufferPointer一下就是指向待优化的邻接数组的指针了。
■第三个参数,DWORD类型的*pAdjacencyOut,指向优化后的邻接数组的指针。如果不需要优化后的邻接信息,设为NULL就好了。
■第四个参数,DWORD类型的*pFaceRemap,用来填充面重影射信息。该数组必须不小于ID3DXMesh::GetNumFaces()。当一个mesh被优化时,由索引缓存定义的面可能被移动;也就是说,在pFaceRemap中的第i项表示第i个原始面被移动后的新索引值。我们一般很少用,取0或者NULL就行了。
■第五个参数,LPD3DXBUFFER类型的*ppVertexRemap,用于保存网格顶点的重映射信息,一般设为0或者NULL就可以了。
讲起来好像每个参数都很复杂,其实用起来蛮简单的,因为不少参数设为0或者NULL就行了,就像这样:
克隆网格标识
精析
D3DXMESH_32BIT
克隆的网格使用32位索引
D3DXMESH_MANAGED
克隆出的网格的数据的索引缓存用D3DPOOL_MANAGED标识
D3DXMESH_WRITEONLY
克隆出的网格数据只能执行写操作,不能执行读操作
D3DXMESH_DYNAMIC
克隆出的网格缓存为动态的
■第二个参数,DWORD类型的FVF,很好理解,就是为克隆出的新网格指定FVF灵活顶点格式,这就说明了克隆出的新网格是完全可以和原网格有不同的FVF灵活顶点格式的。
■第三个参数,LPDIRECT3DDEVICE9类型的pDevice,老朋友了,我们的金钥匙Direct3D设备指针。
■第四个参数,LPD3DXMESH类型的*ppCloneMesh,指向克隆出的网格模型的指针。我们事先新建一个网格模型指针,然后调用CloneMeshFVF函数的时候填在这里,调用完之后,这个指针就指向新克隆好的网格模型了。
如果大家看起来不太懂,没关系,我们来看一个调用实例:
我们依旧只贴出核心代码main.cpp,其他的众多文件大家下源代码回去看就好了。
然后三张模型的正面图:
然后三张侧面图:
再来一张纵览:
特写镜头一张:划破天际的锋利刀刃
文章最后,依旧是放出本篇文章配套源代码的下载:
本节笔记配套源代码请点击这里下载:
【浅墨DirectX提高班】配套源代码之十九下载
以上就是本节笔记的全部内容,更多精彩内容,且听下回分解。
浅墨在这里,希望喜欢游戏开发系列文章的朋友们能留下你们的评论,每次浅墨登陆博客看到大家的留言的时候都会非常开心,感觉自己正在传递一种信仰,一种精神。
文章最后,依然是【每文一语】栏目,今天的句子是:
成功的人都是从逆境中坚持下来的,我们应感谢生命赐予的不幸和挫折,让我们证明我们的坚强和勇敢。
下周一,让我们离游戏开发的梦想更近一步。
下周一,游戏开发笔记,我们,不见不散。
- 16楼weijihai5206小时前
- 上一期的示例程序还能在我电脑上运行,这次的就运行不了了,—3D的DLL错误,最新版的DirectX 9.0c runtime具体是怎样的也不清楚,安装了一个dxwebsetup.exe,大小285KB。
- Re: zhmxy5554小时前
- 回复weijihai520nDirectX 9.0c runtime帮你搜了一个,去下载安装就好了http://www.7xiazai.com/soft/html/6.html
- 15楼Luke_zhuhuanjun6小时前
- 浅墨,前辈,我来了。每次我都好期待啊,因为我又能学到新的知识了!
- Re: zhmxy5556小时前
- 回复Luke_zhuhuanjunn:)
- 14楼pinbo2010cp昨天 23:32
- 浅墨大哥,从你的第一篇教程文章到这,一路走来,真的很感谢你,让我的3d游戏梦更近了一点。对了,我想问一下,教程中的那些模型是从哪里弄来的啊?还有如何提取游戏中的3d模型?继续支持浅墨大哥!!
- Re: zhmxy5557小时前
- 回复pinbo2010cpn国内外的3D模型论坛,比如http://www.cgmodel.cn/
- 13楼weijihai520昨天 23:11
- [quote=weijihai520]上一期的示例程序还能在我电脑上运行,这次的就运行不了了,—3D的DLL错误,最新版的DirectX...[/quote]n还是不行哦 。
- 12楼yiyu89昨天 17:57
- 学习了。浅墨能否推荐点其他的学习资料,龙书过于单薄啊
- Re: zhmxy555昨天 18:33
- 回复yiyu89n哦,差点忘记了,龙书第二版《Introduction to 3D Game Programming with DirectX90c A Shader Approach 》
- Re: yiyu89昨天 20:35
- 回复zhmxy555n感谢浅墨。
- Re: zhmxy555昨天 20:36
- 回复yiyu89n直接看DirectX的SDK文档和Samples吧,市面上所有的教程的第一手知识来源。然后几本书《3D游戏编程大师技巧》、《DirectX游戏开发终极指南》《Real-Time RenderingReal-Time Rendering》等等
- 11楼L6jun昨天 15:29
- 终于看见动画的影子了,谢谢大哥,我还想请教,你前面说的“体积绑定”牵涉到哪些方面的知识呢?我先预习下。
- Re: zhmxy555昨天 16:53
- 回复L6junn也就是“外接体”,涉及到D3DXComputeBoundingSphere和D3DXComputeBoundingBox这两个方法。
- Re: L6jun昨天 16:57
- 回复zhmxy555n受教了
- 10楼m7606861昨天 14:56
- 嘿嘿,虽然我还没有看到这,先MARK一下,希望浅墨老师把游戏编程精粹发到我邮箱,3768871914@qq.com,谢谢哦
- Re: zhmxy555昨天 15:14
- 回复m7606861n已发送,请查收
- Re: m7606861昨天 15:21
- 回复zhmxy555已接收,谢谢
- 9楼tmelodykd昨天 14:52
- 这些天抓紧时间看了下浅墨老师推荐的那本[DIRECTX.9.0.3D游戏开发编程基础],觉得基本上没学到啥东西,就是印象更深刻了,有些东西也更理解了...只是,有木有高级点的书籍呢,求推荐...
- Re: zhmxy555昨天 14:53
- 回复tmelodykdn这可是久负盛名的D3D龙书啊- -n好吧,再推荐几本,《DirectX角色扮演游戏编程》《DirectX高级动画制作》《3D游戏编程大师技巧》《DirectX终极游戏开发指南》,回去看吧
- 8楼gj542424098昨天 14:50
- 谢谢 浅墨~
- Re: zhmxy555昨天 14:50
- 回复gj542424098n客气客气~~
- 7楼zhmxy555昨天 14:49
- 下载地址已经放出,CSDN资源频道有时候真蛋疼,上传了的资源几个小时都不显示。估计文章的3个踩就是这样来的,看到“资源上传中,稍后放出”字样就怒踩一记,有点厉害啊。。。。。0~7楼稍后回复你们啊,我再睡会儿- -
- 6楼pirate1986昨天 14:36
- 请大神也发我一份吧,邮箱pirate1986@126.com
- 5楼kkbws昨天 14:34
- 感谢楼主
- 4楼qq45000昨天 13:08
- mark一下表示看完并实践了一下,但感觉优化之后帧率没提上来啊。。。
- Re: zhmxy555昨天 13:20
- 回复qq45000n也许你的模型本来就做过优化了,所以再次优化看不到效果,其实粒子系统才是帧数杀手
- Re: qq45000昨天 14:25
- 回复zhmxy555n那确实,我这显卡跑50000粒子就只有五六帧了。。。
- 3楼qianlima77昨天 11:14
- 竟然把我的沙发给抢了,我恨一楼。感谢浅墨的无私奉献,持续强烈关注中。
- Re: zhmxy555昨天 12:23
- 回复qianlima77n:)。一楼早上5点多钟就来了,那时候文章刚发出来不久
- 2楼u010214000昨天 08:16
- 好厉害呀~
- Re: zhmxy555昨天 09:03
- 回复u010214000n:)
- 1楼GRAY_XIAOXIAO昨天 05:28
- 标记学习中......最近没怎么敲程序 过几天会好好坚持的!
- Re: zhmxy555昨天 08:12
- 回复GRAY_XIAOXIAOn学技术就是要勤动手,加油~