C++入门 QT+openGL绘制简单三角形

一、 项目目录

在这里插入图片描述

二、 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 MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>

class MainWindow : public QWidget
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

#include <QGridLayout>

#include "myglwidget.h"

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *pGridLayout = new QGridLayout();


    MyGLWidget *pMyGLWidget = new MyGLWidget();

    pGridLayout->addWidget(pMyGLWidget);

    this->setLayout(pGridLayout);

    //设置窗口大小
    this->resize(800,600);
}

MainWindow::~MainWindow()
{
}

四、 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);


protected:
    virtual void initializeGL();            //锟斤拷始锟斤拷
    virtual void resizeGL(int w, int h);
    virtual void paintGL();


signals:


private:
    QOpenGLFunctions_3_3_Core *core;
    GLuint VBO,VAO;
    QOpenGLShaderProgram shaderProgram;

};

#endif // MYGLWIDGET_H


myglwidget.cpp

#include "myglwidget.h"

MyGLWidget::MyGLWidget(QWidget *parent)
    : QOpenGLWidget{parent}
{

}


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.0f,   0.5f,   0.0f
    };

    //顶点缓冲区对象VBO
    //VBO代表了显卡缓存中的地址

    //创建VAO
    core->glGenVertexArrays(1,&VAO);
    core->glBindVertexArray(VAO);
    //后续所有和GL_ARRAY_BUFFER有关系的操作状态,都会被记录

    //创建VBO
    core->glGenBuffers(1,&VBO);

    //绑定缓冲对象
    core->glBindBuffer(GL_ARRAY_BUFFER,VBO);

    //内存数据=》显存
    //GL_STATIC_DRAW表示数据基本不会改变,指定了我们希望显卡如何管理给定数据
    core->glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

    //VBO属性配置
    //0对应着色器中的location,一般大小为16个
    //3对应顶点属性的大小,三个GL_FLOAT 为一组对应一个顶点
    //GL_FLOAT数据类型
    //GL_FALSE表示是否希望数据被标准化,输入数据在[-1,1]之间,无需标准化
    //3*sizeof(GLfloat)顶点数据的步长
    //(void*)0表示偏移地址,坐标数据可能不放在顶点属性的首部
    core->glVertexAttribPointer(0, 3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),(void*)0);
    //让着色器能够访问VBO对应数据
    core->glEnableVertexAttribArray(0);

    //绑定空缓冲区(先解绑定VAO)
    core->glBindVertexArray(0);
    core->glBindBuffer(GL_ARRAY_BUFFER,VBO);


    //=============================================================================================================
    //着色器程序

    QOpenGLShader vertexShader(QOpenGLShader::Vertex);
    vertexShader.compileSourceFile(":/res/shader/triangle.vert");
    QOpenGLShader fragmentShader(QOpenGLShader::Fragment);
    fragmentShader.compileSourceFile(":/res/shader/triangle.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();

    //0:起始位置
    //3:使用点数
    core->glDrawArrays(GL_TRIANGLES,0,3);

    //解绑定VAO
    core->glBindVertexArray(0);
}



五、 shader

triangle.vert

#version 330 core
layout (location = 0) in vec3 aPos;

void main()
{
    gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0);
}

triangle.frag

#version 330 core
out vec4 FragColor;

void main()
{
    FragColor = vec4(0.5f,0.5f,0.7f,1.0f);
}

六、图形输出

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值