一、 项目目录
二、 main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
三、 MainWindow类
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include <QGridLayout>
#include "myglwidget.h"
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
QGridLayout *pGridLayout = new QGridLayout();
MyGLWidget *pMyGLWidget = new MyGLWidget();
pGridLayout->addWidget(pMyGLWidget);
this->setLayout(pGridLayout);
//设置窗口大小
this->resize(800,600);
}
MainWindow::~MainWindow()
{
}
四、 MyGLWidget类
myglwidget.h
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
class MyGLWidget : public QOpenGLWidget
{
Q_OBJECT
public:
explicit MyGLWidget(QWidget *parent = nullptr);
protected:
virtual void initializeGL(); //锟斤拷始锟斤拷
virtual void resizeGL(int w, int h);
virtual void paintGL();
signals:
private:
QOpenGLFunctions_3_3_Core *core;
GLuint VBO,VAO;
QOpenGLShaderProgram shaderProgram;
};
#endif // MYGLWIDGET_H
myglwidget.cpp
#include "myglwidget.h"
MyGLWidget::MyGLWidget(QWidget *parent)
: QOpenGLWidget{parent}
{
}
void MyGLWidget::initializeGL()
{
core = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_3_3_Core>();
//顶点数据
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
//顶点缓冲区对象VBO
//VBO代表了显卡缓存中的地址
//创建VAO
core->glGenVertexArrays(1,&VAO);
core->glBindVertexArray(VAO);
//后续所有和GL_ARRAY_BUFFER有关系的操作状态,都会被记录
//创建VBO
core->glGenBuffers(1,&VBO);
//绑定缓冲对象
core->glBindBuffer(GL_ARRAY_BUFFER,VBO);
//内存数据=》显存
//GL_STATIC_DRAW表示数据基本不会改变,指定了我们希望显卡如何管理给定数据
core->glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
//VBO属性配置
//0对应着色器中的location,一般大小为16个
//3对应顶点属性的大小,三个GL_FLOAT 为一组对应一个顶点
//GL_FLOAT数据类型
//GL_FALSE表示是否希望数据被标准化,输入数据在[-1,1]之间,无需标准化
//3*sizeof(GLfloat)顶点数据的步长
//(void*)0表示偏移地址,坐标数据可能不放在顶点属性的首部
core->glVertexAttribPointer(0, 3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),(void*)0);
//让着色器能够访问VBO对应数据
core->glEnableVertexAttribArray(0);
//绑定空缓冲区(先解绑定VAO)
core->glBindVertexArray(0);
core->glBindBuffer(GL_ARRAY_BUFFER,VBO);
//=============================================================================================================
//着色器程序
QOpenGLShader vertexShader(QOpenGLShader::Vertex);
vertexShader.compileSourceFile(":/res/shader/triangle.vert");
QOpenGLShader fragmentShader(QOpenGLShader::Fragment);
fragmentShader.compileSourceFile(":/res/shader/triangle.frag");
shaderProgram.addShader(&vertexShader);
shaderProgram.addShader(&fragmentShader);
shaderProgram.link();
}
void MyGLWidget::resizeGL(int w, int h)
{
}
void MyGLWidget::paintGL()
{
core->glClearColor(0.7f,0.2f,0.6f,1.0f);
core->glClear(GL_COLOR_BUFFER_BIT);
//绑定VAO
core->glBindVertexArray(VAO);
//绑定shader程序
shaderProgram.bind();
//0:起始位置
//3:使用点数
core->glDrawArrays(GL_TRIANGLES,0,3);
//解绑定VAO
core->glBindVertexArray(0);
}
五、 shader
triangle.vert
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0);
}
triangle.frag
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(0.5f,0.5f,0.7f,1.0f);
}