1、前言
D3D12系列教程因为我转移精力学习Nodejs、VueJs等技能,暂时中断了一段时间,着实感觉有点对不起大家,这期间也有很多网友都在询问RTX系列教程还出不出,在这里一并向大家回复,这个系列将一直不间断,但不定期的更新下去,哪怕MS出到D3D13、D3D14…,只是时间问题请大家能够理解并谅解,毕竟人的精力是有限的,正如金大侠所言:人力有时而穷!
在之前的系列基础教程中,为了教程的简洁和直接性,忽略了很多东西,甚至可以说只是跟大家介绍了如何调用D3D12的相关接口而已,但仅仅掌握这些是远远不够的。或者说掌握D3D12接口的使用方法,仅仅是本系列教程的目的之一。再学习的过程中,其实我们也涉足到了显卡体系结构,多线程渲染,多显卡渲染,Ray Tracing等丰富的内容。当然继续深入下去,就必须要进入光照、阴影、后处理、延迟渲染、3D动画、地形等等高级话题。当然这些话题教程中还没怎么涉足到,一方面是我也需要继续深入的学习,因为会用和能写出教程之间还是有不小的差距,尤其是还需要考虑到要教程的主题要集中和简单,这就需要大量的时间;另一方面,主要是因为这些话题其实都涉及一个不可逾越的障碍,那就是没有什么像样的模型可以免费试用,也没有介绍方便的导入方法;次一方面,我也在考虑制作新的视频教程,并且我采取的路线是自己假设视频教学直播网站,因此也需要大量的学习;除此考虑到我还要上班工作养家糊口,这些都需要耗费大量的时间和精力,所以后续的教程就耽搁了。
正所谓“巧妇难为无米之炊”,其实很多时候,我想大家学习3D编程的目的无非就是想开发游戏,几乎每一个找我的网友无不对开发游戏有着强烈的兴趣,但是如果没有合适的3D模型,只是天天鼓捣那些方块、球体、平板之类的,时间长了,就很可能进入学习的瓶颈。并且这样下去也会让大家很有挫败感,所以抽空我就赶紧找了些资料,最早我想用DX9X中的Mesh导入加载的一系列接口,但是发现其实这个技术已经没什么价值了,即使搞通了也只是说可以方便的加载那些x文件而已,而且还要让DX12和DX9协同工作,貌似MS都放弃这样做了,曾经MS确实让DX9和DX11很好的合作了一段时间,但现在这已经很不合时宜了,因为X文件自身的限制,很多高级特性实质上再用X格式文件已经很难达到效果了。接着我又看了看FBX的导入插件,虽然功能强大,但是它实在是太复杂了,其内容够写一系列单独的教程了。最后我将目光聚焦在了Assimp这个库上。
当然无论使用哪个库,这里都建议大家尽量用库导入所需要的3D模型,而不是自己写代码去解析原始模型文件,我有个搭档正在这样做,我一度劝诫他不要再这样搞下去了,而实际上他在自解析文件格式的道路上狂奔了竟然有一两年之久了,而进展只是可怜的仅能导入简单的圆锥、方块、球体等等,对于复杂的3D动画部分基本上已经没有精力再搞下去了,实质上这样即浪费时间,也完全没有必要,因为学习3D的重点还是应该放在Shader的学习和灵活运用上,也就是渲染的方法才是重点学习的目标。
之所以选择Assimp作为此系列教程的3D模型导入库,一方面基于Assimp的简单易用性,并且它天然支持除了试验性质的X文件外,还支持FBX等很多3D模型的格式,而且它也支持动画数据的解析和导入,同时它还支持很多关于模型的预处理,并且它还是开源的。另一方面,无论什么第三方库,很多网友学习的第一个疑问就是:这个是不是最好的?学了之后万一不流行了是不是浪费了学习的时间?其它的更好的或更流行的又是什么?…其实这些疑问与困惑也是我一开始学习时的一个严重认识误区,记得尼采曾经说过:在你的脚下深挖下去,自会有泉水涌出!也就是说不管这个库怎么样,需要先深入的学习下去,之后融会贯通,学习其它的库也就不难了,当然这个过程中除了要掌握细节的比如API调用,还需要整体上有抽象的认识,尤其是对整体的功能框架要有认识,这样学其他的库,按功能逐个去掌握,学习的速度就会越来越快。这也是我自己学习方法的一个总结,比如曾经我就很深入的学习了OLEDB库,虽然这个库现在看来已经非常非常的古老的,甚至可以说已经淘汰了,但是因为当时的深入学习、灵活掌握和深度运用,现在我在学习掌握JavaScript的数据库编程接口时,可以说那感觉就像是开了挂一样的丝滑顺畅!
在这里还要提一下,我的文章这样的前言交代非常的多,扯得也有点远,真实的目的就是让大家在学习的过程中,除了核心内容的学习之外,同时还能够不断的在思想上方法上也有所提升,也就是常说的学习的过程中还需要不断的“体道悟道”才是学习的正道。当然这也为一位不知名的“国际雷锋”同志的翻译工作带来了额外的麻烦,他不辞辛劳的将我的文章逐字逐句的翻译为了英文(其中一篇,其它的在页面找,需要翻墙):DirectX12 (D3D12) basic tutorial (4) – first know DirectXMath library, use constant heap to create constant buffer, understand pipeline state object, understand fence synchronization – Programmer Sought
在这里向这位“国际雷锋”同志表示由衷的感谢!
OK,我们言归正传开始学习Assimp库!
2、Assimp库简介
Open Asset Import Library,也称 Assimp,是一个可以处理许多 3D 格式的开源库,包括最受欢迎的二进制反码格式。它是跨平台的,可用于 Linux 和 Windows,非常容易使用和嵌入到 C/C++ 程序中。
在它的官方文档中声称它支持下列3D模型文件的导入:
- 3D 、3DS、3MF、AC、AC3D、ACC、AMJ、ASE、ASK、B3D、BLEND、BVH、CMS、COB、DAE/Collada、DXF、ENFF、FBX、glTF 1.0 + GLB、glTF 2.0、HMB、IFC-STEP、IRR / IRRMESH、LWO、LWS、LXO、MD2、MD3、MD5、MDC、MDL、MESH / MESH.XML、MOT、MS3D、NDO、NFF、OBJ、OFF、OGEX、PLY、PMX、PRJ、Q3O、Q3S、RAW、SCN、SIB、SMD、STP、STL、TER、UC、VTA、X、X3D、XGL、ZGL
从这个长长的可导入文件类型的列表也可以直观的感受到Assimp库的强大。同时它也支持3D模型数据的导出,至于导出之后看有必要再向大家介绍。
Assimp官方地址在:Home (assimp.org)
看到这里大家可能会有个疑问:这个导入库到底是干嘛的?或者说“导入3D模型”本身是什么意思?其实这主要是因为3D模型数据本身的复杂性,多样性,导致我们通过简单的编码方式是没法生成复杂的3D模型的,如果再考虑到比如骨骼动画,复杂贴图等的支持,这已经不是简单的代码可以做到的了,因此大多数3D模型都是靠专用的工具由美工、动画师、视觉效果师等建模创作完成的,并且这些工具还会将这些创作的结果导出为各种自有格式的文件,然后再交由程序员加载、解算、转换后才能用于渲染。而导入库,就是将这些自有的特定格式的3D模型文件,通过读取解析文件的方式,按程序可以直接处理的数据形式或中间形式加载进内存的程序库。本文介绍的Assimp库就是将之前列举的各种3D模型文件内容统一加载为程序可以处理的数据形式,包括顶点数据、索引数据、材质数据、骨骼数据、动画数据等,还可以导入有些文件中特别指定的光源数据、摄像机数据等。而Assimp加载完这些数据时,都是以Assimp特有的数据结构形式提供的,在渲染之前,就需要我们再用我们自己程序能处理的数据结构形式完成一遍转换。
3、编译Assimp库的准备工作
在具体使用Assimp时,当然可以从Assimp官网直接下载编译好的库来使用,但开源库的特征就是最新版往往需要我们自己根据需要编译的,同时编译时会有很多开关控制一些功能是否进行编译,因此掌握开源库的编译往往是学习开源库的第一个学习目标。
在编译Assimp之前,需要做一些准备工作,首先需要下载安装CMake,下载地址:Download | CMake。安装的过程这里就不再赘述了,有关CMake的详细使用说明也不再详细讲解,CSDN中已经有很多教程示例了,大家自行搜索学习即可。这里只是提醒大家,CMake是现代C/C++程序员必须掌握的硬核技能之一,所以是值得花时间掌握的。
需要注意的是,CMake版本最好是3.4以上的版本,因为太低的版本,与VS2019结合的还不是很好,很多动作需要我们手动来完成。
安装成功后,可以在Windows PowerShell中输入如下命令,来查看是否安装成功:
cmake /V
输出如下:
接着需要下载安装Git客户端工具,下载地址:Git – Downloading Package (git-scm.com)。同样的安装的过程也不再赘述了。与CMake一样,Git也是现代程序员必须掌握的硬核技能之一。
安装完成后,在Windows PowerShell中输入如下命令:
git --version
输出如下:
然后需要我们安装VS2019,推荐安装免费的Community版本,下载地址:Visual Studio 2019 IDE – 适用于 Windows 的编程软件 (microsoft.com)。安装VS2019时一定要注意安装完整的Windows SDK,现在的DirectX SDK已经变成了其中的一部分。在编译Assimp时需要DirectX的SDK,否则编译过程会报错。
4、下载Assimp源码并编译
准备工作做好之后,就是去GitHub上下载源码了,在Windows Powershell中输入如下命令:
git clone https://github.com/assimp/assimp.git
运行如下:
这个过程可能有些漫长,也可以使用Gitee克隆后下载:
git clone https://gitee.com/gamebaby_admin/assimp.git
下载完成后进入Assimp的源码目录:
cd assimp
并使用如下命令查看分支:
git branch -a
结果如下:
切换到的最新的发布分支上:
git checkout remotes/origin/assimp_5.0_release
然后创建一个build目录,并进入:
mkdir build
cd build
创建VS2019工程文件:
cmake ..
直接运行命令行编译:
cmake --build .
当然也可以使用多线程编译命令加快编译速度:
cmake --build . -j12
编译的过程中会有很多警告,暂时不用理会,主要都是64位的数字直接赋值给了32位的变量引起的警告,这个目前无伤大雅。
当然也可以通过VS2019打开解决方案然后再生成:
双击sln文件,用VS2019打开后,在解决方案节点上单击右键,点击生成解决方案即可:
最终生成的文件在如下的目录中:
这些文件未来都需要复制粘贴到我们自己项目的exe文件输出目录中,重点是Assimp的dll库,从中可以看到,现在的库已经带上了编译器版本和库版本号,因为是Debug版所以建议把build\\code\\Debug\\目录下的所有文件都复制到自己项目的exe文件所在目录中。或者在我们自己的项目中添加这些目录为Lib目录。其中的几个exe文件assimp开头的是一个命令行工具和一个模型查看器,unit.exe是一个检测编译结果的命令行工具,可以运行用来检测编译结果的正确性。
最后还需要注意的是,在我们创建的build目录中有个include目录,这个目录也需要添加到我们引用项目的头文件包含目录中去。
当然最后我们默认编译出来的是x64/Debug版本的Assimp库,通过在VS2019中切换为Release即可生成Release版的Assimp库,这里就不在赘述了。
暂无评论内容