Qt如何创建OpenGL的渲染窗口?
类比GLFW库,Qt提供了OpenGL的渲染窗口类QOpenGLWidget:
1、重写initializeGL()和resizeGL()函数来设置OpenGL状态并提供透视图转换。
2、重写paintGL()来绘制3D场景,只调用OpenGL函数。
3、还可以使用QPainter将2D图形绘制到QOpenGLWidget子类上。在paintGL()中,不是发出OpenGL命令,而是构建一个用于部件的QPainter对象(注意QPainter没调用OpenGL渲染)。
Qt如何实现OpenGL函数绑定?
类比GLAD库,Qt不直接调用OpenGL函数,而是通过QOpenGLFunctions这一实例来进行函数调用,这种调用方法主要有以下两种:
1、直接从OpenGLContext::functions()中获取
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
2、继承QOpenGLFunctions
class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions{...void initializeGL() override{initializeOpenGLFunctions();glClearColor(...);...}...};
示例代码:
1、创建MyOpenGLWidget.h
#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H#include <QtOpenGLWidgets/QtOpenGLWidgets>class MyOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:MyOpenGLWidget();
protected:void initializeGL() override;void resizeGL(int w, int h) override;void paintGL() override;
};#endif // MYOPENGLWIDGET_H
2、创建MyOpenGLWidget.cpp
#include "myopenglwidget.h"MyOpenGLWidget::MyOpenGLWidget() {//设置上下文属性QSurfaceFormat format;format.setDepthBufferSize(24);format.setStencilBufferSize(8);format.setVersion(3, 3); //OpenGL 版本号3.3format.setProfile(QSurfaceFormat::CoreProfile);// 核心模式this->setFormat(format);
}void MyOpenGLWidget::initializeGL(){//绑定OpenGL函数指针?类似GLAD库的作用?initializeOpenGLFunctions();
}void MyOpenGLWidget::paintGL(){//由于继承了QOpenGLFunctions,可以直接使用OpenGL中的函数glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);
}void MyOpenGLWidget::resizeGL(int w, int h){}
3、调用MyOpenGLWidget类
#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{_myOpenGLWidget = new MyOpenGLWidget;this->setCentralWidget(_myOpenGLWidget);//设置窗口大小this->setGeometry(0,0,800,600);
}MainWindow::~MainWindow() {if(_myOpenGLWidget)delete _myOpenGLWidget;
}