【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);
};
posted @ 2021-03-29 23:51  czya  阅读(316)  评论(0)    收藏  举报