使用qt5.12中的opengl绘制一个三角形

可以使用Qt的OpenGL库来绘制一个三角形。相比于传统的OpenGL,Qt提供了更为方便和友好的API。

首先我们需要在Qt项目中添加OpenGL的支持,这可以在.pro文件中添加以下语句:

QT += opengl

接着,我们需要在头文件中添加以下内容:

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>

然后,在类的定义中,我们需要继承QOpenGLWidget,并实现initializeGL()resizeGL()paintGL()三个OpenGL函数。initializeGL()函数将会在OpenGL初始化时被调用,通过该函数创建各种OpenGL对象。resizeGL()函数用于处理OpenGL视口的变化,在类的定义中,该函数默认为空。paintGL()函数用于绘制OpenGL场景。

接着,在类的定义中,我们需要定义以下成员变量:

QOpenGLShaderProgram* m_shaderProgram;
QOpenGLBuffer m_vbo;

其中,m_shaderProgram是用于存储着色器程序的指针,m_vbo是OpenGL缓冲区对象。

最后我们在成员函数中实现OpenGL绘制代码即可:

void initializeGL() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    
    m_shaderProgram = new QOpenGLShaderProgram;
    m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, 
            "attribute vec2 a_position;\n"
            "void main() {\n"
            "    gl_Position = vec4(a_position, 0.0, 1.0);\n"
            "}"
    );
    m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, 
            "void main() {\n"
            "    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
            "}"
    );
    m_shaderProgram->link();
​
    QVector<float> vertices {
        0.0f, 0.5f,
        -0.5f, -0.5f,
        0.5f, -0.5f,
    };
    m_vbo.create();
    m_vbo.bind();
    m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(float));
    m_vbo.release();
}
    
void paintGL() {
    glClear(GL_COLOR_BUFFER_BIT);
    m_shaderProgram->bind();
    m_vbo.bind();
    int a_position = m_shaderProgram->attributeLocation("a_position");
    m_shaderProgram->enableAttributeArray(a_position);
    m_shaderProgram->setAttributeBuffer(a_position, GL_FLOAT, 0, 2);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    m_vbo.release();
    m_shaderProgram->release();
    glFlush();
}

在代码中,我们使用了QOpenGLShaderProgram类来存储和设置着色器。在initializeGL()函数中,我们通过该类添加了一个顶点着色器和一个片段着色器。该着色器简单地将三角形的每个顶点的坐标设置到gl_Position中,将片段颜色设置为白色。然后使用QOpenGLBuffer类定义并初始化了缓冲区的三个点坐标。

接着,在paintGL()函数中,我们绑定着色器和缓冲区对象,并配置着色器程序中的a_position属性,将其设置为颜色的数组缓冲区。然后使用glDrawArrays函数来绘制三角形。

下面是完整的示例代码:

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
​
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions {
public:
    GLWidget(QWidget *parent) : QOpenGLWidget(parent) {}
    
protected:
    void initializeGL() {
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        
        m_shaderProgram = new QOpenGLShaderProgram;
        m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, 
                "attribute vec2 a_position;\n"
                "void main() {\n"
                "    gl_Position = vec4(a_position, 0.0, 1.0);\n"
                "}"
        );
        m_shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, 
                "void main() {\n"
                "    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n"
                "}"
        );
        m_shaderProgram->link();
​
        QVector<float> vertices {
            0.0f, 0.5f,
            -0.5f, -0.5f,
            0.5f, -0.5f,
        };
        m_vbo.create();
        m_vbo.bind();
        m_vbo.allocate(vertices.constData(), vertices.size() * sizeof(float));
        m_vbo.release();
    }
    
    void paintGL() {
        glClear(GL_COLOR_BUFFER_BIT);
        m_shaderProgram->bind();
        m_vbo.bind();
        int a_position = m_shaderProgram->attributeLocation("a_position");
        m_shaderProgram->enableAttributeArray(a_position);
        m_shaderProgram->setAttributeBuffer(a_position, GL_FLOAT, 0, 2);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        m_vbo.release();
        m_shaderProgram->release();
        glFlush();
    }
​
private:
    QOpenGLShaderProgram* m_shaderProgram;
    QOpenGLBuffer m_vbo;
};
​
​
#include <QApplication>
#include <QWidget>
#include <QSurfaceFormat>
​
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSurfaceFormat format;
    format.setSamples(4);
    QSurfaceFormat::setDefaultFormat(format);
    QWidget mainWindow;
    mainWindow.resize(640, 480);
​
    GLWidget glWidget(&mainWindow);
    glWidget.setGeometry(0,0,640,480);
​
    mainWindow.show();
​
    return a.exec();
}

运行该程序,将会看到一个黑色背景的白色三角形。

扫描二维码关注公众号,回复: 14956404 查看本文章

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,C++设计模式,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/130352789