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,基本图形绘制,避免刚入门同学走许多不必要的大坑,代码全部公开,仅供参考,如有错误请指正。

 
 
posted @ 2023-08-24 13:24  铁木2023  阅读(200)  评论(0)    收藏  举报