一、 项目目录
二、 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 MAINWIDGET_H
#define MAINWIDGET_H
#include "MyGLWidget.h"
#include <QWidget>
class MainWidget : public QWidget
{
Q_OBJECT
public:
MainWidget(QWidget *parent = nullptr);
~MainWidget();
private:
MyGLWidget *glWidgets[2][3];
};
#endif // MAINWIDGET_H
mainwindow.cpp
#include "mainwidget.h"
#include <QGridLayout>
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
{
QGridLayout *mainLayout = new QGridLayout;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
MyGLWidget *pMyGLWidget = new MyGLWidget(this);
pMyGLWidget->SetId(i*3+j);
glWidgets[i][j] =pMyGLWidget;
mainLayout->addWidget(pMyGLWidget, i, j);
}
}
setLayout(mainLayout);
//设置窗口大小
this->resize(900,600);
}
MainWidget::~MainWidget()
{
}
四、 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);
void SetId(int id);
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
signals:
private:
int id;
QOpenGLFunctions_3_3_Core *core;
GLuint positionVBO;
GLuint VAO,EBO;
QOpenGLShaderProgram shaderProgram;
};
#endif // MYGLWIDGET_H
myglwidget.cpp
#include "myglwidget.h"
MyGLWidget::MyGLWidget(QWidget *parent)
: QOpenGLWidget{parent}
{
}
void MyGLWidget::SetId(int id)
{
this->id = id;
}
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.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
};
GLuint indices[] = {
0,1,3,
1,2,3
};
core->glGenVertexArrays(1,&VAO);
core->glBindVertexArray(VAO);
//顶点数据传入显存
core->glGenBuffers(1,&positionVBO);
core->glBindBuffer(GL_ARRAY_BUFFER,positionVBO);
core->glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
core->glVertexAttribPointer(0, 3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),(void*)0);
core->glEnableVertexAttribArray(0);
//顶点索引
core->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
core->glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
//解绑
core->glBindVertexArray(0);
core->glBindBuffer(GL_ARRAY_BUFFER,0);
core->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
//=============================================================================================================
//着色器程序
QOpenGLShader vertexShader(QOpenGLShader::Vertex);
vertexShader.compileSourceFile(":/shader/shader/transform.vert");
QOpenGLShader fragmentShader(QOpenGLShader::Fragment);
fragmentShader.compileSourceFile(":/shader/shader/transform.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();
QMatrix4x4 mat;
if(id == 0)
{
//放大1.5倍
mat.scale(1.5);
}else if(id == 1)
{
//平移
mat.translate(0.5f,0.5f,0.0f);
}else if(id == 2)
{
//旋转45度
mat.rotate(45.0f,QVector3D(0.0f,0.0f,1.0f));
}else if(id == 3)
{
//旋转
mat.rotate(30.0f,QVector3D(1.0f,1.0f,0.0f));
}else if(id == 4)
{
}else if(id == 5)
{
}
GLuint location = shaderProgram.uniformLocation("transform");
shaderProgram.setUniformValue(location,mat);
//绘制
core->glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
//解绑定VAO
core->glBindVertexArray(0);
update();
}
五、 shader
transform.vert
#version 330 core
layout (location = 0) in vec3 aPos;
uniform mat4 transform = mat4(1.0f);
void main()
{
gl_Position = transform * vec4(aPos.x,aPos.y,aPos.z,1.0);
}
transform.frag
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(0.9f,0.5f,0.1f,1.0f);;
}