一般自己写一些D3D的程序时比较头疼的就是缺少资源,毕竟不是学习如何使用3Dmax不是一天两天的事,而且使用Max制作的模型还不能直接使用,除非你能解析.max文件,或者给Max写导出插件,这又是另一码事了。然而互联网上免费的FBX模型很多而且有些都是真实游戏导出的模型,这给我们在资源的提供上帮了大忙。由于资源的缺少这些日子写了一个FBX的解析器,用来丰富自己程序的场景。再开发过程中我也参阅了很多网上写过FBX解析器的文章,这些文章让我再开发的过程中少走了不少弯路,但是这些文章基本上都是讲述FBX的文件结构和如何读取,然而从FBX读取出来的数据和真正要使用D3D渲染的数据还是有差距的,今天我就结合游戏开发(D3D)分享一下开发FBX经历。
在开始之前首先要说明一点,这次做的FBX解析器并不通用,它非常针对地面向游戏开发,原因会再后面一点点说明。下面开始正文。
一. FBX SDK:
1. 使用SDK:
由于FBX的文件格式是非公开的,所以要读取FBX文件必须使用FBX SDK才可以。说到这里插一句,网上可以搜到很多关于FBX文件格式的文章,在知道格式的情况下可以不使用SDK自己去解析,但是这有一个问题,由于FBX的格式是非公开的,所以Autodesk不会保证FBX的文件格式是固定的,它很可能会跟随3DMax导出器的版本变化而变化(据我所知确实有很多版本的FBX文件)。这就好像Windows API一样,虽然接口没有变化但是里面的实现是完全不一样,要想自己去兼容各个版本实在太困难了,还不如使用FBX SDK。
2. SDK版本:
我使用的FBX SDK的版本是2016.1.2,在Autodesk的官网上免费下载。这个版本支持VS2015。
3. SDK的使用:
SDK提供了dll和lib两种加载模式,支持x86/x64/Windows Store。SDK有文档,但是这文档写的跟没有也差不多,基本就是程序里面的注释。幸亏它还有比较丰富的例子,否则使用基本靠猜了。
二. 基本概念:
1. 顶点:
(1)首先从游戏开发方面来说,用过D3D/OGL渲染的都知道Draw需要的最基本资源就是顶点,最终使用它的是Vertex Shader,不管你在创建顶点缓冲的时候采取单流多属性还是多流单属性,所有属性的个数必须一致,也就是有多少个Position就得有多少个UV(Normal/Tangent/Binormal…),顶点属性的个数不一致是无法渲染的。
(2)然后再看FBX。FBX的顶点概念和游戏开发中的概念有区别,它的顶点各属性的数量是不一致的(这点继承自Max),顶点的每个属性有可能都有自己的索引,这样它就能保证数据不会