现代opengl 设计,模型导入网格类

该文介绍如何使用Assimp库在OpenGL中设计网格类,以存储和渲染3D模型数据。网格类包含顶点结构体,用于存储位置、法向量和纹理坐标,以及纹理数据。文章详细讲解了如何初始化缓冲区,定义顶点属性指针,并通过Draw函数进行渲染,同时处理任意数量的纹理。
摘要由CSDN通过智能技术生成

本文内容主要参照 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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值