随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

QT+OpenGL创建一个三角形并动态改变三角形颜色

QT+OpenGL基础:

  1. QT+OpenGL创建一个三角形并动态改变三角形颜色
  2. OpenGL中的VAO、VBO、EBO
  3. QT+OpenGL 使用VAO、VBO、EBO结合绘制一个正方形
  4. QT+OpenGL使用一组顶点绘制两个三角形
  5. QT+OpenGL通过两个VAO来管理两个三角形
  6. QT+Opengl使用两个Shader绘制两个不同颜色的三角形
  7. QT+OpenGL从顶点着色器传递颜色数据给片元着色器
  8. QT+OpenGL简单纹理贴图
  9. QT+OpenGL纹理与颜色混合
  10. Qt+OpenGL混合两个纹理,并可以改变纹理透明度

 

一、概述

  需求:

    1.使用QT+OpenGL创建一个三角形

    2.默认三角形为黑色

    3.可以通过点击按钮改变三角形颜色值(红绿蓝)

    4.如下图所示

    ps:这一篇用的是QT封装好的opengl相关帮助类,下一篇会用原生的来写。

    

 

二、代码示例

  1.让窗口继承QOpenGLWidget、QOpenGLFunctions、并重写initializeGL()、resizeGL(w,h)、paintGL()

复制代码
class GLTriangleWindow : public QOpenGLWidget,protected QOpenGLFunctions
{
    Q_OBJECT

public:
    GLTriangleWindow(QWidget* parent = nullptr);
    ~GLTriangleWindow();
    
protected:
    virtual void initializeGL();//初始化OpenGL
    virtual void resizeGL(int w, int h);//ResizeWindow大小
    virtual void paintGL();//绘制OpenGL
复制代码

 

  2.使用QT创建一个窗口并放置三个QPushButton,并给QPushButton设置点击事件(信号槽)

复制代码
this->resize(QSize(480, 480));
this->setWindowTitle("三角形");
this->setWindowIcon(QIcon("images/opencv.png"));
QHBoxLayout* hLayout = new QHBoxLayout(this);
QPushButton* btnRed = new QPushButton(this);
btnRed->setText("红色");
QPushButton* btnGreen = new QPushButton(this);
btnGreen->setText("绿色");
QPushButton* btnBlue = new QPushButton(this);
btnBlue->setText("蓝色");
hLayout->addWidget(btnRed);
hLayout->addWidget(btnGreen);
hLayout->addWidget(btnBlue);
hLayout->setAlignment(Qt::AlignTop);

connect(btnRed, &QPushButton::clicked, [=]() {
    changeTriangleColor(RED);
    });

connect(btnGreen, &QPushButton::clicked, [=]() {
    changeTriangleColor(GREEN);
    });

connect(btnBlue, &QPushButton::clicked, [=]() {
    changeTriangleColor(BLUE);
    });
复制代码

  3.

复制代码
void GLTriangleWindow::initializeGL() {
    initializeOpenGLFunctions();

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);//设置清屏颜色为红色
    glClear(GL_COLOR_BUFFER_BIT);

    //第一个
    shaderProgram.create();
    shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/QtForOpenCV4Tool/shader/triangle.vert");
    shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/QtForOpenCV4Tool/shader/triangle.frag");
    shaderProgram.link();

    //第二个
    shaderProgram2.create();
    shaderProgram2.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/QtForOpenCV4Tool/shader/triangle.vert");
    shaderProgram2.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/QtForOpenCV4Tool/shader/triangle.frag");
    shaderProgram2.link();

    //开启着色器属性pos属性
    shaderProgram.enableAttributeArray("pos");
    shaderProgram2.enableAttributeArray("pos");
}


void GLTriangleWindow::resizeGL(int w, int h) {
    glViewport(0, 0, w, h);
}
void GLTriangleWindow::paintGL() {
    shaderProgram.bind();
    //设置三角形的顶点
    GLfloat vertices[] = {
        0.0f, 0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
    };
    //设置顶点数据的来源
    shaderProgram.setAttributeArray("pos", vertices, 3);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    //绘制第二个三角形
    shaderProgram2.bind();
    //设置三角形的顶点
    GLfloat vertices2[] = {
        0.5f, -0.5f, 0.0f,
        0.5f, -1.0f, 0.0f,
        1.0f, -0.5f, 0.0f,
    };
    //设置顶点数据的来源
    shaderProgram2.setAttributeArray("pos", vertices2, 3);
    glDrawArrays(GL_TRIANGLES, 0, 3);

}
void GLTriangleWindow::changeTriangleColor(TriColor mColor) {
    //makeCurrent();
    switch (mColor) {
    case RED:
        shaderProgram.bind();
        shaderProgram.setUniformValue("ourColor", 1.0f, 0.0f, 0.0f, 1.0f);
        shaderProgram2.bind();
        shaderProgram2.setUniformValue("ourColor", 1.0f, 0.0f, 0.0f, 1.0f);
        break;
    case GREEN:
        shaderProgram.bind();
        shaderProgram.setUniformValue("ourColor", 0.0f, 1.0f, 0.0f, 1.0f);
        shaderProgram2.bind();
        shaderProgram2.setUniformValue("ourColor", 0.0f, 1.0f, 0.0f, 1.0f);
        break;
    case BLUE:
        shaderProgram.bind();
        shaderProgram.setUniformValue("ourColor", 0.0f, 0.0f, 1.0f, 1.0f);
        shaderProgram2.bind();
        shaderProgram2.setUniformValue("ourColor", 0.0f, 0.0f, 1.0f, 1.0f);
        break;
    }
    glDrawArrays(GL_TRIANGLES, 0, 3);
    update();//opengl的渲染流程是一个巨大的状态机。这里调用update,会更新状态机
    //doneCurrent();
}
复制代码

 

posted on   飘杨......  阅读(113)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2023-08-21 EventBus源码再分析
2013-08-21 Android 导入工程文件引用包出错
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示