此篇博文为个人OpenGL学习笔记,内容参考LearnOpenGL CNGLFW官方文档OpenGL 4 Reference Pages、OpenGL编程指南(原书第9版)

一个非常流行的模型导入库是Assimp,它是Open Asset Import Library的缩写。Assimp能够导入很多种不同的模型文件格式(并也能够导出部分的格式),它会将所有的模型数据加载至Assimp的通用数据结构中。当Assimp加载完模型之后就能够从Assimp的数据结构中提取所需的所有数据。由于Assimp的数据结构保持不变,不论导入的是什么种类的文件格式它都能够从不同的文件格式中抽象出来用同一种方式访问需要的数据。

当使用Assimp导入一个模型的时候它通常会将整个模型加载进一个场景(Scene)对象,它会包含导入的模型/场景中的所有数据。Assimp会将场景载入为一系列的节点(Node),每个节点包含了场景对象中所存储数据的索引,每个节点都可以有任意数量的子节点。

Assimp数据结构的(简化)模型

  • 与材质和网格(Mesh)一样,所有的场景/模型数据都包含在Scene对象中。Scene对象也包含了场景根节点的引用。
  • 场景的Root node(根节点)可能包含子节点(和其它的节点一样),它会有一系列指向场景中mMeshes数组中存储的网格数据的索引。Scene下的mMeshes数组储存了真正的Mesh对象,节点中的mMeshes数组保存的只是场景中网格数组的索引。
  • 一个Mesh对象本身包含了渲染所需要的所有顶点位置、法向量、纹理坐标、面(Face)和物体的材质等相关数据。
  • 一个网格包含了多个面(Face)。Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)。一个面包含了组成图元的顶点的索引。由于顶点和索引是分开的,使用一个索引缓冲来渲染是很简单的。
  • 一个网格也包含了一个Material对象,它包含了一些函数可以获取物体的材质属性,比如颜色和纹理贴图(比如漫反射和镜面光贴图)。

所以需要做的第一件事是将一个物体加载到Scene对象中,遍历节点,获取对应的Mesh对象(递归搜索每个节点的子节点),并处理每个Mesh对象来获取顶点数据、索引以及它的材质属性。最终的结果是一系列的网格数据,会把它们包含在一个Model对象中。

当使用建模工具对物体建模的时候通常不会用单个形状创建出整个模型。通常每个模型都由几个子模型/形状组合而成。组合模型的每个单独的形状就叫做一个网格(Mesh)。比如一个人形角色通常会将头部、四肢、衣服、武器建模为分开的组件,并将这些网格组合而成的结果表现为最终的模型。一个网格是在OpenGL中绘制物体所需的最小单位(顶点数据、索引和材质属性)。一个模型(通常)会包含多个网格。

Last modification:March 22nd, 2020 at 05:53 pm
如果觉得我的文章对你有用,请随意赞赏