使用qt中的openglWidget绘制一个三角形。自定义的类继承关系sunOpengl : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
代码如下
/*----MainWindow.cpp----------------------------------------------*/
#include "mainwindow.h"
#include "./ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//setCentralWidget(ui->openGLWidget);openGLWidget=new sunOpengl(parent);setCentralWidget(openGLWidget);
}MainWindow::~MainWindow()
{delete ui;
}/*----MainWindow.h----------------------------------------------*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include"sunopengl.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;sunOpengl*openGLWidget;
};
#endif // MAINWINDOW_H
/*-----------------sunopengl.cpp-----------------------*/
#include "sunopengl.h"sunOpengl::sunOpengl(QWidget *parent) {}
unsigned int shaderProgram;
unsigned int VBO,VAO;
float vertices[]={-0.5f,-0.5f,0.0f,0.5f,-0.5f,0.0f,0.0f,0.5f,0.0f,
};const char *vertexShaderSource="#version 330 core\n""layout(location=0) in vec3 aPos;\n""void main()\n""{\n""gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n""}\0";
const char* fragmentShaderSource="#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n""FragColor=vec4(1.0f,0.5f,0.2f,1.0f);\n""}\n\0";
void sunOpengl::initializeGL()
{this->initializeOpenGLFunctions();glGenVertexArrays(1,&VAO);glGenBuffers(1,&VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER,VBO);//将数据传入显存glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);//显卡解析参数glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(GLvoid*)0);//开始VOA属性glEnableVertexAttribArray(0);glBindVertexArray(0);glBindBuffer(GL_ARRAY_BUFFER,0);//编译顶点着色器unsigned int vertexShader=glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader,1,&vertexShaderSource,NULL);glCompileShader(vertexShader);//编译片段着色器unsigned int fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);glCompileShader(fragmentShader);//link shadeshaderProgram=glCreateProgram();glAttachShader(shaderProgram,vertexShader);glAttachShader(shaderProgram,fragmentShader);glLinkProgram(shaderProgram);glUseProgram(shaderProgram);
}void sunOpengl::resizeGL(int w, int h)
{}void sunOpengl::paintGL()
{glUseProgram(shaderProgram);glClearColor(0.2f,0.3f,0.3f,1.0f);glClear(GL_COLOR_BUFFER_BIT);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES,0,3);glBindVertexArray(0);}
//定点着色器-》几何着色-》图元装配-》光栅化-》片段着色器-》测试与混合/*-----------------sunopengl.h-----------------------*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include"sunopengl.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;sunOpengl*openGLWidget;
};
#endif // MAINWINDOW_H
运行效果