Learn OpenGL:模型加载

Assimp

  • Scene对象保存所有场景模型数据,其中有根节点(树形结构)
  • Scene下的mMeshes数组储存了真正的Mesh对象,节点中的mMeshes数组保存的只是场景中Mesh数组的索引
  • Mesh对象本身包含了渲染所需要的所有相关数据:顶点位置、法向量、纹理坐标、面(Face)和物体的材质(Material)
  • Face对象包含了顶点的索引,IBO
  • Material对象可以获取物体的材质属性,主要是材质类型和路径

网格

Mesh类包含顶点数组、顶点索引数组、贴图数组。构造时生成VAO、VBO、IBO。Mesh类还有使用指定的Shader的绘制方法。在绘制方法中,首先遍历贴图数组,逐个激活纹理单元并绑定贴图,最后使用索引进行绘制

模型

  1. Model类包含网格数组和模型所在文件夹路径。构造时载入模型。其核心是通过Assimp::Importer类的ReadFile方法获得指向Scene的常指针

  2. 使用前序遍历,从根节点开始处理每个节点的Mesh。注意节点保存的是索引,获取节点的Mesh应该是scene->mMeshes[node->mMeshes[i]]

  3. 解析Mesh对象里的顶点属性、顶点索引和材质。注意Mesh里保存的也是索引,获取Material对象应该是scene->mMaterials[mesh->mMaterialIndex]

  4. Material对象中含有多种贴图以及对应路径,这里的贴图路径都已经改为了相对于模型的,加载时路径为模型文件夹路径\贴图路径。为了提高加载速度,使用缓存保存加载过的贴图,通过比较路径即可知道是不是同一个贴图。