LINUX环境下QT5.9+OPENGL绘制图形与渲染入门(三)
1.修改.pro文件
QT += opengl
2.修改.h文件
#ifndef PAINTINGWIDGET_H
#define PAINTINGWIDGET_H
#include <QOpenGLWidget>
#include <QOpenGLContext>
#include <QOpenGLBuffer>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
class PaintingWidget : public QOpenGLWidget
{
Q_OBJECT
public:
PaintingWidget(QWidget *parent = nullptr);
~PaintingWidget();
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
private:
QOpenGLBuffer *m_vbo; // 存储点数据
QOpenGLVertexArrayObject *m_vao; // VAO对象
QOpenGLShaderProgram *m_shader; // 渲染器程序对象
};
#endif // PAINTINGWIDGET_H
3.修改.cpp文件
#include “paintingwidget.h”
static const char* VERTEX_SHADER_CODE =
“#version 330 \n”
“layout(location = 0) in vec3 posVertex;\n”
“void main() {\n”
" gl_Position = vec4(posVertex, 1.0f);\n"
“}\n”;
static const char* FRAGMENT_SHADER_CODE =
“#version 330\n”
“out vec4 fragColor;\n”
“void main() {\n”
" fragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
“}\n”;
PaintingWidget::PaintingWidget(QWidget *parent)
: QOpenGLWidget(parent), m_vbo(nullptr), m_vao(nullptr), m_shader(nullptr)
{
}
PaintingWidget::~PaintingWidget()
{
}
4.修改.cpp函数
void PaintingWidget::initializeGL()
{
m_shader = new QOpenGLShaderProgram();
m_shader->addShaderFromSourceCode(QOpenGLShader::Vertex, VERTEX_SHADER_CODE);
m_shader->addShaderFromSourceCode(QOpenGLShader::Fragment, FRAGMENT_SHADER_CODE);
if (m_shader->link()) {
qDebug(“Shaders link success.”);
}
else {
qDebug(“Shaders link failed!”);
}
m_vao = new QOpenGLVertexArrayObject();
m_vbo = new QOpenGLBuffer(QOpenGLBuffer::Type::VertexBuffer);
m_vao->create();
m_vao->bind();
static const GLfloat VERTEX_DATA[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
};
m_vbo->create();
m_vbo->bind();
m_vbo->allocate(VERTEX_DATA, 3*3* sizeof(GLfloat));
QOpenGLFunctions *f = this->context()->functions();
f->glEnableVertexAttribArray(0);
f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), 0);
void glVertexAttribPointer(
GLuint index,
GLint size,
GLenum type,
GLboolean normalized,
GLsizei stride,
const void * pointer);
m_vbo->release();
m_vao->release();
}
void PaintingWidget::paintGL()
{
QOpenGLFunctions *f = this->context()->functions();
f->glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
f->glClearColor(0.0f, 0.2f, 0.0f, 1.0f);
m_vao->bind();
m_shader->bind();
f->glDrawArrays(GL_TRIANGLES, 0, 3);
m_shader->release();
m_vao->release();
}
void glDrawArrays(GLenum mode,
GLint first,
GLsizei count);
void PaintingWidget::resizeGL(int w, int h)
{
Q_UNUSED(w);
Q_UNUSED(h);
}
本篇博客重点在于入门QT+OpenGL,基本图形绘制,避免刚入门同学走许多不必要的大坑,代码全部公开,仅供参考,如有错误请指正。

浙公网安备 33010602011771号