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 MAINWIDGET_H
#define MAINWIDGET_H

#include "MyGLWidget.h"

#include <QWidget>

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();


private:
    MyGLWidget *glWidgets[2][3];
};
#endif // MAINWIDGET_H


mainwindow.cpp

#include "mainwidget.h"

#include <QGridLayout>

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *mainLayout = new QGridLayout;

    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            MyGLWidget *pMyGLWidget = new MyGLWidget(this);
            pMyGLWidget->SetId(i*3+j);
            glWidgets[i][j] =pMyGLWidget;
            mainLayout->addWidget(pMyGLWidget, i, j);
        }
    }
    setLayout(mainLayout);

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

MainWidget::~MainWidget()
{
}



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

    void SetId(int id);

protected:
    void initializeGL();
    void resizeGL(int w, int h);
    void paintGL();

signals:

private:
    int id;

    QOpenGLFunctions_3_3_Core *core;
    GLuint positionVBO;
    GLuint VAO,EBO;
    QOpenGLShaderProgram shaderProgram;

};

#endif // MYGLWIDGET_H



myglwidget.cpp


#include "myglwidget.h"

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

}

void MyGLWidget::SetId(int id)
{
    this->id = id;
}

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

    GLuint indices[] = {
        0,1,3,
        1,2,3
    };

    core->glGenVertexArrays(1,&VAO);
    core->glBindVertexArray(VAO);

    //顶点数据传入显存
    core->glGenBuffers(1,&positionVBO);
    core->glBindBuffer(GL_ARRAY_BUFFER,positionVBO);
    core->glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

    core->glVertexAttribPointer(0, 3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),(void*)0);
    core->glEnableVertexAttribArray(0);

    //顶点索引
    core->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);
    core->glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);

    //解绑
    core->glBindVertexArray(0);
    core->glBindBuffer(GL_ARRAY_BUFFER,0);
    core->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);


    //=============================================================================================================
    //着色器程序
    QOpenGLShader vertexShader(QOpenGLShader::Vertex);
    vertexShader.compileSourceFile(":/shader/shader/transform.vert");
    QOpenGLShader fragmentShader(QOpenGLShader::Fragment);
    fragmentShader.compileSourceFile(":/shader/shader/transform.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();

    QMatrix4x4 mat;

    if(id == 0)
    {
        //放大1.5倍
        mat.scale(1.5);
    }else if(id == 1)
    {
        //平移
        mat.translate(0.5f,0.5f,0.0f);
    }else if(id == 2)
    {
        //旋转45度
        mat.rotate(45.0f,QVector3D(0.0f,0.0f,1.0f));
    }else if(id == 3)
    {
        //旋转
        mat.rotate(30.0f,QVector3D(1.0f,1.0f,0.0f));
    }else if(id == 4)
    {

    }else if(id == 5)
    {

    }
    GLuint location = shaderProgram.uniformLocation("transform");
    shaderProgram.setUniformValue(location,mat);

    //绘制
    core->glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);

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

    update();
}





五、 shader

transform.vert

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

uniform mat4 transform = mat4(1.0f);

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

transform.frag

#version 330 core
out vec4 FragColor;

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

六、图形输出

在这里插入图片描述

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个比较复杂的问题,需要一些基本的OpenGL知识。我会尽量给出一些指导,但是如果你是初学者,可能需要先学习一些OpenGL的基础知识。 首先,你需要一个3D模型,例如一个茶壶。你可以在网上找到一个茶壶模型,或者自己创建一个。然后,你需要使用OpenGL加载模型并将其渲染到屏幕上。 接下来,你需要实现平移旋转缩放。这可以通过矩阵变换来实现。例如,要平移一个物体,你可以使用以下代码: ```c++ glm::mat4 model = glm::mat4(1.0f); // 创建一个单位矩阵 model = glm::translate(model, glm::vec3(2.0f, 0.0f, 0.0f)); // 平移 ``` 这将创建一个单位矩阵,并将其平移2个单位。你可以将这个矩阵传递给OpenGL,以便在渲染时应用该变换。 类似地,你可以使用以下代码来旋转一个物体: ```c++ model = glm::rotate(model, angle, axis); // 旋转 ``` 其中,angle是旋转角度,axis是旋转轴。你可以将这个矩阵传递给OpenGL,以便在渲染时应用该变换。 最后,你可以使用以下代码来缩放一个物体: ```c++ model = glm::scale(model, glm::vec3(0.5f, 0.5f, 0.5f)); // 缩放 ``` 这将创建一个单位矩阵,并将其缩放为原来的一半。你可以将这个矩阵传递给OpenGL,以便在渲染时应用该变换。 最后,你需要添加光照。这可以通过使用OpenGL的光照功能来实现。你需要计算每个顶点的法向量,并将其传递给OpenGL。然后,你需要设置光源的位置和颜色,并将其传递给OpenGLOpenGL会根据这些信息计算每个像素的颜色。 这是一个比较复杂的问题,需要一些OpenGL知识。如果你是初学者,可能需要先学习一些OpenGL的基础知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值