欢迎访问宙启技术站
智能推送

在QOpenGLWidget()中使用着色器程序

发布时间:2024-01-02 10:09:17

QOpenGLWidget是一个用于在Qt中使用OpenGL的小部件。它提供了一个基本的OpenGL环境,可以在其中使用着色器程序来绘制图形。

下面是一个在QOpenGLWidget中使用着色器程序的简单示例:

1. 首先,创建一个新的Qt项目,并在项目的主窗口中添加一个QOpenGLWidget。将其命名为MyGLWidget,并在.ui文件中配置。

2. 在MyGLWidget类的头文件中,添加必要的头文件和成员变量:

#include <QOpenGLWidget>
#include <QOpenGLFunctions>

class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT

public:
    explicit MyGLWidget(QWidget *parent = nullptr);

protected:
    void initializeGL() override;
    void paintGL() override;

private:
    GLuint m_programId; // 着色器程序的ID

    // 着色器代码
    const char *m_vertexShaderSource =
        "#version 330 core
"
        "layout (location = 0) in vec3 aPos;
"
        "void main()
"
        "{
"
        "   gl_Position = vec4(aPos, 1.0);
"
        "}\0";
    const char *m_fragmentShaderSource =
        "#version 330 core
"
        "out vec4 FragColor;
"
        "void main()
"
        "{
"
        "   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
"
        "}
\0";
};

3. 在MyGLWidget类的源文件中,实现initializeGL()和paintGL()函数:

#include "myglwidget.h"
#include <QOpenGLShaderProgram>
#include <QOpenGLShader>

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

void MyGLWidget::initializeGL()
{
    initializeOpenGLFunctions();

    // 创建着色器程序
    QOpenGLShaderProgram program;
    program.addShaderFromSourceCode(QOpenGLShader::Vertex, m_vertexShaderSource);
    program.addShaderFromSourceCode(QOpenGLShader::Fragment, m_fragmentShaderSource);
    program.link();
    m_programId = program.programId();
}

void MyGLWidget::paintGL()
{
    // 使用着色器程序
    glUseProgram(m_programId);

    // 清理屏幕
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    // 绘制一个三角形
    GLfloat vertices[] = {
         0.0f,  0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
         0.5f, -0.5f, 0.0f
    };
    GLuint VBO;
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDeleteBuffers(1, &VBO);
}

在此示例中,initializeGL()函数初始化OpenGL环境,并创建了一个着色器程序。paintGL()函数使用着色器程序来绘制一个简单的三角形。

需要注意的是,此示例假设你已经熟悉OpenGL的基本概念和API。如果你对OpenGL还不够了解,建议先学习一些OpenGL的基础知识。

希望这个简单的示例能够帮助你在QOpenGLWidget中使用着色器程序。如果有任何问题,请随时向我提问。