Qt6 opengl引入

1、创建OPenGL视窗

  • 继承 QOpenGLWidget:提供视窗,相当于GLFW

  • 继承 QOpenGLFunctions:提供 initializeOpenGLFunctions() 从驱动获取OpenGL函数指针,相当于GLAD

  • QOpenGLShaderProgram *program_; 成员,存储shader脚本上下文

GLFW 提供跨平台的 OpenGL 渲染视窗。统一管理键盘、鼠标等交互操作
GLAD 提供跨平台的函数加载器,从驱动中加载OpenGL API函数指针

#pragma once

#include <QtOpenGL/qopenglshaderprogram.h>
#include <QtOpenGLWidgets/QOpenGLWidget>
#include <QOpenGLFunctions>

class XVideoWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT

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

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

private:
    // shader脚本上下文,保存传递给OpenGL API的参数
    QOpenGLShaderProgram *program_;

};

2、初始化函数指针和获取Shader对象

void XVideoWidget::initializeGL()
{
    initializeOpenGLFunctions(); // 初始化全局的OpenGL函数指针

    program_ = new QOpenGLShaderProgram(this); // 内部会直接调用全局的OpenGL函数指针
}
graph LR A[QOpenGLWidget] -->|创建| B(OpenGL 上下文) B --> C[QOpenGLFunctions] C -->|加载| D(glCreateProgram, glLinkProgram...) E[QOpenGLShaderProgram] -->|调用| D E -->|封装| F(Shader 管理接口) C -->|提供| G(用户调用的 OpenGL API)

3、编写shader程序

#include "xvideowidget.h"
#include <QOpenGLShaderProgram>

// 顶点着色器(直接输出顶点位置和固定颜色)
const char* vertexShader = R"(
    void main() {
        gl_Position = vec4(0.0, 0.0, 0.0, 1.0); 
    }
)";

// 片段着色器(输出红色)
const char* fragmentShader = R"(
    void main() {
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 纯红色
    }
)";

4、编译与链接OpenGL

编译:program_.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader);
链接: program_.link(); 多个着色器合并为一个,初始化是执行一次即可。
激活:program_.bind(); 将程序设为GPU活动程序,供其渲染时调用

void XVideoWidget::initializeGL() {
    initializeOpenGLFunctions(); // 关键:初始化OpenGL函数指针
    
    // 编译着色器
    program_.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShader);
    program_.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShader);
    program_.link(); // 链接着色器程序,将编译好的 ​顶点着色器​ 和 ​片段着色器​ 合并成一个完整的着色器程序。
}

void XVideoWidget::paintGL() {
    glClear(GL_COLOR_BUFFER_BIT); // 清屏(默认黑色)
    
    program_.bind(); // 将链接好的着色器程序设置为当前 GPU 的 ​活动程序,后续的渲染操作(如 glDrawArrays)会使用该程序。
    
    glDrawArrays(GL_TRIANGLES, 0, 3); // 绘制三角形(虽然数据未定义,但演示流程)
    program_.release();
}
graph TD A[initializeGL] --> B[initializeOpenGLFunctions] B --> C[program_->addShaderFromSourceCode] C --> D[program_->link] D --> E[paintGL] E --> F[program_->bind] F --> G[glDrawArrays] G --> H[program_->release]
posted @ 2025-07-25 18:43  丘狸尾  阅读(50)  评论(0)    收藏  举报