【OpenGL_05】Assimp、网格、模型
在LearnOpenGL网站学习,记录一下学习笔记
Assimp
利用Assimp库导入的模型库,结构目录如下:
1.首先有将所有的数据读取存储到Scene
2.每个node节点都会对应一个mesh,mesh的索引存储在node中
3.每个material的索引都会存储在mesh当中
4.每个mesh都会有绘图所使用的绘图顺序,这个顺序存储在face中
Mesh
Mesh类,的主要作用是将读取到Mesh的数据进行分类。
功能设计
在构造器中,我们将所有必须的数据赋予了网格,
我们在setupMesh函数中初始化缓冲,
并最终使用Draw函数来绘制网格。注意我们将一个着色器传入了Draw函数中,将着色器传入网格类中可以让我们在绘制之前设置一些uniform(像是链接采样器到纹理单元)。
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();
};
结构体的另外一个很好的用途是它的预处理指令offsetof(s, m),它的第一个参数是一个结构体,第二个参数是这个结构体中变量的名字。这个宏会返回那个变量距结构体头部的字节偏移量(Byte Offset)。这正好可以用在定义glVertexAttribPointer函数中的偏移参数:
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, Normal))
Model
Model类使用来加载模型数据到Mesh当中,导入到Mesh,分别导入vertices、indices、textures。
功能设计
构造器需要我们给它一个文件路径。在构造器中,它会直接通过loadModel来加载文件。私有函数将会处理Assimp导入过程中的一部分,我们很快就会介绍它们。我们还将储存文件路径的目录,在之后加载纹理的时候还会用到它。
class Model
{
public:
/* 函数 */
Model(char *path)
{
loadModel(path);
}
void Draw(Shader shader);
private:
/* 模型数据 */
vector<Mesh> meshes;
string directory;
/* 函数 */
void loadModel(string path);
void processNode(aiNode *node, const aiScene *scene);
Mesh processMesh(aiMesh *mesh, const aiScene *scene);
vector<Texture> loadMaterialTextures(aiMaterial *mat, aiTextureType type,
string typeName);
};

浙公网安备 33010602011771号