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]

浙公网安备 33010602011771号