Qt5与现代OpenGL学习(二)画一个彩色三角形

mywidget.h

cpp 复制代码
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLVertexArrayObject>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>


class MyWidget : public QOpenGLWidget,protected QOpenGLFunctions
{

    Q_OBJECT

public:
    MyWidget(QWidget* parent=0);
    ~MyWidget();

protected:
    void initializeGL() override;
    void paintGL() override;
    void resizeGL(int width, int height) override;

private:
    QOpenGLShaderProgram* program;
    QOpenGLVertexArrayObject m_vao;
    QOpenGLBuffer m_vbo;

    int m_attr;
    int m_color;

};

mywidget.cpp

cpp 复制代码
#include "mywidget.h"

#include <QDebug>


static GLfloat vertices[] = {//我们所准备的需要提供给openGL的顶点数据
    // 位置              // 颜色
     0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
    -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
     0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部
};



MyWidget::MyWidget(QWidget* parent)
    :QOpenGLWidget(parent)
{

}

MyWidget::~MyWidget()
//建议在析构函数中手动销毁openGL相关的对象,
//文档中特意提到QT的回收机制难以保证回收所有openGL使用的资源
//不销毁的话在关闭程序时可能会出现异常
{
    makeCurrent();
    m_vao.destroy();
    m_vbo.destroy();
    doneCurrent();
}


void MyWidget::initializeGL()
{

    initializeOpenGLFunctions();


    // 创建并绑定着色器程序
    program = new QOpenGLShaderProgram;
    program->bind();
    //向program中添加顶点着色器
    if(!program->addShaderFromSourceFile(QOpenGLShader::Vertex,":/triangle.vert"))
    {
        qDebug()<< (program->log());
        return;
    }
    //向program中添加片段着色器
    if(!program->addShaderFromSourceFile(QOpenGLShader::Fragment,":/triangle.frag"))
    {
        qDebug()<< (program->log());
        return;
    }
    if(!program->link())
    {
        qDebug()<< (program->log());
        return;
    }

    //创建并绑定VAO
    m_vao.create();
    m_vao.bind();

    //创建并绑定VBO
    m_vbo.create();
    m_vbo.bind();
    m_vbo.allocate(vertices, sizeof(vertices));//向VBO传递我们准备好的数据(本文件起始部分的静态数组)

    //向顶点着色器传递其中定义为"aPos"的变量所需的数据
    m_attr=program->attributeLocation("aPos");
    program->setAttributeBuffer(m_attr,GL_FLOAT, 0, 3,6*sizeof(GLfloat));
    program->enableAttributeArray(m_attr);

    //向顶点着色器传递其中定义为"aColor"的变量所需的数据
    m_color=program->attributeLocation("aColor");
    program->setAttributeBuffer(m_color,GL_FLOAT,3*sizeof(GLfloat),3,6*sizeof(GLfloat));
    program->enableAttributeArray(m_color);

    program->release();//解绑程序

}

void MyWidget::paintGL()
{
    //glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    //glClear(GL_COLOR_BUFFER_BIT);


    program->bind();//绑定绘制所要使用的openGL程序
    m_vao.bind();//绑定包含openGL程序所需信息的VAO

    glDrawArrays(GL_TRIANGLES, 0, 3);//绘制
    m_vao.release();//解绑VAO
    program->release();//解绑程序

    //update();//调用update()函数会执行paintGL,现在绘制一个静态的三角形可以不使用
    //也可以用定时器连接update()函数来控制帧率,直接在paintGL函数中调用update()大概是60帧
}

void MyWidget::resizeGL(int width, int height)
{

}

添加资源

点击工程---右键添加---选择QT---选择Qt Resource File--随便搞个名字:

添加资源文件:

triangle.vert

cpp 复制代码
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;

out vec3 ourColor;

void main()
{
	ourColor = aColor;
	gl_Position =vec4(aPos, 1.0);    
}

triangle.frag

cpp 复制代码
#version 330 core
in vec3 ourColor;
void main()
{
     gl_FragColor = vec4(ourColor,1.0);
}

在mainwindow.ui中,添加QWidget,并提升为:MyWidget

相关推荐
星幻元宇VR18 小时前
公共安全实训展厅设备【人防知识学习系统】
科技·学习·安全
李燚20 小时前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
2zcode20 小时前
免费开源项目文档:基于MATLAB图像处理的啤酒瓶口缺陷检测系统设计与实现
开发语言·图像处理·matlab
人工智能时代 准备好了吗21 小时前
AI回答内容进入率监测:引用识别、文本匹配与语义判断
开发语言·人工智能·python
LONGZETECH21 小时前
新能源汽车动力电池检测仿真教学系统:C/S 分层架构与数字化实训落地全解析
大数据·c语言·开发语言·人工智能·架构·系统架构·汽车
郝学胜-神的一滴21 小时前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
Metaphor69221 小时前
使用 Python 冻结 Excel 文件中的行、列和单元格
开发语言·python·excel
心中有国也有家21 小时前
AtomGit Flutter 鸿蒙客户端:情绪日记的时间线实现
学习·flutter·华为·harmonyos
言乐61 天前
Python实现建造微服务商城后台
开发语言·python·算法·微服务·架构
KobeSacre1 天前
Semaphore 源码
java·开发语言