Qt+opengl 实现模型加载与渲染

23 篇文章 0 订阅
本文介绍了OpenGL中的着色器原理,包括Blinn-Phong光照模型的构成,高光、漫反射和环境光的计算方法。通过assimp插件处理模型,详细讲解了如何加载、渲染和使用纹理,以及Mesh和Model类的设计。旨在帮助读者理解计算机图形学基础知识。
摘要由CSDN通过智能技术生成

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

相关背景和学习资料
opengl 着色器原理 https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/
qt opengl 学习视频 https://www.bilibili.com/video/BV1wf4y1E7hY?p=2&vd_source=fb27f95f25902a2cc94d4d8e49f5f777
着色器原理 https://www.bilibili.com/video/BV1X7411F744/?p=7&vd_source=fb27f95f25902a2cc94d4d8e49f5f777

物体光照组成

光照模型

在这里插入图片描述
根据blinn-phone 反射模型把光照分成高光部分,漫反射部分和环境光部分
高光部分是有眼睛看向物体表面方向刚好与光反射的方向重合开成的。
漫反射是光打到物体上后向各个方向反射形成的。
环境光部分是物体没有被光照到的部分反射了整个环境光照形成的。

这三个部分可以分别求出,然后相加得到最后的整体效果。

具体表示 可以公式计算得到,也要以由贴图进行渲染。代码实现中是采用后者。

模型组成

assimp插件可以导入模型并将模型分成不同的网格。

每个网格包含以下内容。

点,法向,面,uv坐标等基本几何信息。

高光贴图,漫反射贴图,环境光贴图,凸凹贴图等与渲染相关的信息。

加载与渲染

在这里插入图片描述
把一个模型分不同的mesh部分。
每个部分存储几何信息和渲染信息。
绘制时根据几何信息和渲染信息调用着色器进行渲染。

类设计

代码库:https://gitcode.com/chenbb1989/qt-opengl/tree/master/opengl-functionlearn10model


class Model : public QObject,QOpenGLFunctions
{
    Q_OBJECT
public:
    Model(const QString &path);
    void Draw(QOpenGLShaderProgram &shader);
    ~Model();
private:
    QVector<Texture> textures_loaded;
    QVector<Mesh*> meshes;// 相信网格
    QString directory;
    void loadModel(const QString& path); // 加载整体模型
    void processNode(aiNode *node,const aiScene *scene);
    Mesh* processMesh(aiMesh *mesh, const aiScene *scene); // 存储mesh信息
    QVector<Texture> loadMaterialTextures(aiMaterial *mat, aiTextureType type,
                                                 QString typeName); // 提取贴图信息
};



class Mesh : public QObject, protected QOpenGLFunctions
{
    Q_OBJECT
public:
    QVector<Vertex>       vertices; // 点
    QVector<unsigned int> indices; // 面
    QVector<Texture> textures; // 贴图路径
    QOpenGLVertexArrayObject VAO;
    QOpenGLBuffer EBO;
    QOpenGLTexture *texture0=NULL,  // 漫反射贴图
    *texture1=NULL, // 高光贴图
    *texture2=NULL; // 环境光贴图
public:
    Mesh(QVector<Vertex> vertices,QVector<unsigned int> indices,QVector<Texture> textures);
    Mesh();
    void Draw(QOpenGLShaderProgram &shader);
    ~Mesh();
private:
    QOpenGLBuffer VBO;
private:
    void setupMesh();

};

效果展示

请添加图片描述

在这里插入图片描述


本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值