没什么好说的,干就完了!

glview.h

#pragma once
#include <qopenglwidget.h>
#include <qopenglfunctions_4_5_core.h>
#include <qopenglshaderprogram.h>

#include "model.h"

class GLView : public QOpenGLWidget, QOpenGLFunctions_4_5_Core
{
Q_OBJECT
public:
explicit GLView(QWidget* parent = nullptr);

protected:
virtual void initializeGL();
virtual void resizeGL(int w,int h);
virtual void paintGL();

private:
bool initShader(QOpenGLShaderProgram& shader);

private:
Model* m_model{ nullptr };
QOpenGLShaderProgram m_shader;

signals:

};

glview.cpp

#include "glview.h"
#include <QOpenglshader>

GLView::GLView(QWidget* parent)
{

}

void GLView::initializeGL()
{
initializeOpenGLFunctions();
initShader(m_shader);
m_model = new Model(this);
}

void GLView::resizeGL(int w, int h)
{

}

void GLView::paintGL()
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

m_shader.bind();
m_model->Draw(m_shader);
m_shader.release();
}

bool GLView::initShader(QOpenGLShaderProgram& shader)
{
bool result = false;
result = shader.addShaderFromSourceFile(QOpenGLShader::Vertex, "./shader/1.model_loading.vert");
if (!result)
{
qDebug() << shader.log();
return result;
}

result = shader.addShaderFromSourceFile(QOpenGLShader::Fragment,"./shader/1.model_loading.frag");
if (!result)
{
qDebug() << shader.log();
return result;
}

result = shader.link();
if (!result)
{
qDebug() << shader.log();
return result;
}

return true;
}

model.h

#pragma once
#include <qopenglshaderprogram.h> //shader
#include <qopenglvertexarrayobject.h> //VAO
#include <qopenglbuffer.h>// VBO,EBO
#include <qopenglfunctions_4_5_core.h>//openglFuncs

class Model
{
public:
Model(QOpenGLFunctions_4_5_Core* openglFuncs = nullptr);
~Model();

void Draw(QOpenGLShaderProgram &shader);

private:
//顶点数据(所有值在[-1,1]之间)
float vertices[18] = {
-0.5f,-0.5f,0.0f, 1.0f, 0.0f,0.0f,
0.5f,-0.5f,0.0f, 1.0f, 0.0f,0.0f,
0.0f,0.5f,0.0f, 1.0f, 0.0f,0.0f,
};

unsigned int indices[3] = { 0,1,2 };

private:
QOpenGLFunctions_4_5_Core* m_glfunc{ nullptr };
QOpenGLBuffer m_vbo,m_ebo;
QOpenGLVertexArrayObject m_vao;
};

model.cpp

#include "model.h"
#define USE_VBO 0

Model::Model(QOpenGLFunctions_4_5_Core* openglFuncs) :
m_glfunc(openglFuncs),
m_vbo(QOpenGLBuffer::VertexBuffer),
m_ebo(QOpenGLBuffer::IndexBuffer)
{
// 初始化m_vbo为顶点缓冲(VertexBuffer)
//m_vbo = QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);

// 初始化m_ebo为索引缓冲(IndexBuffer)
//m_ebo = QOpenGLBuffer(QOpenGLBuffer::IndexBuffer);
}

Model::~Model()
{
m_vao.destroy();
m_vbo.destroy();
m_ebo.destroy();
}

void Model::Draw(QOpenGLShaderProgram& shader)
{
if (!m_vao.isCreated())
m_vao.create();//对于没有创建的vao创建一个新vao对象
else
m_vao.release();//对于已经存在的vao解绑
QOpenGLVertexArrayObject::Binder vaoBinder(&m_vao);

if (!m_vbo.isCreated())
m_vbo.create();
else
m_vbo.release();

if (!m_ebo.isCreated())
m_ebo.create();
else
m_ebo.release();

m_vbo.bind();
m_vbo.allocate(vertices, sizeof(vertices));//相当于glbufferdata,将cpu中的数据交给gpu,顶点着色器中的apos变量从gpu中获取到这个顶点数据

m_ebo.bind();
m_ebo.allocate(indices, sizeof(indices));

//设置顶点描述
m_glfunc->glEnableVertexAttribArray(0);//与着色器中的Location相对应
m_glfunc->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);

//设置顶点颜色描述
m_glfunc->glEnableVertexAttribArray(1);
m_glfunc->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));

//设置着色器全局变量
shader.setUniformValue("objectColor", 0.0f, 0.5f, 0.2f, 1.0f);

if (USE_VBO)
{
int vertexCount = sizeof(vertices) / (6 * sizeof(float));
m_glfunc->glDrawArrays(GL_TRIANGLES, 0, vertexCount);
}
else//USE_EBO
{
m_glfunc->glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(indices[0]), GL_UNSIGNED_INT, 0);
}
}

1.model_loading.vert

#version 450 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;

out vec3 vertexColor;//输出到片段着色器

void main()
{
gl_Position = vec4(aPos, 1.0);
vertexColor = aColor;// 传递颜色数据
}

1.model_loading.frag

#version 450 core
in vec3 vertexColor; //接收来自顶点着色器的颜色
out vec4 FragColor;

uniform vec4 objectColor; //与CPU端对应的全局uniform变量

void main()
{
// FragColor = vec4(vertexColor, 1.0f);
FragColor = objectColor;
}

[源码下载]