本文内容主要参照 https://learnopengl.com/ 和 https://learnopengl-cn.github.io/ 学习而来。
使用Assimp,我们可以加载不同的模型到程序中,但我们要保存所有数据,需要一个合理的数据结构。本文介绍如此一个类,网格类,保存单个的可绘制实体的必要数据。而整个模型由多个网格组成,或者说网格向量组成我们需要显示的模型。
首先我们来回顾一下我们目前学到的知识,想想一个网格最少需要什么数据。一个网格需要一系列的顶点,每个顶点包含一个位置向量、一个法向量和一个纹理坐标向量。一个网格还应该包含用于索引绘制的索引,以及纹理形式的材质数据(漫反射/镜面光贴图)。
既然我们有了一个网格类的最低需求,我们可以在OpenGL中定义一个顶点了:
struct Vertex {
glm::vec3 Position;
glm::vec3 Normal;
glm::vec2 TexCoords;
};
我们将所有需要的向量储存到一个叫做Vertex的结构体中,我们可以用它来索引每个顶点属性。
除了Vertex结构体之外,我们还需要将纹理数据整理到一个Texture结构体中。
struct Texture {
unsigned int id;
string type;
};
我们储存了纹理的id以及它的类型,比如是漫反射贴图或者是镜面光贴图。
知道了顶点和纹理的实现,我们可以开始定义网格类的结构了:
class Mesh {
public:
/* 网格数据 */
vector<Vertex> vertices;
vector<unsigned int> indices;
vector<Texture> textures;
/* 函数 */
Mesh(vector<Vertex> vertices, vector<unsigned int> indices, vector<Texture> textures);
void Draw(Shader shader);
private:
/* 渲染数据 */
unsigned int VAO, VBO, EBO;
/* 函数 */
void setupMesh(